Först och främst, för att vara helt likvärdig, borde den första frågan ha skrivits
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å att mw.* och nvs.* tillsammans producerar samma uppsättning som den andra frågans singular *. Frågan som du har skrivit kan använda en INNER JOIN, eftersom den innehåller ett filter på nvs.correct.
Den allmänna blanketten
TABLEA LEFT JOIN TABLEB ON <CONDITION>
attempts
för att hitta TableB-poster baserat på tillståndet. Om det misslyckas behålls resultaten från TABLEA, med alla kolumner från TableB inställda på NULL. Däremot
TABLEA INNER JOIN TABLEB ON <CONDITION>
även attempts
för att hitta TableB-poster baserat på tillståndet. Men , när det misslyckas tas den specifika posten från Tabell A bort från resultatuppsättningen för utdata.
ANSI-standarden för CROSS JOIN producerar en kartesisk produkt mellan de två borden.
TABLEA CROSS JOIN TABLEB
-- # or in older syntax, simply using commas
TABLEA, TABLEB
Avsikten med syntaxen är att VARJE rad i TABELL är sammanfogade med VARJE rad i TABELL. Så 4 rader i A och 3 rader i B ger 12 rader med utdata. När den paras ihop med villkor i WHERE-satsen, ger det ibland samma beteende hos INNER JOIN, eftersom de uttrycker samma sak (villkor mellan A och B => behåll eller inte). Det är dock mycket tydligare när man läser om avsikten när man använder INNER JOIN istället för kommatecken.
Prestandamässigt kommer de flesta DBMS att bearbeta en LEFT join snabbare än en INNER JOIN. Kommanotationen kan få databassystem att misstolka avsikten och skapa en dålig frågeplan - så ytterligare ett plus för SQL92-notation.
Varför behöver vi LEFT JOIN? Om förklaringen av LEFT JOIN ovan fortfarande inte räcker (håll register i A utan matchningar i B), tänk då på att för att uppnå samma sak skulle du behöva en komplex UNION mellan två uppsättningar med den gamla kommanotationen för att uppnå samma effekt . Men som tidigare sagt , detta gäller inte ditt exempel, som egentligen är en INNER JOIN som gömmer sig bakom en LEFT JOIN.
Anmärkningar:
- RIGHT JOIN är samma som LEFT, förutom att den börjar med TABELB (höger sida) istället för A.
- RIGHT och LEFT JOINS är båda OUTTER JOINS. Ordet YTTRE är valfritt, dvs det kan skrivas som
LEFT OUTER JOIN
. - Den tredje typen av OUTER-koppling är FULL OUTER-koppling, men det diskuteras inte här.