Innanzitutto, per essere completamente equivalenti, avrebbe dovuto essere scritta la prima query
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
In modo che mw.* e nvs.* insieme producano lo stesso insieme del singolare * della seconda query. La query come hai scritto può utilizzare un INNER JOIN, poiché include un filtro su nvs.correct.
Il modulo generale
TABLEA LEFT JOIN TABLEB ON <CONDITION>
attempts
per trovare i record TableB in base alla condizione. In caso di errore, i risultati di TABLEA vengono mantenuti, con tutte le colonne di TableB impostate su NULL. Al contrario
TABLEA INNER JOIN TABLEB ON <CONDITION>
anche attempts
per trovare i record TableB in base alla condizione. Tuttavia , in caso di errore, il record particolare di TableA viene rimosso dal set di risultati di output.
Lo standard ANSI per CROSS JOIN produce un Prodotto cartesiano tra i due tavoli.
TABLEA CROSS JOIN TABLEB
-- # or in older syntax, simply using commas
TABLEA, TABLEB
L'intenzione della sintassi è che OGNI riga in TABLEA sia unita a OGNI riga in TABLEB. Quindi 4 righe in A e 3 righe in B producono 12 righe di output. Quando accoppiato con le condizioni nella clausola WHERE, a volte produce lo stesso comportamento dell'INNER JOIN, poiché esprimono la stessa cosa (condizione tra A e B => mantieni o no). Tuttavia, è molto più chiaro quando si legge l'intenzione quando si utilizza INNER JOIN invece delle virgole.
Per quanto riguarda le prestazioni, la maggior parte dei DBMS elaborerà un join LEFT più velocemente di un INNER JOIN. La notazione con virgola può far sì che i sistemi di database interpretino erroneamente l'intenzione e producano un piano di query errato, quindi un altro vantaggio per la notazione SQL92.
Perché abbiamo bisogno di LEFT JOIN? Se la spiegazione di LEFT JOIN sopra non è ancora sufficiente (tieni i record in A senza corrispondenze in B), allora considera che per ottenere lo stesso, avresti bisogno di un'UNIONE complessa tra due insiemi usando la vecchia notazione a virgola per ottenere lo stesso effetto . Ma come affermato in precedenza , questo non si applica al tuo esempio, che in realtà è un INNER JOIN nascosto dietro un LEFT JOIN.
Note:
- Il RIGHT JOIN è lo stesso del LEFT, tranne per il fatto che inizia con TABLEB (lato destro) invece di A.
- RIGHT e LEFT JOINS sono entrambi OUTER join. La parola OUTER è facoltativa, cioè può essere scritta come
LEFT OUTER JOIN
. - Il terzo tipo di join OUTER è il join FULL OUTER, ma non è discusso qui.