INNER JOIN zwraca tylko te rekordy, dla których znaleziono dopasowanie w obu łączonych tabelach według określonego warunku. Przy użyciu OUTER JOIN (LEFT, RIGHT, FULL) wynik zawiera wszystkie wiersze z jednej lub obu tabel, nawet jeśli w drugiej tabeli nie ma dopasowania.
Kiedy który JOIN używać:
Przykłady:
-- INNER JOIN SELECT u.id, u.name, o.amount FROM users u INNER JOIN orders o ON u.id = o.user_id; -- LEFT OUTER JOIN SELECT u.id, u.name, o.amount FROM users u LEFT JOIN orders o ON u.id = o.user_id; -- FULL OUTER JOIN SELECT u.id, o.order_id FROM users u FULL OUTER JOIN orders o ON u.id = o.user_id;
Jaki wynik da LEFT JOIN, jeśli prawa tabela jest pusta?
Często odpowiadają: "LEFT JOIN zwróci pusty wynik, ponieważ nie ma dopasowań". Prawidłowo: LEFT JOIN w każdym przypadku zwróci wszystkie wiersze z lewej tabeli, a kolumny z prawej będą NULL.
Przykład:
-- Tabela users ma rekordy, orders jest pusta SELECT u.id, u.name, o.amount FROM users u LEFT JOIN orders o ON u.id=o.user_id; -- Wynik: wszyscy użytkownicy, o.amount = NULL
Historia
Projekt analityki sprzedaży. Aby uzyskać pełną listę klientów i ich zamówień użyto INNER JOIN, pomijając klientów, którzy nie mieli zamówień. W raporcie stracono "ważnych" klientów z powodu ich braku w prawej tabeli. Rozwiązanie: użycie LEFT JOIN.
Historia
Platforma ewidencji pracowników i działów. Użycie RIGHT JOIN zamiast LEFT JOIN prowadziło do zamieszania przy dodawaniu nowych działów: niektórzy pracownicy przestali być uwzględniani w raporcie. Przyczyna — pomyłka w kolejności łączenia.
Historia
Migracja schematu danych. Po zmianach jedno z JOIN'ów stało się CROSS JOIN z powodu literówki w warunku łączenia. Efekt — gwałtowny wzrost objętości zapytania i "rozdmuchanie" danych. Wnioski: zawsze podawaj ON przy połączeniach i dokładnie sprawdzaj typ JOIN.