sql >> Database teknologi >  >> RDS >> Mysql

Venstre join eller vælg fra flere tabeller ved hjælp af komma (,)

Først og fremmest, for at være fuldstændig ækvivalent, skulle den første forespørgsel være skrevet

   SELECT mw.*, 
          nvs.* 
     FROM mst_words mw 
LEFT JOIN (SELECT *
             FROM vocab_stats 
            WHERE owner = 1111) AS nvs ON mw.no = nvs.vocab_no 
    WHERE (nvs.correct > 0 ) 
      AND mw.level = 1
 

Så at mw.* og nvs.* tilsammen producerer det samme sæt som den 2. forespørgsel's ental *. Forespørgslen, som du har skrevet, kan bruge en INNER JOIN, da den indeholder et filter på nvs.correct.

Den generelle formular

TABLEA LEFT JOIN TABLEB ON <CONDITION>
 

attempts at finde TabelB-poster baseret på tilstanden. Hvis det mislykkes, beholdes resultaterne fra TABLEA, med alle kolonnerne fra TabelB sat til NULL. I modsætning hertil

TABLEA INNER JOIN TABLEB ON <CONDITION>

også attempts at finde TabelB-poster baseret på tilstanden. Men , når det mislykkes, fjernes den pågældende post fra tabel A fra output-resultatsættet.

ANSI-standarden for CROSS JOIN producerer en Kartesisk produkt mellem de to borde.

TABLEA CROSS JOIN TABLEB
  -- # or in older syntax, simply using commas
TABLEA, TABLEB
 

Hensigten med syntaksen er, at HVER række i TABEL er forbundet med HVER række i TABEL. Så 4 rækker i A og 3 rækker i B giver 12 rækker output. Når det parres med betingelser i WHERE-sætningen, producerer det nogle gange den samme adfærd som INNER JOIN, da de udtrykker det samme (betingelse mellem A og B => behold eller ej). Det er dog meget tydeligere, når man læser hensigten, når man bruger INNER JOIN i stedet for kommaer.

Ydelsesmæssigt vil de fleste DBMS behandle en LEFT join hurtigere end en INNER JOIN. Komma-notationen kan få databasesystemer til at misfortolke hensigten og producere en dårlig forespørgselsplan - så endnu et plus for SQL92-notation.

Hvorfor har vi brug for LEFT JOIN? Hvis forklaringen af ​​LEFT JOIN ovenfor stadig ikke er nok (hold registreringer i A uden match i B), så overvej, at for at opnå det samme, vil du have brug for en kompleks UNION mellem to sæt ved hjælp af den gamle kommanotation for at opnå den samme effekt . Men som tidligere nævnt , dette gælder ikke for dit eksempel, som virkelig er en INNER JOIN, der gemmer sig bag en LEFT JOIN.

Bemærkninger:

  • RIGHT JOIN er den samme som LEFT, bortset fra at den starter med TABEL (højre side) i stedet for A.
  • RIGHT og LEFT JOINS er begge OUTER joins. Ordet YDRE er valgfrit, dvs. det kan skrives som LEFT OUTER JOIN .
  • Den tredje type OUTER join er FULL OUTER join, men det diskuteres ikke her.


  1. psql - gem resultater af kommando til en fil

  2. MySQL-syntaks til at indsætte en ny række i midterste rækker?

  3. Hvordan får man tilfældige poster fra hver kategori i MySQL?

  4. mysql Flere fremmednøgler i en tabel til den samme primærnøgle