LEFT/RIGHT JOIN i złączenia OUTER
Używaj LEFT JOIN, aby zachować niedopasowane wiersze, poznaj złączenia RIGHT i FULL OUTER oraz wykrywaj brakujące dane za pomocą WHERE x IS NULL.
LEFT/RIGHT JOIN i złączenia OUTER to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.
LEFT JOIN: zachowanie wszystkich wierszy z lewej tabeli
LEFT JOIN zwraca każdy wiersz z lewej tabeli, wraz z pasującymi kolumnami z prawej tabeli albo z wartościami NULL, gdy nie ma dopasowania.
SELECT u.id, u.email, o.id AS order_id
FROM users u
LEFT JOIN orders o ON o.user_id = u.id;
-- Users without orders still appear, with order_id = NULL.RIGHT JOIN
Odpowiednik LEFT JOIN — zachowuje wszystkie wiersze z PRAWEJ tabeli. Większość osób po prostu przepisuje złączenia RIGHT jako LEFT, aby zwiększyć czytelność:
SELECT u.id, u.email, o.id
FROM orders o
RIGHT JOIN users u ON u.id = o.user_id;
-- Equivalent to LEFT JOIN with sides swapped:
SELECT u.id, u.email, o.id
FROM users u
LEFT JOIN orders o ON o.user_id = u.id;FULL OUTER JOIN
Zachowuje wiersze z obu stron. Niedopasowane kolumny przyjmują wartość NULL:
SELECT u.email, o.id AS order_id
FROM users u
FULL OUTER JOIN orders o ON o.user_id = u.id;Znajdowanie brakujących dopasowań
LEFT JOIN z warunkiem WHERE right.id IS NULL znajduje wiersze z lewej tabeli, które nie mają dopasowania po prawej stronie — jest to klasyczne „anti-join”:
SELECT u.id, u.email
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.id IS NULL; -- users who have never placed an orderLEFT JOIN z agregacją
Przydatne w raportach, w których brak danych ma oznaczać „0”:
SELECT u.id, u.email, COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.id, u.email
ORDER BY order_count DESC;Położenie filtra ma znaczenie
Filtry dotyczące prawej tabeli umieszczone w WHERE zmieniają LEFT JOIN z powrotem w INNER JOIN. Należy umieścić je w ON, aby zachować działanie LEFT JOIN:
-- Drops users without paid orders entirely:
SELECT u.id, COUNT(o.id)
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.status = 'paid'
GROUP BY u.id;
-- Keeps users with no paid orders:
SELECT u.id, COUNT(o.id)
FROM users u
LEFT JOIN orders o
ON o.user_id = u.id AND o.status = 'paid'
GROUP BY u.id;Wiele złączeń LEFT JOIN
Należy łączyć je łańcuchowo. Każde LEFT JOIN zachowuje wiersze znajdujące się po lewej stronie danego operatora:
SELECT u.email, o.id, p.name
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
LEFT JOIN products p ON p.id = o.product_id;Wydajność LEFT JOIN
LEFT JOIN wiąże się z niewielkim narzutem w porównaniu z INNER JOIN (planer musi zachować niedopasowane wiersze). Zwykle jest on pomijalny — ale jeśli niedopasowane wiersze nie są potrzebne, INNER JOIN jest nieco tańsze.
Złączenie zewnętrzne i wynik NULL
Wynik NULL z LEFT JOIN może zaskoczyć kod korzystający z danych. Za pomocą COALESCE można podać wartości domyślne:
SELECT u.email, COALESCE(SUM(o.total), 0) AS revenue
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.email;CROSS JOIN — gdy potrzebne są wszystkie pary
Łączy każdy wiersz A z każdym wierszem B. Należy używać go oszczędnie:
SELECT d.date, u.id
FROM users u
CROSS JOIN generate_series('2024-01-01', '2024-01-07', INTERVAL '1 day') AS d(date);Wzorce anti-join
Trzy idiomatyczne sposoby znajdowania elementów „z lewej strony bez dopasowania”:
-- LEFT JOIN ... WHERE IS NULL
SELECT u.* FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.id IS NULL;
-- NOT EXISTS (often the planner's favourite)
SELECT u.* FROM users u
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);Podsumowanie
Złączenia ZEWNĘTRZNE zachowują niedopasowane wiersze.
- LEFT = wszystkie wiersze z lewej strony, NULL po prawej stronie w przypadku braku dopasowania
- RIGHT = odwrotność; dla czytelności należy używać LEFT
- FULL OUTER = obie strony
- Anti-join = LEFT JOIN ... WHERE right IS NULL
Szybkie sprawdzenie
Jaki typ JOIN zwraca użytkowników nawet wtedy, gdy NIE mają żadnych zamówień?
Ucz się SQL dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 46
- Lekcje
- 183
Często zadawane pytania
Czy lekcja „LEFT/RIGHT JOIN i złączenia OUTER” jest bezpłatna?
Tak — pełny tekst „LEFT/RIGHT JOIN i złączenia OUTER” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „LEFT/RIGHT JOIN i złączenia OUTER”?
Używaj LEFT JOIN, aby zachować niedopasowane wiersze, poznaj złączenia RIGHT i FULL OUTER oraz wykrywaj brakujące dane za pomocą WHERE x IS NULL. Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć SQL Academy?
Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „LEFT/RIGHT JOIN i złączenia OUTER”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?
Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Dlaczego używamy złączeń (powtórka z modelu relacyjnego)
- Mechanika INNER JOIN
- LEFT/RIGHT JOIN i złączenia OUTER
- Złączenia tabeli z samą sobą i aliasy