Lekcja 4: Filtrowanie danych - WHERE

Preview Mode

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

Lekcja 4: Filtrowanie danych - WHERE
Required In Progress

Do czego służy klauzula WHERE?

Zapytanie SELECT ... FROM ... bez dodatkowych ograniczeń zwraca wszystkie wiersze z tabeli. W praktyce rzadko chcemy przeglądać wszystkie dane — interesują nas tylko wiersze spełniające określone kryteria. Klauzula WHERE służy do filtrowania wierszy: definiujemy warunek (lub kilka warunków), które muszą być spełnione, aby dany wiersz trafił do wyniku zapytania. Klauzula ta "przesiewa" wiersze z tabeli wskazanej w FROM i przepuszcza tylko te, dla których warunek jest TRUE.

Jak działa WHERE — krok po kroku

  • Silnik bazy danych pobiera kolejne wiersze z tabeli (FROM).
  • Dla każdego wiersza ocenia warunek w klauzuli WHERE.
  • Jeśli warunek jest TRUE, wiersz trafia do zestawu wyników; jeśli jest FALSE lub UNKNOWN (np. z powodu NULL), wiersz jest odrzucony.
  • WHERE jest logicznie oceniane przed operacjami takimi jak ORDER BY czy agregacje (GROUP BY).

Operatory porównania

Podstawowe operatory używane w WHERE to:

  • = — równość
  • != lub <> — różne od
  • <, >, <=, >= — porównania numeryczne/porządkowe

Przykłady:

SELECT Imie, Nazwisko, Klasa
FROM Uczniowie
WHERE Nazwisko = 'Kowalski';

SELECT NazwaProduktu, Cena
FROM Produkty
WHERE Cena > 50;

SELECT Imie, Nazwisko
FROM Uczniowie
WHERE Klasa <> '1B';

Uwaga dotycząca typów i cudzysłowów

Wartości tekstowe i daty w SQL zwykle umieszczamy w pojedynczych cudzysłowach ('...' ), natomiast wartości liczbowe podajemy bez cudzysłowów. Typy danych i ich rola w zapytaniach są omówione w materiale o podstawowych typach danych.

Łączenie wielu warunków: AND, OR, NOT

Do budowania złożonych filtrów używamy operatorów logicznych:

  • AND — wszystkie warunki muszą być prawdziwe
  • OR — wystarczy, że jeden z warunków jest prawdziwy
  • NOT — negacja warunku

Przy mieszaniu AND i OR warto używać nawiasów, aby wymusić oczekiwaną kolejność oceny warunków. Szczegółowe przykłady i ostrzeżenia znajdują się w lekcji o zaawansowanym filtrowaniu.

-- Chcemy uczniów z klasy 3A lub 3B, którzy mają średnią > 4.0
SELECT *
FROM Uczniowie
WHERE (Klasa = '3A' OR Klasa = '3B') AND Srednia > 4.0;

Przydatne operatory i konstrukcje rozszerzające WHERE

  • IN — sprawdza, czy wartość znajduje się na liście (zastępuje wiele warunków OR).

    WHERE Miasto IN ('Warszawa','Kraków','Gdańsk')
  • BETWEEN ... AND ... — sprawdza zakres (inkluzywny).

    WHERE Cena BETWEEN 100 AND 200
  • IS NULL / IS NOT NULL — poprawny sposób na sprawdzanie wartości NULL; porównania typu = NULL nie działają z powodu logiki trójwartościowej.

    WHERE Email IS NULL
    WHERE Email IS NOT NULL

Uwaga o NULL (wartości brakujące)

NULL oznacza brak wartości lub wartość nieznaną. Porównania takie jak = NULL lub <> NULL zwracają stan UNKNOWN, dlatego nie zwrócą wierszy — zamiast tego używamy IS NULL lub IS NOT NULL. To ważna zasada do zapamiętania przy filtrowaniu danych.

Bezpieczeństwo przy modyfikacjach danych

Klauzula WHERE działa także w poleceniach UPDATE i DELETE. Brak WHERE w UPDATE spowoduje zmianę wszystkich wierszy w tabeli — to częsta i groźna pomyłka. Zawsze przed wykonaniem UPDATE warto uruchomić odpowiadający SELECT z tym samym warunkiem, aby sprawdzić, które wiersze zostaną zmienione.

Podsumowanie — dobre praktyki

  • Zawsze dokładnie przemyśl warunek w WHERE; używaj nawiasów przy mieszaniu AND/OR.
  • Używaj IS NULL/IS NOT NULL do testów NULL.
  • Wartości tekstowe i daty w pojedynczych cudzysłowach; liczby bez cudzysłowów.
  • Przy złożonych listach wartości użyj IN, a przy zakresach BETWEEN.
  • Przed masową modyfikacją (UPDATE/DELETE) zweryfikuj najpierw SELECT z tym samym WHERE.

Przykładowe zapytania — szybkie podsumowanie

-- 1. Proste porównanie tekstowe
SELECT Imie, Nazwisko FROM Uczniowie WHERE Nazwisko = 'Kowalski';

-- 2. Filtr liczbowy
SELECT NazwaProduktu, Cena FROM Produkty WHERE Cena > 50;

-- 3. Negacja
SELECT Imie, Nazwisko FROM Uczniowie WHERE Klasa <> '1B';

-- 4. Lista wartości
SELECT Imie, Nazwisko FROM Uczniowie WHERE Miasto IN ('Warszawa','Kraków');

-- 5. Zakres
SELECT * FROM Produkty WHERE Cena BETWEEN 100 AND 200;

-- 6. Sprawdzenie NULL
SELECT Imie, Nazwisko FROM Uczniowie WHERE Email IS NULL;