Dana jest tabela zwierzeta z polami nazwa, gatunek, gromada, cechy, dlugosc_zycia. Dla dowolnego zestawu danych, aby wyświetlić nazwy tych ssaków, które żyją od 10 do 20 lat włącznie, należy wydać zapytanie:
A.
SELECT nazwa FROM zwierzeta WHERE gromada = 'ssak';
B.
SELECT nazwa FROM zwierzeta WHERE dlugosc_zycia BETWEEN 10 AND 20 OR gromada = 'ssak';
C.
SELECT nazwa FROM zwierzeta WHERE dlugosc_zycia BETWEEN 10 AND 20 AND gromada = 'ssak';
D.
SELECT nazwa FROM zwierzeta WHERE dlugosc_zycia BETWEEN 10 AND 20;
To zapytanie spełnia oba warunki podane w treści: wybiera tylko kolumnę nazwa z tabeli zwierzeta oraz filtruje rekordy po długości życia i gromadzie. Warunek dlugosc_zycia BETWEEN 10 AND 20 oznacza zakres domknięty, czyli obejmuje także wartości 10 i 20. To ważny szczegół, bo w pytaniu jest napisane od 10 do 20 lat włącznie. Drugi warunek, gromada = 'ssak', ogranicza wynik wyłącznie do ssaków. Operator AND działa jak logiczne i, więc rekord musi jednocześnie spełniać oba kryteria. W praktyce takie zapytanie stosuje się np. w katalogach zwierząt, bazach ogrodów zoologicznych albo systemach edukacyjnych, gdzie trzeba szybko odfiltrować dane według kilku cech. Moim zdaniem to jest bardzo typowy przykład dobrej kwerendy SELECT: wybieramy tylko potrzebną kolumnę, a warunki zapisujemy jasno w klauzuli WHERE. W bazach danych to dobra praktyka, bo nie pobieramy niepotrzebnych pól i wynik jest konkretny, przewidywalny oraz łatwy do dalszego użycia, np. w aplikacji PHP albo panelu administracyjnym.
W tym zadaniu łatwo pomylić pojedynczy warunek z pełnym wymaganiem biznesowym. Treść mówi o nazwach ssaków, które żyją od 10 do 20 lat włącznie, więc zapytanie musi jednocześnie sprawdzać gromadę zwierzęcia oraz zakres wartości w kolumnie dlugosc_zycia. Samo użycie dlugosc_zycia BETWEEN 10 AND 20 filtruje tylko po wieku życia, ale nie rozróżnia, czy zwierzę jest ssakiem, ptakiem, gadem czy jeszcze inną gromadą. Dla dowolnego zestawu danych mogłyby więc pojawić się wyniki, które nie pasują do pytania. Z kolei warunek gromada = 'ssak' wybierze wszystkie ssaki, także takie, które żyją 3 lata albo 70 lat, więc też jest za szeroki. Częsty błąd to skupienie się na jednym słowie kluczowym z polecenia i pominięcie reszty ograniczeń.
Trzeba też uważać na operator OR. W SQL OR oznacza alternatywę: wystarczy, że spełniony jest jeden z warunków. Zapytanie z OR zwróci więc zwierzęta żyjące 10-20 lat nawet wtedy, gdy nie są ssakami, oraz wszystkie ssaki niezależnie od długości życia. To klasyczna pułapka przy filtrowaniu danych. Z mojego doświadczenia wynika, że w zadaniach typu „ma być A oraz B” prawie zawsze potrzebny jest operator AND, bo interesuje nas część wspólna zbiorów, a nie suma wyników. Poprawne myślenie jest takie: najpierw ograniczamy rekordy do zakresu 10-20, potem dodatkowo wymagamy gromady ssak. Dopiero rekord spełniający oba warunki powinien trafić do wyniku.
Trzeba też uważać na operator OR. W SQL OR oznacza alternatywę: wystarczy, że spełniony jest jeden z warunków. Zapytanie z OR zwróci więc zwierzęta żyjące 10-20 lat nawet wtedy, gdy nie są ssakami, oraz wszystkie ssaki niezależnie od długości życia. To klasyczna pułapka przy filtrowaniu danych. Z mojego doświadczenia wynika, że w zadaniach typu „ma być A oraz B” prawie zawsze potrzebny jest operator AND, bo interesuje nas część wspólna zbiorów, a nie suma wyników. Poprawne myślenie jest takie: najpierw ograniczamy rekordy do zakresu 10-20, potem dodatkowo wymagamy gromady ssak. Dopiero rekord spełniający oba warunki powinien trafić do wyniku.