W tabeli mieszkancy z polami id, imie, nazwisko, ulica, numer, czynsz (wartość całkowita) należy wybrać dane osób mieszkających na ulicy Mickiewicza pod numerami 71, 72, 80, których czynsz jest niższy niż 1000 zł. Klauzula WHERE do zapytania będzie miała postać
A.
WHERE ulica = 'Mickiewicza' AND numer IN (71, 72, 80) AND czynsz < 1000
B.
WHERE ulica = 'Mickiewicza' AND numer > 70 AND numer < 81 OR czynsz < 1000
C.
WHERE ulica = 'Mickiewicza' AND numer IN (71, 72, 80) OR czynsz < 1000
D.
WHERE ulica = 'Mickiewicza' OR numer IN (71, 72, 80) OR czynsz < 1000
Pytanie z egzaminu CKE, czerwiec 2022 (arkusz EE.09-SG-22.06).
Ta klauzula WHERE spełnia dokładnie wszystkie warunki z treści zadania, czyli filtruje rekordy po ulicy, konkretnych numerach budynków oraz wysokości czynszu. Warunek ulica = 'Mickiewicza' ogranicza wynik tylko do mieszkańców tej ulicy. Operator IN (71, 72, 80) jest tu bardzo dobrym wyborem, bo sprawdza, czy wartość pola numer należy do konkretnego zbioru wartości. To jest czytelniejsze i praktyczniejsze niż pisanie numer = 71 OR numer = 72 OR numer = 80. Na końcu czynsz < 1000 wybiera tylko te osoby, których czynsz jest niższy niż 1000 zł, bez wliczania dokładnie 1000. Wszystkie warunki są połączone operatorem AND, więc muszą być spełnione jednocześnie. W praktyce to bardzo ważne, bo w bazach danych precyzja filtrowania decyduje o poprawności raportów, zestawień i działania aplikacji. Moim zdaniem warto zapamiętać zasadę: gdy użytkownik ma spełniać kilka wymagań naraz, używamy AND, a gdy dopuszczamy alternatywy, wtedy OR. Taka konstrukcja jest zgodna z typowym stylem SQL i dobrą praktyką pisania czytelnych zapytań.
W tym zadaniu łatwo pomylić znaczenie operatorów logicznych AND i OR, a to w SQL potrafi całkowicie zmienić wynik zapytania. Warunki z treści zadania nie są alternatywami. Osoba ma mieszkać na ulicy Mickiewicza, ma mieć numer budynku równy 71, 72 albo 80 i jednocześnie jej czynsz ma być niższy niż 1000 zł. To oznacza, że między głównymi warunkami powinien występować operator AND. Użycie OR przy warunku czynsz < 1000 spowodowałoby, że baza zwróci także osoby z innych ulic lub innych numerów, jeśli tylko mają czynsz poniżej 1000. To już nie jest zgodne z poleceniem, tylko dużo szerszy filtr. Podobny problem pojawia się, gdy wszystkie warunki połączy się przez OR: wtedy wystarczy spełnienie dowolnego jednego kryterium, na przykład sama ulica Mickiewicza albo sam niski czynsz. Wynik byłby mocno za duży. Trzeba też uważać na zakres numer > 70 AND numer < 81, bo obejmuje on nie tylko 71, 72 i 80, ale też 73, 74, 75, 76, 77, 78 i 79. Polecenie wskazuje konkretne numery, więc operator IN jest tu bardziej precyzyjny. Z mojego doświadczenia to klasyczny błąd: ktoś widzi kilka warunków i miesza logikę wyboru wartości z logiką filtrowania rekordów. Dobra praktyka jest taka, żeby dla zamkniętej listy dopuszczalnych wartości używać IN, a dla warunków, które wszystkie muszą być spełnione, stosować AND. W bardziej złożonych zapytaniach warto też dodawać nawiasy, bo SQL ma określoną kolejność wykonywania operatorów, a AND ma wyższy priorytet niż OR.