Lekcja 6: Operatory IN oraz BETWEEN

Preview Mode

You're viewing this material in preview mode. Sign up to track your progress and access all features.

Lekcja 6: Operatory IN oraz BETWEEN
Required In Progress

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łącznie

Przykład na datach:

SELECT *
FROM Zamowienia
WHERE DataZlozenia BETWEEN '2023-01-01' AND '2023-03-31';  -- pierwsze trzy miesiące 2023

Aby 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.0

Operator 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)

  1. Napisz zapytanie, które wybierze wszystkich uczniów z miast: Poznań, Wrocław i Łódź, używając IN.
  2. Zmień zapytanie z zadania 1 tak, aby wykluczyć uczniów z tych miast (użyj NOT IN).
  3. 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.
  4. 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 fileciteturn0file8fileciteturn0file6fileciteturn0file18.