SQL Academy · Lekcja

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.

Lekcja 3 z 413 kroki

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 order

LEFT 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ń?

Bezpłatny start

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

  1. Dlaczego używamy złączeń (powtórka z modelu relacyjnego)
  2. Mechanika INNER JOIN
  3. LEFT/RIGHT JOIN i złączenia OUTER
  4. Złączenia tabeli z samą sobą i aliasy
← Powrót do SQL Academy