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
- Wzorce LIKE i symbole wieloznaczne
- IN i NOT IN dla zbiorów
- BETWEEN dla zakresów
- IS NULL, IS NOT NULL i COALESCE