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) orazOR(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
WHEREto klauzula, która filtruje wiersze.- Jest (logicznie) wykonywana po
FROM, a przedSELECTiORDER 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) iOR(jeden prawdziwy). Używaj nawiasów()dla pewności. LIKEsłuży do wyszukiwania wzorców (np.LIKE 'A%'- zaczyna się na A).BETWEEN a AND bsprawdza 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ń.