SQL WHERE - Filtrowanie i Warunki w Zapytaniach
Jeśli `SELECT` i `FROM` pozwalają Ci wybrać *które kolumny* i *z której tabeli* chcesz zobaczyć, to klauzula `WHERE` jest Twoim 'filtrem' lub 'sitem', które decyduje, *które wiersze* Cię interesują. To najważniejsza komenda filtrująca w SQL. Zamiast pobierać całą tabelę z milionem produktów, możesz powiedzieć: `...WHERE kategoria = 'Nabiał' AND cena < 5`. `WHERE` pozwala zadawać precyzyjne pytania i pobierać tylko te dane, które są Ci potrzebne do rozwiązania zadania. Jest to absolutna podstawa, bez której nie da się pracować z bazami danych.
Dlaczego to ważne? Na maturze *każde* zadanie z SQL będzie wymagało jakiejś formy filtrowania. Pytania typu 'znajdź uczniów z klasy 3A', 'policz produkty droższe niż 50 zł', 'znajdź kierowców, których nazwisko zaczyna się na K' – to wszystko są operacje, które wykonasz za pomocą `WHERE`. Jest to klauzula używana w 100% zadań bazodanowych.
Teoria
Klauzula `WHERE` jest używana do filtrowania wierszy. Działa jak instrukcja `if` w programowaniu, stosowana do każdego wiersza w tabeli. Jeśli warunek po `WHERE` jest prawdziwy (`True`) dla danego wiersza, ten wiersz zostaje włączony do wyników. Jeśli jest fałszywy (`False`), wiersz jest odrzucany. `WHERE` jest (logicznie) wykonywane po klauzuli `FROM`, a przed `SELECT` i `ORDER BY`.
Jak to działa?
- Krok 1: Zapytanie zaczyna się od `SELECT ... FROM tabela ...`.
- Krok 2: Dodajesz klauzulę `WHERE`, a po niej warunek logiczny.
- Krok 3: Operatory Porównania: Najczęściej używasz: `=` (równe), `!=` lub `<>` (różne), `>`, `<`, `>=`, `<=`.
- Krok 4: Wartości Tekstowe (Stringi): Zawsze umieszczaj w pojedynczych cudzysłowach, np. `WHERE imie = 'Anna'`.
- Krok 5: Wartości Numeryczne: Używaj bez cudzysłowów, np. `WHERE punkty > 80`.
- Krok 6: Operatory Logiczne: Możesz łączyć warunki za pomocą `AND` (oba muszą być prawdziwe) oraz `OR` (przynajmniej jeden musi być prawdziwy).
- Krok 7: Operatory Specjalne: `BETWEEN` (zakres włącznie), `LIKE` (wzorce tekstowe), `IN` (lista wartości).
Złożoność: Nie dotyczy w sensie O(n). Wydajność zależy od wielkości tabel i użycia tzw. indeksów na filtrowanych kolumnach. Na maturze każde poprawnie napisane zapytanie `WHERE` będzie wystarczająco szybkie.
Implementacja
Proste `WHERE` (liczby i tekst)
SQL-- Znajdź wszystkich uczniów z klasy 3A
SELECT * FROM Uczniowie
WHERE klasa = '3A';
-- Znajdź wszystkie produkty droższe niż 100 zł
SELECT * FROM Produkty
WHERE cena > 100;To najprostsze użycie. Zwróć uwagę na `'3A'` (w cudzysłowach, bo to tekst) oraz `100` (bez cudzysłowów, bo to liczba). W SQL do porównania używamy pojedynczego znaku `=`.
Łączenie warunków (AND, OR, NOT)
SQL-- Znajdź uczniów z klasy 3A, którzy mają ponad 90 punktów
SELECT * FROM Uczniowie
WHERE klasa = '3A' AND punkty > 90;
-- Znajdź uczniów, którzy nazywają się 'Kowalski' LUB 'Nowak'
SELECT * FROM Uczniowie
WHERE nazwisko = 'Kowalski' OR nazwisko = 'Nowak';
-- Znajdź wszystkich OPRÓCZ klasy 1A
SELECT * FROM Uczniowie
WHERE NOT klasa = '1A'; -- (lub: WHERE klasa != '1A')`AND` wymaga, aby oba warunki były spełnione. `OR` wymaga, aby przynajmniej jeden był spełniony. `NOT` zaprzecza warunkowi.
Operatory specjalne (LIKE, BETWEEN, IN)
SQL-- Znajdź uczniów, których nazwisko ZACZYNA SIĘ na 'K'
SELECT * FROM Uczniowie
WHERE nazwisko LIKE 'K%';
-- Znajdź produkty o cenie pomiędzy 50 a 100 zł (włącznie)
SELECT * FROM Produkty
WHERE cena BETWEEN 50 AND 100;
-- Znajdź uczniów z klas 1A, 1B lub 1C (czytelniejsza wersja OR)
SELECT * FROM Uczniowie
WHERE klasa IN ('1A', '1B', '1C');`LIKE 'K%'` używa '%' jako 'jokera' oznaczającego dowolny ciąg znaków. `BETWEEN` jest równoznaczne z `cena >= 50 AND cena <= 100`. `IN` jest równoznaczne z wieloma warunkami `OR`.
Przykładowe Zadania Maturalne
Masz tabelę 'Samochody' (rejestracja, marka, rok_produkcji). Napisz zapytanie SQL, które wyświetli numery rejestracyjne i marki wszystkich samochodów, które zostały wyprodukowane w 2010 roku LUB są marki 'Ford'.
Wskazówka: Potrzebujesz klauzuli `WHERE` z dwoma warunkami. Ponieważ w poleceniu jest słowo 'LUB', musisz połączyć je operatorem `OR`. Pamiętaj o cudzysłowach dla 'Ford' i braku cudzysłowów dla liczby 2010.
Pokaż szkic rozwiązania
1. Wybierz kolumny: `SELECT rejestracja, marka` 2. Wskaż tabelę: `FROM Samochody` 3. Użyj filtra `WHERE` z operatorem `OR`: 4. `WHERE rok_produkcji = 2010 OR marka = 'Ford';`
W bazie danych są tabele 'Wlasciciele' (id_wlasciciela, imie, nazwisko) oraz 'Samochody' (nr_rejestracyjny, marka, rok_produkcji, id_wlasciciela). Zapisz zapytanie SQL, w wyniku którego uzyskasz imiona i nazwiska właścicieli samochodów, które spełniają DWA warunki: 1) są zarejestrowane w Chorzowie (nr rejestracyjny rozpoczyna się od liter SH) i 2) zostały wyprodukowane w 2020 roku.
Wskazówka: To zadanie wymaga połączenia (JOIN) tabel. W klauzuli `WHERE` musisz połączyć dwa warunki operatorem `AND`. Do sprawdzenia numeru rejestracyjnego użyj operatora `LIKE 'SH%'`, a do roku produkcji zwykłego `= 2020`.
Pokaż szkic rozwiązania
1. Wybierz dane właścicieli: `SELECT W.imie, W.nazwisko` 2. Połącz tabele: `FROM Wlasciciele AS W JOIN Samochody AS S ON W.id_wlasciciela = S.id_wlasciciela` 3. Zastosuj filtr `WHERE` z operatorem `AND`: 4. `WHERE S.nr_rejestracyjny LIKE 'SH%' AND S.rok_produkcji = 2020` 5. (Opcjonalnie z zadania: `ORDER BY W.nazwisko ASC;`)
Częste Błędy
❌ Używanie `==` zamiast `=` do porównania
Programiści Pythona i C++ często piszą `WHERE klasa == '3A'`. W SQL operatorem porównania jest *pojedynczy* znak równości: `=`.
Poprawka: Do porównania w `WHERE` (i `ON`) zawsze używaj `=`.
❌ Brak pojedynczych cudzysłowów dla tekstu
Pisanie `WHERE klasa = 3A` lub `WHERE nazwisko = Nowak` powoduje błąd. Baza myśli, że `3A` i `Nowak` to nazwy innych kolumn, a nie wartości.
Poprawka: Wartości tekstowe (stringi, daty) *zawsze* muszą być w pojedynczych cudzysłowach: `WHERE klasa = '3A'`.
❌ Używanie cudzysłowów dla liczb
Pisanie `WHERE punkty = '90'` (w cudzysłowach) jest niepoprawne. Chociaż niektóre bazy danych (jak MySQL) sobie z tym poradzą (niejawnie konwertując typy), jest to zła praktyka, może psuć wydajność i w innych bazach danych może nie działać.
Poprawka: Wartości numeryczne (`INT`, `FLOAT` itp.) *nigdy* nie powinny być w cudzysłowach: `WHERE punkty = 90`.
❌ Zła kolejność operatorów `AND` i `OR`
Uczeń pisze: `WHERE kategoria = 'A' AND cena > 100 OR kategoria = 'B'`. Baza może to zinterpretować jako `(kategoria = 'A' AND cena > 100) OR (kategoria = 'B')`. Uczeń prawdopodobnie chciał `kategoria = 'A' AND (cena > 100 OR kategoria = 'B')`.
Poprawka: Operator `AND` ma wyższy priorytet niż `OR`. Jeśli mieszasz `AND` i `OR`, *zawsze* używaj nawiasów `()`, aby jawnie określić kolejność działań.
❌ Używanie `=` zamiast `LIKE` dla wzorców
Pisanie `WHERE nazwisko = 'K%'` nie znajdzie 'Kowalskiego'. Znajdzie tylko kogoś, kto dosłownie nazywa się 'K%' (z procentem w nazwisku).
Poprawka: Do dopasowywania wzorców (zaczyna się na, kończy na, zawiera) *zawsze* używaj operatora `LIKE`.
Kluczowe Wnioski
- `WHERE` to klauzula, która filtruje wiersze.
- Jest (logicznie) wykonywana po `FROM`, a przed `SELECT` i `ORDER BY`.
- Do porównania używaj `=` (nie `==`).
- Tekst (stringi) i daty zamykaj w pojedynczych cudzysłowach: `'Anna'`, `'2025-11-04'`.
- Liczby pisz bez cudzysłowów: `punkty > 50`.
- Łącz warunki za pomocą `AND` (oba prawdziwe) i `OR` (jeden prawdziwy). Używaj nawiasów `()` dla pewności.
- `LIKE` służy do wyszukiwania wzorców (np. `LIKE 'A%'` - zaczyna się na A).
- `BETWEEN a AND b` sprawdza zakres włączny (łącznie z a i b).
- `IN (a, b, c)` to skrót na `... = a OR ... = b OR ... = c`.
Najczęściej Zadawane Pytania
❓ Jaka jest różnica między `WHERE` a `HAVING`?
To bardzo ważne: `WHERE` filtruje pojedyncze wiersze *przed* grupowaniem (`GROUP BY`). `HAVING` filtruje całe grupy *po* grupowaniu. `WHERE` nie może być użyte z `COUNT()`, `HAVING` może.
❓ Czy mogę użyć `!=` czy muszę `<>`?
Oba operatory oznaczają 'różne od'. `!=` jest popularny w językach programowania, a `<>` jest bardziej standardowy w SQL. Na maturze oba powinny być akceptowane i działać poprawnie.
❓ Co oznaczają `_` i `%` w `LIKE`?
Są to dwa 'jokery'. `%` oznacza dowolny ciąg znaków (dowolnej długości, także zerowej). `_` (podkreślenie) oznacza *dokładnie jeden* dowolny znak (np. `LIKE 'K_t'` pasuje do 'Kot', ale nie do 'Knot').
❓ Jak filtrować puste wartości (NULL)?
Nie możesz napisać `WHERE kolumna = NULL`. Poprawna składnia to `WHERE kolumna IS NULL` (aby znaleźć puste) lub `WHERE kolumna IS NOT NULL` (aby znaleźć niepuste).
Chcesz opanować wszystkie tematy maturalne?
Dołącz do kursu i zyskaj dostęp do interaktywnych lekcji, edytora kodu i setek zadań.