Coding Interview Prep · Lekcja

Podzapytania IN, ANY i ALL

Podzapytania sprawdzające przynależność do zbioru oraz słynna pułapka NOT IN z NULL

Lekcja 3 z 413 kroki

Podzapytania IN, ANY i ALL to bezpłatna lekcja Coding Interview Prep 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 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.

Podzapytania sprawdzające przynależność do zbioru

Gdy podzapytanie zwraca listę wartości, przynależność do niej sprawdza się za pomocą IN, ANY lub ALL. Dzięki nim SQL może sprawdzić, czy ta wartość należy do tego zbioru? albo czy przewyższa każdy element tego zbioru lub dowolny z jego elementów?

  • IN — pasuje do dowolnej wartości na liście.
  • ANY/SOME — zwraca true, jeśli porównanie zachodzi dla co najmniej jednego elementu.
  • ALL — zwraca true tylko wtedy, gdy warunek zachodzi dla każdego elementu.

IN z podzapytaniem

Typowy przypadek: proszę znaleźć pracowników, którzy pracują w dowolnym dziale znajdującym się w 'NYC'. Podzapytanie zwraca zbiór identyfikatorów działów, a IN zachowuje wiersze pasujące do dowolnego z nich.

Takie zapytanie brzmi naturalnie i jest formą, której rekruterzy oczekują w pierwszej kolejności.

SELECT name
FROM employees
WHERE dept_id IN (
  SELECT id FROM departments WHERE city = 'NYC'
);

= ANY oznacza to samo co IN

Rekruterzy lubią tę elegancką równoważność: = ANY (subquery) oznacza dokładnie to samo co IN (subquery). W obu przypadkach warunek jest prawdziwy, gdy wartość jest równa co najmniej jednemu elementowi zbioru.

Poniższe zapytanie zwraca identyczny wynik jak poprzednie. ANY i jego synonim SOME uogólniają tę zasadę na inne operatory, takie jak > i <.

SELECT name
FROM employees
WHERE dept_id = ANY (
  SELECT id FROM departments WHERE city = 'NYC'
);

ANY z operatorem porównania

ANY staje się szczególnie użyteczne w połączeniu z > lub <. salary > ANY (set) jest prawdziwe, jeśli wynagrodzenie jest wyższe od co najmniej jednej wartości — czyli wyższe od minimum.

W ten sposób można znaleźć pracowników, którzy zarabiają więcej niż co najmniej jedna osoba w dziale 5.

SELECT name, salary
FROM employees
WHERE salary > ANY (
  SELECT salary FROM employees WHERE dept_id = 5
);

ALL z operatorem porównania

salary > ALL (set) jest prawdziwe tylko wtedy, gdy wynagrodzenie przewyższa każdy element — czyli jest wyższe od maksimum. Pozwala to znaleźć pracowników zarabiających więcej niż wszyscy pracownicy działu 5.

Proszę zapamiętać skrót: > ALL = więcej niż MAX, > ANY = więcej niż MIN. Rekruterzy bardzo często to sprawdzają.

SELECT name, salary
FROM employees
WHERE salary > ALL (
  SELECT salary FROM employees WHERE dept_id = 5
);

NOT IN: słynna pułapka z NULL

Oto najczęściej omawiana pułapka związana z podzapytaniami podczas rozmów kwalifikacyjnych. Jeśli podzapytanie użyte w NOT IN zwróci choć jedną wartość NULL, całe NOT IN może nie zwrócić żadnych wierszy — zamiast oczekiwanych osieroconych rekordów.

Dlaczego? x NOT IN (1, 2, NULL) rozwija się do x <> 1 AND x <> 2 AND x <> NULL. To ostatnie porównanie ma wartość UNKNOWN, więc całe AND nigdy nie może być prawdziwe.

SELECT name
FROM customers
WHERE id NOT IN (
  SELECT customer_id FROM orders
);

Dlaczego to zapytanie po cichu zawodzi

Jeśli orders.customer_id dopuszcza wartości NULL i choć jeden wiersz zawiera taką wartość, poprzednie zapytanie zwróci zero wierszy, mimo że klienci bez zamówień wyraźnie istnieją.

  • Obecność NULL zmienia wynik logiczny na UNKNOWN.
  • Nie zgłasza błędu — po prostu zwraca nieprawidłowy, pusty wynik.

