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 AND pensja >= 3000 AND pensja < 4000;
B.
WHERE kierownik = true OR pensja >= 3000 OR pensja < 4000;
C.
WHERE kierownik = true AND pensja > 3000 AND pensja <= 4000;
D.
WHERE kierownik = true AND pensja >= 3000 OR pensja < 4000;
Warunek jest zapisany poprawnie, bo łączy dwa wymagania: pracownik ma być kierownikiem oraz jego pensja ma należeć do przedziału <3000, 4000), czyli od 3000 włącznie do 4000 bez 4000. W SQL zapisuje się to jako kierownik = true AND pensja >= 3000 AND pensja < 4000. Operator >= oznacza, że wartość 3000 też przejdzie przez filtr, natomiast operator < przy 4000 odrzuci dokładnie pensję równą 4000. To jest ważny detal, bo w bazach danych takie granice często decydują np. o przyznaniu premii, grupie podatkowej albo zakresie raportu kadrowego. Moim zdaniem warto zapamiętać, że BETWEEN nie byłby tutaj najlepszy, bo w SQL zwykle obejmuje oba końce przedziału, czyli działałby jak pensja >= 3000 AND pensja <= 4000. Dobra praktyka to zapisywać warunki zakresu jawnie, szczególnie gdy jedna granica jest domknięta, a druga otwarta. Użycie AND jest też konieczne, bo wszystkie warunki muszą być spełnione naraz, a nie tylko jeden z nich.
W tym zadaniu najważniejsze jest poprawne odczytanie przedziału <3000, 4000). Lewy nawias ostry w polskiej notacji szkolnej oznacza tutaj granicę domkniętą, więc pensja 3000 ma zostać zaakceptowana. Prawy nawias okrągły oznacza granicę otwartą, więc pensja 4000 ma być odrzucona. Jeśli ktoś zapisze pensja > 3000 AND pensja <= 4000, to tak naprawdę sprawdza odwrotny przypadek graniczny: pomija 3000, a przyjmuje 4000. Niby mała różnica, ale w raportach z bazy danych daje inne rekordy, czyli wynik jest merytorycznie błędny. Drugi częsty problem to użycie operatora OR zamiast AND. OR oznacza, że wystarczy spełnienie jednego warunku, więc filtr robi się za szeroki. Wyrażenie z pensja >= 3000 OR pensja < 4000 dla zwykłych liczbowych pensji prawie zawsze przepuszcza ogromną część tabeli, bo liczba albo jest większa/równa 3000, albo mniejsza niż 4000. Do tego kierownik = true połączone przez OR dopuściłoby osoby, które są kierownikami niezależnie od pensji, albo osoby z pasującą pensją niezależnie od tego, czy są kierownikami. Jest też pułapka związana z priorytetem operatorów: w SQL AND ma wyższy priorytet niż OR. Zapis kierownik = true AND pensja >= 3000 OR pensja < 4000 zostanie więc zinterpretowany mniej więcej jako (kierownik = true AND pensja >= 3000) OR pensja < 4000. To oznacza, że pracownik niebędący kierownikiem, ale z pensją poniżej 4000, również trafi do wyniku. Z mojego doświadczenia to jedna z najczęstszych pomyłek przy kwerendach: człowiek myśli po polsku, a baza danych wykonuje dokładnie logikę operatorów. Dlatego przy warunkach mieszanych warto stosować nawiasy oraz świadomie dobierać AND, gdy wymagania mają być spełnione jednocześnie.