0Pricing
SQL Academy · Lekcja

IN i NOT IN dla zbiorów

Filtruj według list wartości za pomocą IN i NOT IN, poznaj pułapkę NULL w NOT IN i przekształcaj zapytania na EXISTS, aby zachować bezpieczną semantykę.

IN i NOT IN dla zbiorów to bezpłatna lekcja SQL Academy 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 Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.

IN: dopasowywanie do listy

IN jest skróconą formą wielu operatorów OR:

SELECT * FROM users WHERE country IN ('US', 'CA', 'GB');

-- Equivalent to:
SELECT * FROM users
WHERE country = 'US' OR country = 'CA' OR country = 'GB';

IN z podzapytaniem

Po prawej stronie można użyć podzapytania:

SELECT * FROM orders
WHERE user_id IN (
  SELECT id FROM users WHERE country = 'US'
);

NOT IN: wykluczanie listy

Odfiltrowywanie pasujących wierszy:

SELECT * FROM users WHERE status NOT IN ('banned', 'deleted');

Pułapka NULL w NOT IN

Jeśli prawa strona zawiera NULL, NOT IN zwraca NULL — a wiersze, dla których predykat ma wartość NULL, są odrzucane. W rezultacie nie zostaje żaden wiersz.

-- Suppose blocked_names contains NULL:
SELECT name FROM users
WHERE name NOT IN (SELECT excluded_name FROM blocked_names);
-- → 0 rows, silently

-- Safer: filter out NULLs explicitly, or use NOT EXISTS:
SELECT name FROM users u
WHERE NOT EXISTS (
  SELECT 1 FROM blocked_names b WHERE b.excluded_name = u.name
);

Dlaczego NOT EXISTS jest bezpieczniejsze

NOT EXISTS korzysta ze standardowej semantyki skorelowanych podzapytań i jest bezpieczne w obecności NULL. Większość planerów optymalizuje je identycznie jak poprawnie skonstruowane NOT IN.

IN a OR — czytelność

IN jest czytelniejsze niż długie łańcuchy OR, a planer często optymalizuje je w identyczny sposób:

-- Hard to read:
WHERE country = 'US' OR country = 'CA' OR country = 'GB' OR ...

-- Clear:
WHERE country IN ('US', 'CA', 'GB', ...)

IN z krotkami (konstruktory wierszy)

Dopasowywanie par kolumn:

SELECT * FROM order_items
WHERE (order_id, product_id) IN (
  (1, 42), (2, 99), (3, 17)
);

Wykorzystanie indeksów

Lista IN na indeksowanej kolumnie może być wykonywana jako wiele operacji wyszukiwania w indeksie (Bitmap Index Scan). Zwykle działa to szybko.

-- Plan: Bitmap Index Scan + Bitmap Heap Scan
SELECT * FROM products WHERE id IN (1, 5, 99, 121, 4421);

Duże listy IN

Listy zawierające tysiące wartości mogą działać wolno. Proszę preferować:

  • JOIN z rzeczywistą lub tymczasową tabelą
  • = ANY(array) do przekazywania parametru będącego tablicą
SELECT * FROM products WHERE id = ANY(ARRAY[1,2,3,...]);

IN z pustą listą

Pusta lista IN jest niedozwolona w standardowym SQL. Niektóre klienty przekazują wartość zastępczą; bezpieczniej jest generować warunek SQL warunkowo.

-- Use empty array trick in PostgreSQL:
SELECT * FROM products WHERE id = ANY($1::bigint[]);
-- Pass {} to get zero matches without rewriting the SQL.

IN a JOIN

Czasami JOIN jest czytelniejszy niż podzapytanie IN:

-- With IN:
SELECT * FROM orders
WHERE user_id IN (SELECT id FROM users WHERE pro);

-- With JOIN:
SELECT o.*
FROM orders o
JOIN users  u ON u.id = o.user_id
WHERE u.pro;

Podsumowanie

IN jest wygodną formą sprawdzania przynależności do zbioru.

  • IN zamiast OR, aby zwiększyć czytelność
  • NOT IN jest niebezpieczne w obecności NULL — należy preferować NOT EXISTS
  • W przypadku dużych zbiorów należy użyć JOIN lub przekazać tablice

Szybki test

Jaki jest najbezpieczniejszy zamiennik NOT IN (subquery), gdy podzapytanie może zawierać wartości NULL?

Często zadawane pytania

Czy lekcja „IN i NOT IN dla zbiorów” jest bezpłatna?

Tak — pełny tekst „IN i NOT IN dla zbiorów” 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 „IN i NOT IN dla zbiorów”?

Filtruj według list wartości za pomocą IN i NOT IN, poznaj pułapkę NULL w NOT IN i przekształcaj zapytania na EXISTS, aby zachować bezpieczną semantykę. Ć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 2 z 4.

Ile czasu zajmuje lekcja „IN i NOT IN dla zbiorów”?

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. Wzorce LIKE i symbole wieloznaczne
  2. IN i NOT IN dla zbiorów
  3. BETWEEN dla zakresów
  4. IS NULL, IS NOT NULL i COALESCE
← Powrót do SQL Academy