Za prvé, aby byl zcela ekvivalentní, první dotaz by měl být napsán
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
Takže mw.* a nvs.* společně vytvoří stejnou sadu jako singulární * ve 2. dotazu. Dotaz, jak jste napsal, může používat INNER JOIN, protože obsahuje filtr na nvs.correct.
Obecná forma
TABLEA LEFT JOIN TABLEB ON <CONDITION>
attempts
najít záznamy TableB na základě podmínky. Pokud selže, výsledky z TABLEA se zachovají, přičemž všechny sloupce z tabulky B budou nastaveny na hodnotu NULL. Naproti tomu
TABLEA INNER JOIN TABLEB ON <CONDITION>
také attempts
najít záznamy TableB na základě podmínky. Nicméně , když selže, je konkrétní záznam z tabulky A odstraněn z výstupní sady výsledků.
Standard ANSI pro CROSS JOIN vytváří Kartézský produkt mezi dvěma tabulkami.
TABLEA CROSS JOIN TABLEB
-- # or in older syntax, simply using commas
TABLEA, TABLEB
Záměrem syntaxe je, aby KAŽDÝ řádek v TABLEA byl spojen s KAŽDÝM řádkem v TABLEB. Takže 4 řádky v A a 3 řádky v B vytvoří 12 řádků výstupu. Při spárování s podmínkami v klauzuli WHERE to někdy vytváří stejné chování INNER JOIN, protože vyjadřují totéž (podmínka mezi A a B => zachovat nebo ne). Při čtení je však mnohem jasnější, pokud jde o záměr, když místo čárek použijete INNER JOIN.
Z hlediska výkonu většina DBMS zpracuje LEVÉ spojení rychleji než INNER JOIN. Čárková notace může způsobit, že databázové systémy nesprávně vyloží záměr a vytvoří špatný plán dotazů – takže další plus pro zápis SQL92.
Proč potřebujeme LEFT JOIN? Pokud výše uvedené vysvětlení LEFT JOIN stále nestačí (uchovávejte záznamy v A bez shod v B), pak zvažte, že k dosažení stejného budete potřebovat komplexní UNION mezi dvěma sadami pomocí staré čárkové notace, abyste dosáhli stejného efektu. . Ale jak již bylo uvedeno , to se netýká vašeho příkladu, který je ve skutečnosti INNER JOIN skrývající se za LEFT JOIN.
Poznámky:
- RIGHT JOIN je stejný jako LEFT, až na to, že začíná TABLEB (pravá strana) místo A.
- PRAVÉ a LEVÉ SPOJE jsou obě VNĚJŠÍ připojení. Slovo OUTER je nepovinné, tj. může být zapsáno jako
LEFT OUTER JOIN
. - Třetím typem VNĚJŠÍHO spojení je ÚPLNÉ VNĚJŠÍ spojení, ale o tom zde není řeč.