Tabela samochody zawiera poniższe rekordy.
| id | klasa_id | marka | model | rocznik |
|---|---|---|---|---|
| 1 | 1 | ford | ka | 2017 |
| 2 | 2 | seat | toledo | 2016 |
| 3 | 3 | opel | zafira | 2018 |
| 4 | 2 | fiat | 500X | 2018 |
| 5 | 3 | opel | insignia | 2017 |
SELECT model FROM samochody WHERE rocznik > 2017 AND marka = "opel";
Zapytanie zwraca wyłącznie wartość z kolumny model dla tych rekordów, które spełniają oba warunki jednocześnie. Warunek rocznik > 2017 oznacza, że interesują nas tylko samochody nowsze niż 2017, czyli z rocznikiem 2018 i późniejsze. W tabeli są dwa auta z rocznika 2018: opel zafira oraz fiat 500X. Drugi warunek, marka = 'opel', odrzuca fiata, więc zostaje tylko rekord: marka opel, model zafira, rocznik 2018. Ponieważ w części SELECT podano tylko kolumnę model, wynik nie zawiera marki ani rocznika, tylko sam tekst: zafira. To ważna rzecz w SQL: WHERE decyduje, które wiersze przejdą filtr, a SELECT decyduje, które kolumny z tych wierszy będą pokazane. Moim zdaniem to jedno z najczęstszych miejsc, gdzie łatwo się pomylić na początku nauki baz danych. W praktyce takie zapytania stosuje się np. w katalogu samochodów, sklepie internetowym albo panelu administracyjnym, gdy chcemy znaleźć konkretne rekordy według kilku kryteriów. Dobrą praktyką w standardowym SQL jest zapisywanie tekstów w apostrofach, czyli marka = 'opel', bo cudzysłów w niektórych systemach baz danych może oznaczać identyfikator kolumny lub tabeli.
W tym zapytaniu trzeba bardzo dokładnie rozdzielić dwie sprawy: filtrowanie rekordów i wybór kolumn do wyświetlenia. Warunek WHERE rocznik > 2017 AND marka = 'opel' nie oznacza, że należy pokazać wszystkie ople z tabeli. Operator AND wymaga spełnienia obu warunków naraz, więc opel insignia z rocznika 2017 odpada, bo 2017 nie jest większe od 2017. To drobny detal, ale w SQL znak > jest ścisły, czyli nie obejmuje wartości równej. Gdyby miało przejść także 2017, trzeba by użyć rocznik >= 2017. Częstym błędem jest też dopisywanie do wyniku marki, na przykład traktowanie wyniku jako „opel zafira”. Tymczasem SELECT model jasno mówi, że zwracana jest tylko kolumna model, bez kolumny marka. Baza danych nie dopisuje automatycznie innych pól tylko dlatego, że były użyte w warunku WHERE. Podobnie wynik „zafira; insignia” bierze się zwykle z zauważenia marki opel, ale pominięcia ograniczenia na rocznik. Natomiast „opel zafira; opel insignia” miesza oba błędy naraz: pokazuje zbyt wiele rekordów oraz zbyt wiele kolumn. Z mojego doświadczenia najlepiej analizować takie zapytanie etapami: najpierw odfiltrować wiersze po roczniku, potem po marce, a dopiero na końcu spojrzeć, co jest w SELECT. Tak działa to też w realnych aplikacjach, np. przy wyszukiwarkach ofert, raportach i panelach administracyjnych.