Wszystkie zagadnienia: Bazy danych
podstawowy SQLWHEREoperatory porównaniamatura podstawowa z informatyki

WHERE – filtrowanie wierszy

Klauzula WHERE jako filtr wierszy tabeli, operatory porównania =, <>, <, >, <=, >= dla liczb i tekstu oraz różnica zapisu <> i != w Accessie i standardzie SQL.

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.

  • WHERE ocenia każdy wiersz osobno. Warunek nie „widzi" całej tabeli naraz – sprawdza po kolei wiersz po wierszu, niezależnie od tego, ile ich jest.
  • Filtrowanie i wybór kolumn to dwie różne decyzje. SELECT decyduje, co widać w wyniku, WHERE decyduje, co w ogóle do niego trafi.
  • Tekst w apostrofach, liczba bez nich. To najczęstsze źródło błędu składni i cichych pomyłek w warunku.
  • Granica przedziału zależy od wybranego operatora. > i < jej nie obejmują, >= i <= – obejmują.
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
-- Błędnie: tekst bez apostrofów – Access zgłasza błąd składni, zapytanie w ogóle się nie wykona
SELECT nazwisko
FROM uczniowie
WHERE klasa = 3A
-- Błędnie: liczba w apostrofach bywa potraktowana jako tekst – wynik zależy od bazy i nie jest gwarantowany
SELECT nazwisko, srednia
FROM uczniowie
WHERE srednia >= '4.00'
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ć. Różnicę zapisu `<>` i `!=` między Accessem a standardem SQL pokazuje sekcja „Dialekt" niżej.
<
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.

05

Dialekt

W AccessieStandardowy SQLZnaczenie
<> <> lub != Jedyny zapis „różne od", jaki wymienia dokumentacja Accessa – `!=` do jego składni nie należy i Access go nie przyjmuje. Standard SQL i większość innych silników (np. MySQL, SQL Server) akceptują oba zapisy zamiennie.
06

Typowe błędy

Tekst zapisany bez apostrofów. Warunek WHERE klasa = 3A Access potraktuje 3A jako niepoprawną nazwę, a nie ciąg znaków, i zgłosi błąd składni – zapytanie w ogóle się nie wykona. Poprawka: WHERE klasa = '3A'.

Liczba w apostrofach. Kolumna srednia jest liczbowa, więc warunek WHERE srednia >= '4.00' zamienia porównanie na tekstowe. Część silników po cichu porówna cyfry jak litery i zwróci złe wiersze, inne spróbują przeliczyć napis z powrotem na liczbę – wynik nie jest gwarantowany. Poprawka: WHERE srednia >= 4.00, bez apostrofów.

Operator niezgodny ze słowem z polecenia. Przy poleceniu „ocena co najmniej dobra" warunek WHERE ocena > 4 zgubi wiersze z oceną dokładnie równą 4, bo > nie obejmuje granicy. Poprawka: WHERE ocena >= 4 – „co najmniej", „nie mniej niż" i „powyżej lub równe" to zawsze operator z „=" w zapisie.

Szukanie dokładnej równości liczby ułamkowej. Warunek WHERE srednia = 4.1 może nie znaleźć niczego, mimo że na oko liczba się zgadza – w bazie wartość bywa zapisana jako 4.10 albo z przybliżeniem po przecinku. Poprawka: pytać o zakres, np. WHERE srednia >= 4.09 AND srednia <= 4.11, zamiast o punktową równość.

Alias z SELECT użyty w WHERE. Zapytanie SELECT srednia AS s FROM uczniowie WHERE s >= 4.00 kończy się błędem „nieznana kolumna", bo baza wykonuje WHERE zanim policzy listę kolumn z SELECT – alias s jeszcze nie istnieje na tym etapie. Poprawka: w warunku powtórzyć pełną nazwę kolumny, WHERE srednia >= 4.00; alias wolno użyć dopiero w ORDER BY.

Zła kolejność klauzul. Zapis SELECT nazwisko WHERE srednia >= 4.00 FROM uczniowie jest błędem składni – kolejność SELECT → FROM → WHERE jest sztywna i nie wolno zamienić FROM z WHERE miejscami, nawet jeśli sam warunek jest poprawny. Poprawka: wrócić do ustalonej kolejności klauzul.

