0Pricing
SQL Academy · Lekcja

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:

  • IN sprawdza przynależność — zwraca wartość true, jeśli wartość pasuje do dowolnego elementu listy lub wyniku zapytania podrzędnego.
  • = ANY jest równoważne z IN; użycie innych operatorów, takich jak > ANY, oznacza, że warunek jest prawdziwy dla co najmniej jednego dopasowania.
  • ALL oznacza, że warunek musi być spełniony dla każdej wartości zwróconej przez zapytanie podrzędne.
  • NOT IN po 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 EXISTS jako bezpieczniejszej alternatywy dla NOT 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.

Wszystkie lekcje w tym kursie

  1. Podzapytania skorelowane
  2. EXISTS i NOT EXISTS
  3. IN a ANY i ALL
  4. Wydajność EXISTS a JOIN
← Powrót do SQL Academy