0Pricing
Coding Interview Prep · Lekcja

LEFT JOIN i zachowywanie niedopasowanych wierszy

Co zachowuje LEFT JOIN i jak wartości NULL pojawiają się dla niedopasowanych wierszy

LEFT JOIN i zachowywanie niedopasowanych wierszy to bezpłatna lekcja Coding Interview Prep na CoddyKit. To lekcja 1 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 Coding Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.

Scenariusz podczas rozmowy kwalifikacyjnej

Rekruter mówi: „Wyświetl każdego klienta i jego zamówienia, w tym klientów, którzy nigdy niczego nie zamawiali”. INNER JOIN pomija klientów bez zamówień, więc nie spełnia tego wymagania. Właściwym rozwiązaniem jest LEFT JOIN.

LEFT JOIN zachowuje każdy wiersz z lewej tabeli, czyli tabeli wymienionej jako pierwsza, i dołącza pasujące wiersze z prawej tabeli, jeśli takie istnieją. Ta lekcja buduje precyzyjny model mentalny, którego oczekują rekruterzy.

Co gwarantuje LEFT JOIN

Najważniejsza zasada brzmi: każdy wiersz z lewej tabeli pojawia się w wyniku co najmniej raz, niezależnie od tego, czy znaleziono dopasowanie.

  • Jeśli wiersz lewej tabeli znajdzie dopasowania po prawej, otrzymuje się po jednym wierszu wyniku dla każdego dopasowania.
  • Jeśli wiersz lewej tabeli nie znajdzie żadnego dopasowania, nadal otrzymuje się jeden wiersz wyniku, a wszystkie kolumny prawej tabeli przyjmują wartość NULL.

Dlatego rekruterzy nazywają je złączeniem zewnętrznym: wiersze spoza zbioru dopasowań zostają zachowane zamiast odrzucone.

Dwie tabele

W całej tej lekcji korzystamy z dwóch prostych tabel. customers zawiera wszystkich klientów, a orders rejestruje zakupy i odwołuje się do klienta za pomocą customer_id.

Należy zauważyć, że klient 3 (Carol) nie ma żadnego wiersza w tabeli orders. To właśnie tego niepasującego klienta LEFT JOIN musi zachować.

-- customers
-- id | name
--  1 | Alice
--  2 | Bob
--  3 | Carol

-- orders
-- id | customer_id | amount
-- 10 |     1       |  50
-- 11 |     1       |  75
-- 12 |     2       |  20

Zapisywanie LEFT JOIN

Składnia przypomina złączenie wewnętrzne — wystarczy zamienić INNER na LEFT (słowo OUTER jest opcjonalne: LEFT JOIN i LEFT OUTER JOIN są identyczne).

Tabela zapisana przed słowem kluczowym jest zachowywaną lewą stroną. Kolejność ma znaczenie: customers LEFT JOIN orders zachowuje wszystkich klientów, a nie wszystkie zamówienia.

SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.id;

Odczytywanie wyniku

Oto wynik tego zapytania. Alice znalazła dwa dopasowania, więc pojawia się dwa razy. Bob znalazł jedno dopasowanie. Carol nie znalazła żadnego dopasowania, więc nadal się pojawia, z wartością NULL w kolumnie amount.

Ten pojedynczy wiersz Carol z wartością NULL jest charakterystycznym śladem LEFT JOIN. Rekruter, który obserwuje tok rozumowania, chce usłyszeć: „niepasujące wiersze po lewej pozostają, a po prawej mają wartości NULL”.

-- name  | amount
-- Alice |  50
-- Alice |  75
-- Bob   |  20
-- Carol | NULL   <-- preserved, no match

Skąd biorą się wartości NULL

Wartość NULL nie jest nigdzie przechowywana. Baza danych generuje ją, ponieważ nie istnieje wiersz prawej tabeli, który mógłby dostarczyć wartość amount.

Każda kolumna pobrana z prawej tabeli przyjmuje wartość NULL dla niepasującego wiersza lewej tabeli: o.id, o.customer_id i o.amount mają wartość NULL w wierszu Carol. To ważne, ponieważ wartość o.customer_id równa NULL nie oznacza, że klient nie ma identyfikatora — oznacza, że w ogóle nie znaleziono pasującego zamówienia.

Liczenie zamówień dla każdego klienta

Częste pytanie dodatkowe brzmi: „Ile zamówień ma każdy klient, uwzględniając również klientów z zerową liczbą zamówień?” LEFT JOIN wraz z funkcją COUNT rozwiązuje ten problem, ale należy zliczać kolumnę z prawej tabeli, a nie *.

COUNT(o.id) pomija wartości NULL, więc dla Carol zwraca 0. COUNT(*) błędnie zwróciłoby dla Carol wartość 1, ponieważ wygenerowany wiersz z NULL nadal jest liczony jako wiersz.

