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.