Um vollständig gleichwertig zu sein, hätte die erste Abfrage zunächst geschrieben werden sollen
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
Damit mw.* und nvs.* zusammen dieselbe Menge erzeugen wie der Singular * der 2. Abfrage. Die von Ihnen geschriebene Abfrage kann einen INNER JOIN verwenden, da sie einen Filter für nvs.correct enthält.
Das allgemeine Formular
TABLEA LEFT JOIN TABLEB ON <CONDITION>
attempts
um TableB-Datensätze basierend auf der Bedingung zu finden. Wenn dies fehlschlägt, werden die Ergebnisse von TABLEA beibehalten, wobei alle Spalten von TableB auf NULL gesetzt werden. Im Gegensatz dazu
TABLEA INNER JOIN TABLEB ON <CONDITION>
auch attempts
um TableB-Datensätze basierend auf der Bedingung zu finden. Allerdings , wenn dies fehlschlägt, wird der bestimmte Datensatz aus TableA aus der Ergebnismenge der Ausgabe entfernt.
Der ANSI-Standard für CROSS JOIN erzeugt einen Kartesisches Produkt zwischen den beiden Tabellen.
TABLEA CROSS JOIN TABLEB
-- # or in older syntax, simply using commas
TABLEA, TABLEB
Die Absicht der Syntax ist, dass JEDE Zeile in TABLEA mit JEDER Zeile in TABLEB verbunden wird. 4 Zeilen in A und 3 Zeilen in B erzeugen also 12 Zeilen Ausgabe. Wenn es mit Bedingungen in der WHERE-Klausel gepaart wird, erzeugt es manchmal das gleiche Verhalten des INNER JOIN, da sie dasselbe ausdrücken (Bedingung zwischen A und B => beibehalten oder nicht). Beim Lesen wird die Absicht jedoch viel klarer, wenn Sie INNER JOIN anstelle von Kommas verwenden.
In Bezug auf die Leistung verarbeiten die meisten DBMS einen LEFT-Join schneller als einen INNER JOIN. Die Komma-Notation kann dazu führen, dass Datenbanksysteme die Absicht falsch interpretieren und einen schlechten Abfrageplan produzieren - also ein weiterer Pluspunkt für die SQL92-Notation.
Warum brauchen wir LEFT JOIN? Wenn die Erklärung von LEFT JOIN oben immer noch nicht ausreicht (Datensätze in A ohne Übereinstimmungen in B aufbewahren), dann bedenken Sie, dass Sie, um dasselbe zu erreichen, eine komplexe UNION zwischen zwei Sätzen benötigen würden, die die alte Kommanotation verwenden, um denselben Effekt zu erzielen . Aber wie bereits erwähnt , dies gilt nicht für Ihr Beispiel, bei dem es sich in Wirklichkeit um einen INNER JOIN handelt, der sich hinter einem LEFT JOIN versteckt.
Hinweise:
- Der RIGHT JOIN ist derselbe wie der LEFT, außer dass er mit TABLEB (rechte Seite) statt mit A beginnt.
- RIGHT und LEFT JOINS sind beides OUTER Joins. Das Wort OUTER ist optional, d.h. es kann als
LEFT OUTER JOIN
geschrieben werden . - Die dritte Art von OUTER Join ist FULL OUTER Join, aber das wird hier nicht besprochen.