Dana jest tabela zwierzeta z polami nazwa, gatunek, gromada, cechy, dlugosc_zycia. Dla dowolnego zestawu danych, aby wyświetlić nazwy tych zwierząt, które żyją przynajmniej 20 lat oraz są ssakami, należy wydać zapytanie:
A.
SELECT nazwa FROM zwierzeta WHERE dlugosc_zycia >=20 OR gromada = 'ssak';
B.
SELECT nazwa FROM zwierzeta WHERE dlugosc_zycia >=20 AND gromada = 'ssak';
C.
SELECT nazwa FROM zwierzeta WHERE dlugosc_zycia >=20;
D.
SELECT nazwa FROM zwierzeta WHERE gromada = 'ssak';
Pytanie z egzaminu CKE, styczeń 2020 (arkusz EE.09-SG-20.01).
Zapytanie SELECT nazwa FROM zwierzeta WHERE dlugosc_zycia >= 20 AND gromada = 'ssak'; spełnia dokładnie oba warunki podane w treści zadania. Z tabeli zwierzeta pobierana jest tylko kolumna nazwa, czyli wynik nie będzie zawierał niepotrzebnych danych, takich jak gatunek, cechy czy długość życia. To jest dobra praktyka w SQL: wybieramy tylko te kolumny, które są naprawdę potrzebne, bo wynik jest czytelniejszy i często mniej obciąża bazę danych. Warunek dlugosc_zycia >= 20 oznacza, że zwierzę ma żyć co najmniej 20 lat, więc uwzględnia też dokładnie wartość 20, a nie tylko większe liczby. Operator AND jest tu kluczowy, bo wymaga jednoczesnego spełnienia obu kryteriów: zwierzę ma być ssakiem i ma żyć przynajmniej 20 lat. Gdyby w bazie był np. słoń jako ssak żyjący 60 lat, zostałby pokazany. Ale papuga żyjąca 50 lat już nie, bo nie jest ssakiem. Moim zdaniem to bardzo typowy przykład, który dobrze pokazuje, jak ważne jest dokładne czytanie treści i przekładanie słowa „oraz” na operator AND w SQL.
W tym zadaniu najważniejsze jest to, że warunki muszą zostać spełnione jednocześnie. Treść mówi o zwierzętach, które żyją przynajmniej 20 lat oraz są ssakami, więc samo sprawdzenie długości życia nie wystarczy. Takie zapytanie zwróciłoby też zwierzęta długowieczne, ale należące do innych gromad, na przykład ptaki albo gady. Dla dowolnego zestawu danych byłby to wynik zbyt szeroki, czyli niezgodny z wymaganiem. Podobny problem pojawia się przy filtrowaniu wyłącznie po gromadzie. Jeśli zapytanie sprawdza tylko gromada = 'ssak', to pokaże także ssaki żyjące krócej niż 20 lat. A przecież warunek wieku życia nadal obowiązuje. To częsty błąd: zauważamy jeden fragment polecenia i od razu budujemy WHERE tylko na jego podstawie, pomijając resztę kryteriów. Najbardziej mylący bywa operator OR. W języku potocznym czasem brzmi niewinnie, ale w SQL oznacza alternatywę: wystarczy, że prawdziwy jest jeden z warunków. Czyli wynik zawierałby zarówno wszystkie ssaki, niezależnie od długości życia, jak i wszystkie zwierzęta żyjące 20 lat lub dłużej, nawet jeśli ssakami nie są. To kompletnie zmienia sens zapytania. Z mojego doświadczenia warto tłumaczyć sobie warunek WHERE na zwykłe zdanie: „pokaż rekord, jeżeli długość życia jest >= 20 i gromada to ssak”. Słowo „i” prawie zawsze prowadzi tu do AND. Dobra praktyka w bazach danych polega na możliwie precyzyjnym filtrowaniu rekordów, bo niepoprawny warunek może dać formalnie działające zapytanie, ale merytorycznie błędny raport.