Wypowiedzenie tego zagrożenia na głos podczas rozmowy kwalifikacyjnej jest wyraźnym sygnałem kompetencji.

Naprawianie NOT IN w obecności NULL

Rekruterzy akceptują trzy bezpieczne rozwiązania:

  • Wykluczenie wartości NULL w podzapytaniu: dodanie WHERE customer_id IS NOT NULL.
  • Przepisanie zapytania z użyciem NOT EXISTS, które poprawnie obsługuje wartości NULL.
  • Użycie antyzłączenia LEFT JOIN ... IS NULL.

Poniższa wersja z zabezpieczeniem zwraca prawdziwą listę klientów bez zamówień.

SELECT name
FROM customers
WHERE id NOT IN (
  SELECT customer_id FROM orders
  WHERE customer_id IS NOT NULL
);

IN poprawnie obsługuje wartości NULL

Warto znać również drugą stronę medalu: zwykłe IN (bez negacji) nie powoduje problemów z wartościami NULL na liście. x IN (1, 2, NULL) jest prawdziwe, jeśli x jest równe 1 lub 2; NULL po prostu nigdy nie pasuje.

Problem z NULL dotyczy wyłącznie NOT IN. Znajomość różnicy między tymi dwoma przypadkami odróżnia pewną odpowiedź od zgadywania.

IN dla wielu kolumn

Niektóre dialekty (Postgres, MySQL) pozwalają używać IN dla krotki kolumn, porównując pary jednocześnie. Pozwala to znaleźć pozycje zamówień, których kombinacja (produkt, region) występuje w tabeli promocji.

SQL Server nie obsługuje wierszowego IN; w tym środowisku należy przepisać zapytanie z użyciem EXISTS. Wspomnienie o tej luce w przenośności robi dobre wrażenie na rekruterach.

SELECT *
FROM order_lines
WHERE (product_id, region) IN (
  SELECT product_id, region FROM promotions
);

Wypowiedź na rozmowę kwalifikacyjną

Proszę powiedzieć: "IN sprawdza przynależność do zbioru i jest równoważne z = ANY. W połączeniu z operatorami porównania > ANY oznacza więcej niż minimum, a > ALL — więcej niż maksimum. Największa pułapka to NOT IN użyte z podzapytaniem, które może zwrócić NULL — zapytanie po cichu nie zwróci żadnych wierszy, dlatego stosuję IS NOT NULL albo przechodzę na NOT EXISTS."

Taka odpowiedź obejmuje przynależność do zbioru, semantykę ANY/ALL i pułapkę z NULL w jednym zdaniu.

Szybki test

Ulubiona pułapka rekruterów związana z podzapytaniami.

Podsumowanie

Podzapytania sprawdzające przynależność do zbioru — opanowane:

  • IN = = ANY: pasuje do dowolnego elementu zbioru.
  • > ANY oznacza więcej niż minimum; > ALL oznacza więcej niż maksimum.
  • NOT IN z wartością NULL w podzapytaniu po cichu nie zwraca żadnych wierszy — należy użyć IS NOT NULL albo NOT EXISTS.
  • Zwykłe IN toleruje wartości NULL; wielokolumnowe IN działa w niektórych dialektach.

Następnie: EXISTS a IN oraz kwestia wydajności, którą starsi rangą rekruterzy uwielbiają poruszać.

Bezpłatny start

Ucz się Coding Interview Prep 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
90
Lekcje
360

Często zadawane pytania

Czy lekcja „Podzapytania IN, ANY i ALL” jest bezpłatna?

Tak — pełny tekst „Podzapytania IN, ANY i ALL” 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 „Podzapytania IN, ANY i ALL”?

Podzapytania sprawdzające przynależność do zbioru oraz słynna pułapka NOT IN z NULL Ć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 3 z 4.

Ile czasu zajmuje lekcja „Podzapytania IN, ANY i ALL”?

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. Podzapytania skalarne w SELECT i WHERE
  2. Podzapytania w klauzuli FROM (tabele pochodne)
  3. Podzapytania IN, ANY i ALL
  4. Wydajność EXISTS a IN
← Powrót do Coding Interview Prep