Wróć do: Bazy danych
podstawowy SQLWHEREoperatory porównaniamatura podstawowa z informatyki

WHERE – filtrowanie wierszy

Klauzula WHERE jako filtr wierszy tabeli oraz operatory porównania =, <>, <, >, <=, >= dla liczb i tekstu.

01

Opis

Samo zapytanie SELECT zwraca wszystkie wiersze tabeli. Przy dziesięciu wierszach da się to jeszcze przejrzeć wzrokiem, ale przy tysiącu – już nie. Klauzula WHERE rozwiązuje ten problem: zawęża wynik do wierszy, które spełniają podany warunek.

Kluczowa intuicja: WHERE to filtr wierszy, nie kolumn. Lista po SELECT decyduje, które kolumny zobaczysz. Warunek po WHERE decyduje, które wiersze w ogóle trafią do wyniku. To dwie niezależne decyzje i mylenie ich to jeden z częstszych błędów na starcie.

Jak to działa krok po kroku. Baza bierze pierwszy wiersz tabeli, podstawia jego wartości do warunku i sprawdza, czy wychodzi prawda. Jeśli tak – wiersz zostaje. Jeśli nie – wiersz jest odrzucany i nie pojawi się w wyniku. Potem to samo z drugim wierszem, trzecim i tak dalej, aż do końca tabeli. Wynik to zbiór wierszy, które przeszły ten test.

Warto to sobie raz przećwiczyć na kartce: wypisz tabelę, przejdź ją wiersz po wierszu i skreślaj te, które nie spełniają warunku. To, co zostało nieskreślone, jest dokładnie tym, co zwróci baza. Sekcja „Filtrowanie" niżej pozwala prześledzić dokładnie ten proces.

Porównywanie tekstu. Operatory < i > nie są zarezerwowane dla liczb – działają też na tekście, tyle że porównują alfabetycznie. Warunek nazwisko >= 'N' wybierze nazwiska od litery N do końca alfabetu. Tekst w warunku zawsze bierzemy w apostrofy ('3A'), liczb – nigdy (4.00).

Uwaga na = przy liczbach ułamkowych. Szukanie dokładnej równości średniej czy ceny bywa zawodne, bo wartość w bazie może mieć więcej miejsc po przecinku, niż widać na ekranie. W praktyce bezpieczniej pytać o zakres (>=, <=) niż o równość co do grosza.

Jeżeli w kolumnie mogą być wartości puste, pamiętaj, że nie da się ich znaleźć żadnym z powyższych operatorów – mają własny.

Gdy jeden warunek nie wystarcza, łączy się je operatorami logicznymi AND, OR i NOT. Kolejność wyświetlania wyniku ustawia się osobno – klauzulą ORDER BY.

02

Zapytanie

SELECT nazwisko, klasa, srednia
FROM uczniowie
WHERE srednia >= 4.00
Wynik zapytania
nazwiskoklasasrednia
Kowalska3A4.75
Wiśniewski3A5.10
Dąbrowski3B4.10
-- Tekst w warunku zawsze w apostrofach
SELECT nazwisko, srednia
FROM uczniowie
WHERE klasa = '3A'
Wynik zapytania
nazwiskosrednia
Kowalska4.75
Wiśniewski5.10
-- Operator <> wyklucza kategorię z wyniku
SELECT nazwisko, klasa
FROM uczniowie
WHERE klasa <> '3B'
Wynik zapytania
nazwiskoklasa
Kowalska3A
Wiśniewski3A
Zając3C
03

Operatory

=
równeZwraca wiersz tylko przy dokładnej zgodności. Przy tekście oznacza to identyczny ciąg znaków, a nie „podobny".
<>
różne odDokładne przeciwieństwo `=`. Przydaje się, gdy łatwiej wskazać, co wykluczyć, niż co zostawić. Część baz akceptuje też zapis `!=`.
<
mniejsze niżWartość z kolumny musi być mniejsza od podanej. Nie obejmuje samej wartości granicznej.
>
większe niżOdwrotność `<`. Też nie obejmuje wartości granicznej.
<=
mniejsze lub równeTo samo co `<`, ale wartość graniczna **wchodzi** do wyniku.
>=
większe lub równeTo samo co `>`, z wartością graniczną w wyniku. Najczęstszy wybór przy progach typu „co najmniej".
04

Filtrowanie

uczniowie
nazwiskoklasasrednia
Kowalska3A4.75
Nowak3B3.20
Wiśniewski3A5.10
Zając3C3.90
Dąbrowski3B4.10

Wybierz warunek i naciśnij „Krok", żeby sprawdzać wiersz po wierszu.

Na maturze

Najczęstsza pułapka to granica przedziału. Polecenie „uczniowie ze średnią co najmniej 4,0" to >= 4.00, a nie > 4.00 – przy > wypada uczeń ze średnią dokładnie 4,0. Odwrotnie przy „poniżej 4,0": to < 4.00, bo „poniżej" nie obejmuje samej czwórki. Zanim napiszesz warunek, sprawdź w treści zadania, czy pada „co najmniej", „nie mniej niż", „powyżej", czy „mniej niż" – każde z nich to inny operator.

Druga pułapka to brak apostrofów wokół tekstu. Warunek klasa = 3A skończy się błędem albo pustym wynikiem; poprawnie jest klasa = '3A'. Odwrotny błąd – apostrofy wokół liczby (srednia >= '4.00') – bywa jeszcze groźniejszy, bo część baz porówna wtedy tekstowo i po cichu zwróci złe wiersze.

Trzecia rzecz: jeśli zadanie prosi o listę „posortowaną malejąco", samo WHERE nie wystarczy – dopisz ORDER BY. Filtrowanie i sortowanie to osobne polecenia i punkty zwykle są przyznawane za oba.

06

Najczęściej zadawane pytania

Czy WHERE można postawić przed FROM?

Nie. Kolejność klauzul w zapytaniu jest sztywna: najpierw SELECT, potem FROM, potem WHERE. Zapisanie ich w innej kolejności to błąd składni, nawet jeśli sens byłby oczywisty.

Czym różni się `<>` od `NOT`?

<> porównuje dwie wartości i sprawdza, czy są różne – działa na pojedynczej kolumnie. NOT odwraca cały warunek logiczny i przydaje się dopiero przy warunkach złożonych, opisanych w operatorach logicznych. Dla prostego przypadku klasa <> '3B' i NOT klasa = '3B' dają ten sam wynik.

Dlaczego warunek na tekście czasem gubi polskie znaki?

Porównywanie tekstu zależy od ustawień sortowania w konkretnej bazie – litery ą, ć, ł mogą trafiać w innym miejscu alfabetu, niż się spodziewasz. Na maturze zwykle nie ma to znaczenia, ale warto wiedzieć, że wynik nazwisko >= 'N' na dwóch różnych bazach może się nieznacznie różnić.

Powiązane zagadnienia