На първо място, за да бъде напълно еквивалентна, първата заявка трябва да бъде написана
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
Така че mw.* и nvs.* заедно произвеждат същия набор като единственото число * на втората заявка. Заявката, както сте написали, може да използва INNER JOIN, тъй като включва филтър на nvs.correct.
Общата форма
TABLEA LEFT JOIN TABLEB ON <CONDITION>
attempts
за да намерите записи TableB въз основа на условието. Ако не успее, резултатите от TABLEA се запазват, като всички колони от TableB са зададени на NULL. За разлика от това
TABLEA INNER JOIN TABLEB ON <CONDITION>
също attempts
за да намерите записи TableB въз основа на условието. Въпреки това , когато не успее, конкретният запис от TableA се премахва от изходния набор от резултати.
Стандартът ANSI за CROSS JOIN създава Картезиански продукт между двете маси.
TABLEA CROSS JOIN TABLEB
-- # or in older syntax, simply using commas
TABLEA, TABLEB
Намерението на синтаксиса е ВСЕКИ ред в TABLEA да се присъедини към ВСЕКИ ред в TABLEB. Така че 4 реда в A и 3 реда в B произвеждат 12 реда изход. Когато се сдвоява с условия в клаузата WHERE, понякога произвежда същото поведение на INNER JOIN, тъй като те изразяват едно и също нещо (условие между A и B => запазване или не). Въпреки това е много по-ясно, когато четете за намерението, когато използвате INNER JOIN вместо запетаи.
По отношение на производителността, повечето СУБД ще обработват LEFT JOIN по-бързо от INNER JOIN. Нотацията със запетая може да накара системите за бази данни да тълкуват погрешно намерението и да произведат лош план за заявка – така че още един плюс за нотацията SQL92.
Защо ни трябва LEFT JOIN? Ако обяснението на LEFT JOIN по-горе все още не е достатъчно (съхранявайте записи в A без съвпадения в B), тогава помислете, че за да постигнете същото, ще ви трябва сложен UNION между два набора, използвайки старата нотация със запетая, за да постигнете същия ефект . Но както беше посочено по-горе , това не се отнася за вашия пример, който всъщност е ВЪТРЕШНО ПРИСЪЕДИНЕНИЕ, което се крие зад ЛЯВО ПРИЕДИНЕНИЕ.
Бележки:
- RIGHT JOIN е същото като LEFT, с изключение на това, че започва с TABLEB (дясна страна) вместо A.
- ДЯСНО и ЛЯВО ПРИСЪЕДИНЕНИ са и двете ВЪНШНИ съединения. Думата OUTER е по избор, т.е. може да бъде написана като
LEFT OUTER JOIN
. - Третият тип OUTER присъединяване е FULL OUTER присъединяване, но това не се обсъжда тук.