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 BYczy 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 200IS NULL / IS NOT NULL — poprawny sposób na sprawdzanie wartości NULL; porównania typu
= NULLnie 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 NULLdo 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 zakresachBETWEEN. - Przed masową modyfikacją (UPDATE/DELETE) zweryfikuj najpierw
SELECTz 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;