Z bazy danych należy zwrócić zapytaniem SQL nazwiska pracowników, którzy są kierownikami, a ich pensja znajduje się w przedziale jednostronnie domkniętym (3000, 4000>. Która z klauzul bada ten warunek?
A.
WHERE kierownik = true OR pensja > 3000 OR pensja <= 4000;
B.
WHERE kierownik = true AND pensja => 3000 AND pensja <= 4000;
C.
WHERE kierownik = true AND pensja > 3000 AND pensja <= 4000;
D.
WHERE kierownik = true AND pensja => 3000 OR pensja < 4000;
Pytanie z egzaminu CKE, styczeń 2022 (arkusz EE.09-SG-22.01).
Warunek jest zapisany właściwie, bo dokładnie odwzorowuje treść zadania: pracownik musi być kierownikiem oraz jego pensja ma należeć do przedziału jednostronnie domkniętego (3000, 4000>. Taki zapis matematyczny oznacza: więcej niż 3000, ale maksymalnie 4000, czyli w SQL: pensja > 3000 AND pensja <= 4000. Do tego dochodzi warunek kierownik = true, więc wszystkie trzy warunki muszą być spełnione jednocześnie. Dlatego użycie operatora AND jest tutaj kluczowe. W praktyce taka klauzula WHERE odfiltruje np. kierownika z pensją 3500 albo 4000, ale nie zwróci kierownika z pensją 3000, bo lewy koniec przedziału jest otwarty. Moim zdaniem to bardzo dobre ćwiczenie, bo pokazuje różnicę między zwykłym porównaniem a precyzyjnym warunkiem zakresu. W SQL trzeba uważać też na BETWEEN, ponieważ BETWEEN 3000 AND 4000 obejmuje oba końce przedziału, więc tutaj nie pasowałby idealnie. Dobra praktyka to zapisywać takie warunki jasno i bez skrótów, szczególnie gdy później ktoś inny będzie czytał zapytanie w projekcie bazodanowym.
Najczęstszy problem w tym pytaniu polega na pomieszaniu znaczenia operatorów logicznych i operatorów porównania. Warunek z OR działa zupełnie inaczej niż wymagane filtrowanie jednoczesne. Jeśli użyje się OR między warunkami, baza danych może zwrócić rekord, który spełnia tylko jeden fragment, na przykład pracownika niebędącego kierownikiem, ale z pensją poniżej lub równą 4000. To już nie jest zgodne z poleceniem, bo polecenie mówi o pracownikach, którzy są kierownikami i jednocześnie mieszczą się w podanym zakresie pensji. W SQL operator AND zawęża wynik, a OR go rozszerza, i to jest jedna z podstawowych rzeczy przy budowie klauzuli WHERE. Pojawia się też typowy błąd składniowy: zapis => nie jest poprawnym operatorem większe lub równe w SQL. Poprawnie stosuje się >=, a w tym konkretnym zadaniu nawet nie >= 3000, tylko > 3000, bo przedział (3000, 4000> nie zawiera wartości 3000. Z kolei prawy koniec jest domknięty, więc musi być <= 4000, a nie < 4000. Z mojego doświadczenia takie pomyłki biorą się często z szybkiego czytania zapisu matematycznego albo z założenia, że zakres zawsze jest obustronnie domknięty. W zapytaniach SQL warto czytać warunek jak zdanie: kierownik jest prawdą oraz pensja większa od 3000 oraz pensja nie większa niż 4000. Wtedy od razu widać, że wszystkie części muszą być połączone operatorem AND.