SELECT c.name, COUNT(o.id) AS order_count
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Alice | 2
-- Bob   | 1
-- Carol | 0

Pułapka COUNT(*) kontra COUNT(kolumna)

To klasyczna pułapka podczas rozmowy kwalifikacyjnej. Po LEFT JOIN niepasujący wiersz lewej tabeli faktycznie występuje w wyniku, a kolumny prawej tabeli mają wartości NULL.

  • COUNT(*) zlicza ten wiersz, zwracając 1 dla klienta bez zamówień.
  • COUNT(o.id) pomija wartość NULL, poprawnie zwracając 0.

Gdy potrzebne są rzeczywiste zera, należy zawsze zliczać kolumnę, która po stronie braku dopasowania ma wartość NULL.

-- WRONG: Carol shows 1
SELECT c.name, COUNT(*) AS n
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;

Sumowanie z LEFT JOIN

Agregaty inne niż COUNT łagodnie obsługują wygenerowane wartości NULL. SUM pomija wartości NULL, więc dla niepasującego klienta zwraca NULL, a nie błąd.

W raportach rekruterzy często oczekują zera zamiast NULL. Należy opakować agregat w funkcję COALESCE, aby zastąpić tę wartość domyślną.

SELECT c.name,
       COALESCE(SUM(o.amount), 0) AS total_spent
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Alice | 125
-- Bob   |  20
-- Carol |   0

Lewa a prawa tabela — jasne wyjaśnienie

Gdy rekruter pyta „która tabela jest zachowywana?”, należy odpowiedzieć pewnie: tabela znajdująca się po lewej stronie słowa kluczowego JOIN. Należy czytać zapis od lewej do prawej.

A LEFT JOIN B oznacza zachowanie wszystkich wierszy A. Aby zamiast tego zachować wszystkie wiersze B, należy albo zamienić kolejność na B LEFT JOIN A, albo użyć RIGHT JOIN. Większość zespołów preferuje wyłącznie LEFT JOIN ze względu na czytelność i po prostu zmienia kolejność tabel.

Lista kontrolna

Widząc LEFT JOIN podczas rozmowy kwalifikacyjnej, należy głośno przejść przez następującą listę kontrolną:

  • Strona zachowywana? Lewa tabela — zachowywane są wszystkie wiersze.
  • Niepasujące wiersze? Pojawiają się raz, z wartościami NULL pochodzącymi z prawej tabeli.
  • Zliczanie? Należy użyć COUNT(right_col), aby uzyskać rzeczywiste zera.
  • Sumowanie? Jeśli potrzebne jest 0 zamiast NULL, należy użyć COALESCE.

Głośne przedstawienie tej listy kontrolnej sygnalizuje rzetelność na poziomie starszego programisty.

Szybkie sprawdzenie

Sprawdź swoją intuicję dotyczącą LEFT JOIN podczas zliczania.

Podsumowanie

LEFT JOIN zachowuje każdy wiersz lewej tabeli. Dopasowane wiersze lewej tabeli łączą się z pasującymi wierszami prawej tabeli, a niepasujące wiersze lewej tabeli pozostają w wyniku jako pojedyncze wiersze z wartością NULL we wszystkich kolumnach prawej tabeli.

  • Lewa tabela to ta znajdująca się przed słowem kluczowym JOIN.
  • Wygenerowane wartości NULL wskazują wiersze bez dopasowania.
  • COUNT(right_col) zwraca rzeczywiste zera, a COUNT(*) nie.
  • COALESCE(SUM(...), 0) zamienia sumy NULL na zero.

To podstawa wyszukiwania brakujących danych i złączeń typu anti-join w kolejnych lekcjach.

Często zadawane pytania

Czy lekcja „LEFT JOIN i zachowywanie niedopasowanych wierszy” jest bezpłatna?

Tak — pełny tekst „LEFT JOIN i zachowywanie niedopasowanych wierszy” 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 Coding Interview Prep, przejdź na CoddyKit PRO. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.

Co nauczysz się w „LEFT JOIN i zachowywanie niedopasowanych wierszy”?

Co zachowuje LEFT JOIN i jak wartości NULL pojawiają się dla niedopasowanych wierszy Ćwiczysz Coding Interview Prep 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ąć Coding Interview Prep?

Nie wymagamy żadnego doświadczenia. Coding Interview Prep 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 1 z 4.

Ile czasu zajmuje lekcja „LEFT JOIN i zachowywanie niedopasowanych wierszy”?

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 Coding Interview Prep?

Tak. Każda lekcja Coding Interview Prep 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. LEFT JOIN i zachowywanie niedopasowanych wierszy
  2. Semantyka RIGHT i FULL OUTER JOIN
  3. Znajdowanie wierszy bez dopasowania (anti-join)
  4. Pułapka WHERE w złączeniu zewnętrznym
← Powrót do Coding Interview Prep