Przede wszystkim, aby było całkowicie równoważne, pierwsze zapytanie powinno zostać napisane
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
Zatem mw.* i nvs.* razem tworzą ten sam zestaw, co liczba pojedyncza * w drugim zapytaniu. Zapytanie tak, jak napisałeś, może używać INNER JOIN, ponieważ zawiera filtr na nvs.correct.
Ogólna forma
TABLEA LEFT JOIN TABLEB ON <CONDITION>
attempts
aby znaleźć rekordy TableB na podstawie warunku. Jeśli się nie powiedzie, wyniki z tabeli TABLEA są zachowywane, a wszystkie kolumny z tabeli B mają wartość NULL. W przeciwieństwie
TABLEA INNER JOIN TABLEB ON <CONDITION>
także attempts
aby znaleźć rekordy TableB na podstawie warunku. Jednak , gdy się nie powiedzie, konkretny rekord z Tabeli A jest usuwany z wyjściowego zestawu wyników.
Standard ANSI dla CROSS JOIN tworzy Produkt kartezjański między dwoma stołami.
TABLEA CROSS JOIN TABLEB
-- # or in older syntax, simply using commas
TABLEA, TABLEB
Intencją składni jest to, że KAŻDY wiersz w tabeli TABLEA jest połączony z KAŻDY wiersz w tabeli TABLEB. Tak więc 4 rzędy w A i 3 rzędy w B dają 12 rzędów wyjścia. W połączeniu z warunkami w klauzuli WHERE czasami powoduje to samo zachowanie INNER JOIN, ponieważ wyrażają to samo (warunek między A i B => zachowaj lub nie). Jednak podczas czytania intencji jest znacznie jaśniejsze, gdy używasz INNER JOIN zamiast przecinków.
Jeśli chodzi o wydajność, większość DBMS będzie przetwarzać LEFT JOIN szybciej niż INNER JOIN. Notacja przecinkowa może spowodować, że systemy baz danych błędnie zinterpretują intencję i wygenerują zły plan zapytania - więc kolejny plus dla notacji SQL92.
Dlaczego potrzebujemy LEFT JOIN? Jeśli wyjaśnienie LEFT JOIN powyżej nadal nie wystarcza (przechowuj rekordy w A bez dopasowań w B), rozważ, że aby osiągnąć to samo, potrzebujesz złożonej UNION między dwoma zestawami przy użyciu starej notacji przecinkowej, aby osiągnąć ten sam efekt . Ale jak wspomniano wcześniej , nie dotyczy to twojego przykładu, który tak naprawdę jest INNER JOIN ukrytym za LEFT JOIN.
Uwagi:
- PRAWY JOIN jest taki sam jak LEFT, z wyjątkiem tego, że zaczyna się od TABLEB (prawa strona) zamiast A.
- RIGHT i LEFT JOINS są sprzężeniami OUTER. Słowo OUTER jest opcjonalne, tzn. można je zapisać jako
LEFT OUTER JOIN
. - Trzecim typem złączenia OUTER jest złącze FULL OUTER, ale nie jest to tutaj omawiane.