Upraszczanie zapytań z wieloma warunkami OR za pomocą IN
Operator IN pozwala zapisać wiele warunków równości w sposób krótki i czytelny — jest to alternatywa dla łączenia wielu wyrażeń z operatorem OR. Opis i przykłady tego operatora oraz operatora BETWEEN znajdziesz w Lekcji 6: Operatory IN oraz BETWEEN .
Operator IN — wyszukiwanie wartości w zbiorze
Cel: sprawdzić, czy wartość kolumny występuje w zdefiniowanej liście wartości.
Składnia:
... WHERE [kolumna] IN ([wartość1], [wartość2], ...);Przykład:
SELECT Imie, Nazwisko, Miasto
FROM Uczniowie
WHERE Miasto IN ('Warszawa', 'Kraków', 'Gdańsk');To zapytanie jest logicznie równoważne z zapisem z użyciem OR (np. WHERE Miasto = 'Warszawa' OR Miasto = 'Kraków' OR Miasto = 'Gdańsk'), ale jest krótsze i czytelniejsze, o czym również mówiła Lekcja 5 o operatorach logicznych (AND/OR/NOT) .
Negacja: NOT IN
Możesz zanegować listę wartości używając NOT IN — to jest czytelniejsza alternatywa dla łączenia wielu warunków różności (<> lub !=) spójnych przez AND:
SELECT *
FROM Uczniowie
WHERE Miasto NOT IN ('Warszawa', 'Kraków');Uwaga dotycząca NULL: zachowanie porównań z NULL jest szczególne — porównania mogą zwrócić wynik NIEZNANY zamiast TRUE/FALSE. Więcej na temat NULL i jego wpływu na filtrowanie znajdziesz w Lekcji o typach danych i NULL .
Operator BETWEEN — sprawdzanie zakresów (liczb, dat)
Cel: sprawdzić, czy wartość mieści się w określonym zakresie. Operator BETWEEN jest inkluzywny — obejmuje wartości brzegowe.
Składnia:
... WHERE [kolumna] BETWEEN [wartość_min] AND [wartość_max];Jest to logicznie równoważne wyrażeniu:
... WHERE [kolumna] >= [wartość_min] AND [kolumna] <= [wartość_max];Przykład liczbowy:
SELECT *
FROM Produkty
WHERE Cena BETWEEN 100 AND 200; -- znajdzie produkty o cenie od 100 do 200 włączniePrzykład na datach:
SELECT *
FROM Zamowienia
WHERE DataZlozenia BETWEEN '2023-01-01' AND '2023-03-31'; -- pierwsze trzy miesiące 2023Aby zanegować zakres użyj NOT BETWEEN:
SELECT *
FROM Uczniowie
WHERE Srednia NOT BETWEEN 3.0 AND 4.0; -- średnia poniżej 3.0 lub powyżej 4.0Operator BETWEEN oraz przykłady jego użycia są omówione w Lekcji 6 dotyczącej operatorów IN i BETWEEN .
Dodatkowe przykłady i wskazówki
IN z podzapytaniem: zamiast podawać długą listę wartości możesz użyć podzapytania, które zwróci listę wartości dla IN. To świetne rozwiązanie, gdy lista pochodzi z innej tabeli (patrz Lekcja o podzapytaniach). Przykład:
SELECT Imie, Nazwisko FROM Uczniowie WHERE ID_Klasy IN ( SELECT ID_Klasy FROM Klasy WHERE Profil = 'Mat-Fiz' );(Zob. Lekcja o podzapytaniach .)
- Gdy lista jest bardzo długa: dla bardzo dużej liczby wartości często lepiej użyć tymczasowej tabeli lub JOIN zamiast bardzo długiego IN — to ułatwia zarządzanie i może poprawić wydajność. Złączenia (JOIN) omawiane są w Lekcji 14 .
- Sprawdzaj granice przy BETWEEN: pamiętaj, że BETWEEN jest inkluzywny — jeśli chcesz wykluczyć wartości brzegowe, użyj operatorów > i < zamiast BETWEEN.
- NOT IN i NULL: jeżeli lista wartości zawiera NULL, wynik NOT IN może zadziałać inaczej niż oczekujesz (porównanie z NULL daje NIEZNANY). Jeśli pracujesz z danymi, które mogą zawierać NULL, warto jawnie filtrować NULL (np. WHERE kolumna IS NOT NULL) przed użyciem NOT IN; więcej o NULL w Lekcji 2 .
Propozycje ćwiczeń (spróbuj samodzielnie)
- Napisz zapytanie, które wybierze wszystkich uczniów z miast: Poznań, Wrocław i Łódź, używając IN.
- Zmień zapytanie z zadania 1 tak, aby wykluczyć uczniów z tych miast (użyj NOT IN).
- Znajdź produkty o cenie większej niż 50, ale mniejszej niż 150 — zapisz to raz za pomocą BETWEEN i raz za pomocą operatorów porównania (>=, <=), porównaj wyniki.
- Skonstruuj zapytanie, które wybierze zamówienia złożone w drugim kwartale 2022, używając BETWEEN na polu daty.
Materiał o operatorach IN i BETWEEN bazuje na Lekcji 6: Operatory IN oraz BETWEEN; dodatkowo do niektórych uwag odwołano się do lekcji o NULL, podzapytaniach oraz JOINach fileciteturn0file8fileciteturn0file6fileciteturn0file18.