Pobranie wszystkiego i filtrowanie „na oko". Zapytanie SELECT * FROM uczniowie i ręczne wskazanie właściwych wierszy w wyniku nie odpowiada na polecenie „wypisz uczniów ze średnią co najmniej 4,0" – w zadaniu ocenia się treść zapytania, nie to, co dałoby się wyczytać z pełnej tabeli. Poprawka: warunek zawsze zapisuje się w WHERE, nawet gdy różnicę widać gołym okiem.

07

Zapamiętaj

  • WHERE filtruje wiersze, nie kolumny – to inna decyzja niż lista po SELECT.
  • Tekst w warunku zawsze w apostrofach, liczba – nigdy.
  • > i < nie obejmują granicy, >= i <= – obejmują.
  • <> rozumie każda baza; Access zna wyłącznie ten zapis, != nie należy do jego składni.
  • Dokładna równość (=) na liczbie ułamkowej bywa zawodna – bezpieczniej pytać o zakres.
  • Alias nadany w SELECT nie działa jeszcze w WHERE – tam trzeba powtórzyć pełne wyrażenie.
  • WHERE nie znajdzie wartości pustych – do tego służy osobny operator z hasła o wartościach pustych.
08

Sprawdź się

Tabela uczniowie (te same dane co w sekcji Zapytanie):

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

Uzupełnij odpowiedzi na podstawie tabeli:

PytanieOdpowiedź
Ile wierszy zwróci SELECT nazwisko FROM uczniowie WHERE srednia > 4.00?
Ile wierszy zwróci SELECT nazwisko FROM uczniowie WHERE srednia <> 4.10?
Ile wierszy zwróci SELECT nazwisko FROM uczniowie WHERE nazwisko >= 'N'?
Jakie jedno nazwisko spełnia warunek WHERE klasa = '3C'?
Uzupełnij operator, żeby zapytanie zwróciło uczniów ze średnią niższą niż 4,0:SELECT nazwisko FROM uczniowie WHERE srednia 4.00
Uzupełnij operator, żeby zapytanie zwróciło uczniów spoza klasy 3B:SELECT nazwisko FROM uczniowie WHERE klasa '3B'

Tekst w warunku WHERE zapisujemy zawsze w , a liczbę . Operator, który obejmuje wartość graniczną i odpowiada słowom „co najmniej", to .

09

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

Czy WHERE działa razem z gwiazdką w SELECT?

Tak. SELECT * decyduje tylko o tym, że w wyniku pojawią się wszystkie kolumny – nie ma to żadnego wpływu na to, które wiersze przejdą filtr. SELECT nazwisko FROM uczniowie WHERE klasa = '3A' zwróci te same dwa wiersze, co zapytanie z konkretną listą kolumn, tylko z większą liczbą pól.

Czy w WHERE można użyć kolumny, której nie ma w SELECT?

Tak, i to bardzo częste zadanie: SELECT nazwisko FROM uczniowie WHERE srednia >= 4.00 filtruje po kolumnie srednia, choć w wyniku jej nie widać. Warunek działa na całej tabeli z FROM, niezależnie od tego, co trafiło na listę po SELECT.

Co zwróci zapytanie, jeśli warunek jest zawsze fałszywy?

Pustą tabelę – zero wierszy, bez komunikatu o błędzie. To normalne zachowanie, np. WHERE klasa = '3A' AND klasa = '3B' nigdy nie znajdzie wiersza, bo żadna klasa nie ma naraz dwóch wartości – szczegóły takich warunków złożonych opisuje hasło o operatorach logicznych.

Czy WHERE zmienia kolejność wierszy w wyniku?

Nie. WHERE tylko odsiewa wiersze niespełniające warunku – kolejność tych, które zostają, zależy od bazy i nie jest niczym gwarantowana, dopóki nie dopiszesz ORDER BY. Filtrowanie i sortowanie to dwa osobne polecenia.

Przećwicz w zadaniach maturalnych

Do tego hasła nie mamy jeszcze przypisanych pojedynczych zadań. Cały spis zadań maturalnych z tego działu jest tutaj:

Zadania z działu: SQL

↗

Powiązane zagadnienia