Tout d'abord, pour être tout à fait équivalent, la première requête aurait dû être écrite
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
Ainsi, mw.* et nvs.* produisent ensemble le même ensemble que le singulier * de la deuxième requête. La requête telle que vous l'avez écrite peut utiliser un INNER JOIN, car elle inclut un filtre sur nvs.correct.
La forme générale
TABLEA LEFT JOIN TABLEB ON <CONDITION>
attempts
pour rechercher des enregistrements TableB en fonction de la condition. En cas d'échec, les résultats de TABLEA sont conservés, toutes les colonnes de TableB étant définies sur NULL. En revanche
TABLEA INNER JOIN TABLEB ON <CONDITION>
aussi attempts
pour rechercher des enregistrements TableB en fonction de la condition. Cependant , en cas d'échec, l'enregistrement particulier de TableA est supprimé du jeu de résultats de sortie.
La norme ANSI pour CROSS JOIN produit un Produit cartésien entre les deux tables.
TABLEA CROSS JOIN TABLEB
-- # or in older syntax, simply using commas
TABLEA, TABLEB
L'intention de la syntaxe est que CHAQUE ligne dans TABLEA est jointe à CHAQUE ligne dans TABLEB. Ainsi, 4 lignes en A et 3 lignes en B produisent 12 lignes de sortie. Lorsqu'il est associé à des conditions dans la clause WHERE, il produit parfois le même comportement que INNER JOIN, car ils expriment la même chose (condition entre A et B => conserver ou non). Cependant, il est beaucoup plus clair lors de la lecture de l'intention lorsque vous utilisez INNER JOIN au lieu de virgules.
En termes de performances, la plupart des SGBD traiteront une jointure LEFT plus rapidement qu'une INNER JOIN. La notation par virgule peut amener les systèmes de base de données à mal interpréter l'intention et produire un mauvais plan de requête - donc un autre avantage pour la notation SQL92.
Pourquoi avons-nous besoin de LEFT JOIN ? Si l'explication de LEFT JOIN ci-dessus n'est toujours pas suffisante (conserver les enregistrements dans A sans correspondance dans B), alors considérez que pour obtenir le même résultat, vous auriez besoin d'un UNION complexe entre deux ensembles en utilisant l'ancienne notation par virgule pour obtenir le même effet . Mais comme indiqué précédemment , cela ne s'applique pas à votre exemple, qui est en réalité un INNER JOIN caché derrière un LEFT JOIN.
Remarques :
- RIGHT JOIN est identique à LEFT, sauf qu'il commence par TABLEB (côté droit) au lieu de A.
- RIGHT et LEFT JOINS sont tous deux des jointures OUTER. Le mot OUTER est facultatif, c'est-à-dire qu'il peut être écrit sous la forme
LEFT OUTER JOIN
. - Le troisième type de jointure OUTER est la jointure FULL OUTER, mais cela n'est pas abordé ici.