IN a ANY i ALL
Porównuj wartości z całymi zbiorami
IN a ANY i ALL to bezpłatna lekcja SQL Academy 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 SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.
Czym są IN, ANY i ALL?
Podczas pisania zapytań SQL często trzeba porównać wartość z zestawem wartości. SQL udostępnia do tego trzy potężne operatory: IN, ANY i ALL.
Wszystkie trzy mogą współpracować z zapytaniami podrzędnymi zwracającymi listę wartości. Wyglądają podobnie, ale działają inaczej — wybór właściwego operatora może sprawić, że zapytanie będzie bardziej wyraziste i wydajne.
Operator IN
Operator IN sprawdza, czy wartość pasuje do dowolnej wartości na liście lub w wyniku zapytania podrzędnego. Jest najprostszym z tych trzech operatorów.
Poniższy przykład pobiera pracowników pracujących w działach Sales, HR lub Engineering.
SELECT name, department
FROM employees
WHERE department IN ('Sales', 'HR', 'Engineering');IN z zapytaniem podrzędnym
IN staje się szczególnie użyteczny w połączeniu z zapytaniem podrzędnym. Zamiast listy wpisanej na stałe można pobrać wartości do porównania bezpośrednio z innej tabeli.
W tym przypadku znajdziemy wszystkich pracowników należących do działu, którego budżet przekracza 100 000.
SELECT name, department
FROM employees
WHERE department IN (
SELECT dept_name
FROM departments
WHERE budget > 100000
);Operator ANY
ANY (zapisywany również jako SOME) porównuje wartość z każdą wartością zwróconą przez zapytanie podrzędne za pomocą operatora porównania, takiego jak =, >, <, >= lub <=.
Warunek jest prawdziwy, jeśli porównanie jest prawdziwe dla co najmniej jednej wartości w wyniku zapytania podrzędnego.
SELECT name, salary
FROM employees
WHERE salary > ANY (
SELECT salary
FROM employees
WHERE department = 'HR'
);= ANY to to samo co IN
Warto znać następującą ważną równoważność: = ANY (subquery) jest logicznie równoważne z IN (subquery). Oba wyrażenia zwracają wartość true, gdy wartość pasuje do co najmniej jednego wyniku zapytania podrzędnego.
Te dwa zapytania zwracają ten sam wynik:
-- Using IN
SELECT name FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE location = 'NYC');
-- Using = ANY
SELECT name FROM employees
WHERE department_id = ANY (SELECT id FROM departments WHERE location = 'NYC');Operator ALL
ALL porównuje wartość z każdą wartością w wyniku zapytania podrzędnego. Warunek jest prawdziwy tylko wtedy, gdy porównanie zachodzi dla wszystkich zwróconych wartości.
Ten przykład wyszukuje pracowników, których wynagrodzenie jest wyższe niż każde wynagrodzenie w grupie stażystów — czyli zarabiają więcej niż najlepiej opłacany stażysta.
SELECT name, salary
FROM employees
WHERE salary > ALL (
SELECT salary
FROM employees
WHERE job_grade = 'Intern'
);ANY a ALL — porównanie
Kluczowa różnica jest następująca: ANY wymaga, aby warunek był prawdziwy dla co najmniej jednej wartości, natomiast ALL wymaga, aby był prawdziwy dla każdej wartości.
Można ująć to następująco: ANY działa jak OR zastosowane do wszystkich porównań, a ALL jak AND zastosowane do wszystkich porównań.
-- Returns rows where salary > at least one value in the subquery
SELECT name, salary FROM employees
WHERE salary > ANY (SELECT salary FROM employees WHERE department = 'Support');
-- Returns rows where salary > every value in the subquery
SELECT name, salary FROM employees
WHERE salary > ALL (SELECT salary FROM employees WHERE department = 'Support');NOT IN a <> ALL
Tak jak = ANY odpowiada IN, operator <> ALL jest równoważny operatorowi NOT IN. Oba zwracają wartość true tylko wtedy, gdy wartość nie pasuje do żadnej wartości w zapytaniu podrzędnym.
Należy jednak zachować ostrożność — jeśli zapytanie podrzędne zwróci choć jedną wartość NULL, NOT IN nie zwróci żadnych wierszy z powodu trójwartościowej logiki SQL.
-- Using NOT IN
SELECT name FROM employees
WHERE department_id NOT IN (SELECT id FROM departments WHERE location = 'Remote');
-- Using <> ALL (equivalent)
SELECT name FROM employees
WHERE department_id <> ALL (SELECT id FROM departments WHERE location = 'Remote');Pułapka NULL w NOT IN
Jedna z najważniejszych pułapek polega na tym, że jeśli zapytanie podrzędne używane z NOT IN zwróci wartość NULL, całe wyrażenie NOT IN zostanie ocenione jako UNKNOWN dla każdego wiersza, zwracając pusty zbiór wyników.
Aby tego uniknąć, należy odfiltrować wartości NULL z zapytania podrzędnego albo użyć NOT EXISTS, które bezpiecznie obsługuje wartości NULL.
-- Dangerous: if manager_id has any NULL, no rows are returned
SELECT name FROM employees
WHERE id NOT IN (SELECT manager_id FROM employees);
-- Safe: filter NULLs explicitly
SELECT name FROM employees
WHERE id NOT IN (
SELECT manager_id FROM employees
WHERE manager_id IS NOT NULL
);Przykład praktyczny: znajdowanie najlepiej zarabiających
Przyjrzyjmy się wszystkim trzem operatorom w realistycznym scenariuszu. Mamy tabelę employees z kolumnami name, department i salary.
Chcemy znaleźć pracowników, którzy zarabiają więcej niż średnie wynagrodzenie w dowolnym pojedynczym dziale — czyli więcej niż średnia w co najmniej jednym dziale.
SELECT name, salary
FROM employees
WHERE salary > ANY (
SELECT AVG(salary)
FROM employees
GROUP BY department
)
ORDER BY salary DESC;Kiedy używać którego operatora?
Oto krótki przewodnik ułatwiający wybór jednego z tych trzech operatorów:
- IN — gdy mają Państwo statyczną listę lub potrzebują prostego porównania równości z wynikiem zapytania podrzędnego.
- = ANY — działa tak samo jak IN, ale pozwala używać innych operatorów porównania, takich jak
>i<. - ALL — gdy warunek musi być spełniony dla każdej wartości, np. gdy wartość ma być większa od maksimum bez używania MAX.
- NOT IN — jest wygodny, ale należy uważać na wartości NULL; gdy zapytanie podrzędne może je zawierać, należy preferować
NOT EXISTS.
Szybkie sprawdzenie
Sprawdź, czy rozumieją Państwo działanie IN, ANY i ALL.
Podsumowanie lekcji
W tej lekcji dowiedzieli się Państwo, jak porównywać wartości z zestawem za pomocą IN, ANY i ALL.
Najważniejsze wnioski:
INsprawdza przynależność — zwraca wartość true, jeśli wartość pasuje do dowolnego elementu listy lub wyniku zapytania podrzędnego.= ANYjest równoważne zIN; użycie innych operatorów, takich jak> ANY, oznacza, że warunek jest prawdziwy dla co najmniej jednego dopasowania.ALLoznacza, że warunek musi być spełniony dla każdej wartości zwróconej przez zapytanie podrzędne.NOT INpo cichu nie zwraca żadnych wierszy, gdy zapytanie podrzędne zawiera wartości NULL — należy zawsze temu zapobiegać.- Gdy mogą występować wartości NULL, należy używać
NOT EXISTSjako bezpieczniejszej alternatywy dlaNOT IN.
Często zadawane pytania
Czy lekcja „IN a ANY i ALL” jest bezpłatna?
Tak — pełny tekst „IN a 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 SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „IN a ANY i ALL”?
Porównuj wartości z całymi zbiorami Ć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 3 z 4.
Ile czasu zajmuje lekcja „IN a 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 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.