ON a WHERE w złączeniach
Kiedy predykat powinien znaleźć się w ON, a kiedy w WHERE, oraz dlaczego ma to znaczenie dla wyników
ON a WHERE w złączeniach to bezpłatna lekcja SQL Interview Prep na CoddyKit. To lekcja 2 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 Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Interview Prep zawiera 4 lekcji w sumie.
Predykat może znajdować się w dwóch miejscach
Gdy można już napisać INNER JOIN, kolejne pytanie rekrutacyjne jest bardziej precyzyjne: czy ten warunek powinien znajdować się w ON, czy w WHERE?
W przypadku INNER JOIN odpowiedź często brzmi: "dla wyniku nie ma to znaczenia". Jednak w chwili przejścia na złączenie zewnętrzne wybór całkowicie zmienia wynik. Rekruterzy pytają o to właśnie dlatego, że osoby początkujące z przyzwyczajenia umieszczają wszystko w WHERE.
Ta lekcja precyzuje tę regułę.
Rola ON
Klauzula ON określa sposób parowania wierszy. Jest wykonywana podczas budowania złączenia i decyduje, który wiersz z lewej tabeli pasuje do którego wiersza z prawej tabeli.
Można myśleć o ON jak o odpowiedzi na pytanie: "czy te dwa wiersze należą do siebie?"
SELECT c.name, o.amount
FROM customers c
JOIN orders o
ON o.customer_id = c.id; -- pairing ruleRola WHERE
Klauzula WHERE jest wykonywana po utworzeniu połączonych wierszy przez złączenie. Filtruje ten zbiór wyników, odrzucając wiersze, które nie spełniają warunku.
Można myśleć o WHERE jak o odpowiedzi na pytanie: "skoro mam już połączone wiersze, które z nich chcę zachować?"
SELECT c.name, o.amount
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30; -- filter after pairingW INNER JOIN często dają ten sam wynik
W przypadku INNER JOIN dodatkowy filtr daje ten sam wynik niezależnie od tego, czy zostanie umieszczony w ON, czy w WHERE. Oba poniższe zapytania zwracają tylko zamówienie Ady na kwotę $50 oraz zamówienie Boba na kwotę $99.
Ponieważ niedopasowane wiersze są już odrzucane przez złączenie wewnętrzne, przeniesienie predykatu nie zmienia tego, które wiersze pozostaną.
-- predicate in ON
SELECT c.name, o.amount FROM customers c
JOIN orders o
ON o.customer_id = c.id AND o.amount > 30;
-- predicate in WHERE -- same result here
SELECT c.name, o.amount FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;Dlaczego styl nadal przemawia za ON w przypadku kluczy złączenia
Nawet gdy wyniki są takie same, konwencja nakazuje umieszczać warunki określające relację złączenia w ON, a filtry biznesowe w WHERE.
- ON:
o.customer_id = c.id(jak powiązane są tabele) - WHERE:
o.amount > 30(które wyniki są potrzebne)
Taki podział jasno pokazuje intencję kolejnemu czytelnikowi oraz rekruterowi oceniającemu styl rozwiązania.
Gdzie ma to naprawdę znaczenie: złączenia zewnętrzne
Różnica staje się decydująca w przypadku LEFT JOIN, który zachowuje każdy wiersz z lewej strony, nawet gdy nie pasuje do niego żaden wiersz z prawej strony. Oto szybki przykład z użyciem customers i orders, w którym Cleo nie ma żadnych zamówień.
LEFT JOIN zachowuje Cleo z wartościami NULL w kolumnach dotyczących zamówień. Teraz zobaczmy, jaki wpływ na jej wiersz ma umieszczenie warunku w ON lub WHERE.
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;
-- keeps Ada, Bob, AND Cleo (NULL amount)Filtr w ON: wiersze zostają zachowane
Umieszczenie warunku amount > 30 w ON złączenia LEFT JOIN wpływa tylko na to, które wiersze z prawej strony zostaną dołączone. Niedopasowane wiersze z lewej strony nadal są zachowywane, tyle że z wartościami NULL.
Cleo pozostaje w wyniku. Zamówienie, które nie spełnia warunku, po prostu nie zostaje dołączone, pozostawiając wartość NULL.
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.id AND o.amount > 30;
-- Ada 50, Bob 99, Cleo NULL (3 rows, Cleo kept)Filtr w WHERE: złączenie zewnętrzne znika
Przenieś ten sam warunek do WHERE, a przefiltrujesz połączony wynik. Wiersz Cleo zawiera amount = NULL, a NULL > 30 nie ma wartości true, więc zostaje usunięty.
LEFT JOIN po cichu zaczyna zachowywać się jak INNER JOIN. To najsłynniejsza pułapka związana ze złączeniami podczas rozmów rekrutacyjnych.
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;
-- Ada 50, Bob 99 (Cleo GONE -> back to inner-join behavior)Reguła do zapamiętania
Podczas rozmowy rekrutacyjnej należy przedstawić to jasno:
- Warunek w ON decyduje, czy wiersz z prawej strony zostanie dołączony; wiersze z lewej strony są zachowywane.
- Warunek w WHERE filtruje końcowe wiersze i może usunąć zachowane wiersze z lewej strony, gdy dotyczy kolumny, która może mieć wartość NULL.
W przypadku złączeń zewnętrznych predykaty dotyczące tabeli opcjonalnej należy więc umieszczać w ON, chyba że celowo chcą Państwo odrzucić niedopasowane wiersze.
Prawidłowe użycie WHERE z NULL
Istnieje jeden przypadek, w którym filtrowanie kolumny złączenia zewnętrznego w WHERE jest właściwym rozwiązaniem: antyzłączenie. Testowanie IS NULL znajduje wiersze z lewej strony, dla których nie znaleziono dopasowania.
W tym przypadku WHERE celowo zachowuje tylko niedopasowane wiersze, zwracając klientów z zerową liczbą zamówień. Mechanizm jest taki sam, ale intencja odwrotna.
SELECT c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL; -- customers with no orders -> CleoSzybki test mentalny
Przed rozpoczęciem quizu zastosuj tę listę kontrolną, gdy widzisz warunek złączenia:
- Czy jest to klucz złączenia łączący tabele? -> ON.
- Czy jest to filtr dotyczący tabeli wymaganej? -> WHERE lub ON — obie możliwości są poprawne.
- Czy jest to filtr dotyczący tabeli opcjonalnej (zewnętrznej), a niedopasowane wiersze mają zostać zachowane? -> ON.
- Czy chcesz znaleźć niedopasowania? -> WHERE ... IS NULL.
Szybki test
Zastosuj regułę ON kontra WHERE do złączenia zewnętrznego.
Podsumowanie: ON kontra WHERE
Najważniejsze punkty, które warto zapamiętać przed rozmową:
- ON steruje parowaniem oraz, w przypadku złączeń zewnętrznych, tym, czy opcjonalny wiersz zostanie dołączony, zachowując stronę, która ma pozostać w wyniku.
- WHERE filtruje już połączony wynik i może usuwać zachowane wiersze.
- W przypadku INNER JOIN oba miejsca są często równoważne, ale w złączeniach zewnętrznych już nie.
- Filtry dotyczące tabeli zewnętrznej należy umieszczać w ON, chyba że celem jest antyzłączenie z użyciem
IS NULLw WHERE.
Często zadawane pytania
Czy lekcja „ON a WHERE w złączeniach” jest bezpłatna?
Tak — pełny tekst „ON a WHERE w złączeniach” 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 Interview Prep, przejdź na CoddyKit PRO. Kurs SQL Interview Prep zawiera 4 lekcji w sumie.
Co nauczysz się w „ON a WHERE w złączeniach”?
Kiedy predykat powinien znaleźć się w ON, a kiedy w WHERE, oraz dlaczego ma to znaczenie dla wyników Ćwiczysz SQL 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ąć SQL Interview Prep?
Nie wymagamy żadnego doświadczenia. SQL 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 2 z 4.
Ile czasu zajmuje lekcja „ON a WHERE w złączeniach”?
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 Interview Prep?
Tak. Każda lekcja SQL 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
- Jak INNER JOIN dopasowuje wiersze
- ON a WHERE w złączeniach
- Rozrost złączenia i powielanie wierszy
- Łączenie trzech lub większej liczby tabel