łatwySQLSQL

SQL WHERE - Filtrowanie i Warunki w Zapytaniach

10 min czytania
SQL
Zaktualizowano: 4.11.2025

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?

  1. Krok 1: Zapytanie zaczyna się od `SELECT ... FROM tabela ...`.
  2. Krok 2: Dodajesz klauzulę `WHERE`, a po niej warunek logiczny.
  3. Krok 3: Operatory Porównania: Najczęściej używasz: `=` (równe), `!=` lub `<>` (różne), `>`, `<`, `>=`, `<=`.
  4. Krok 4: Wartości Tekstowe (Stringi): Zawsze umieszczaj w pojedynczych cudzysłowach, np. `WHERE imie = 'Anna'`.
  5. Krok 5: Wartości Numeryczne: Używaj bez cudzysłowów, np. `WHERE punkty > 80`.
  6. Krok 6: Operatory Logiczne: Możesz łączyć warunki za pomocą `AND` (oba muszą być prawdziwe) oraz `OR` (przynajmniej jeden musi być prawdziwy).
  7. 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

Matura 2026Zadanie Zadanie Typu Maturalnego 1

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';`
Matura 2024Zadanie 8.5 (Matura Próbna Grudzień 2024)

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ń.

Powiązane Tematy