W bazie danych sklepu internetowego, w tabeli klienci znajdują się między innymi pola całkowite: punkty, liczbaZakupow oraz pole ostatnieZakupy typu DATE. Klauzula WHERE do kwerendy wybierającej dane klientów, którzy mają więcej niż 3000 punktów albo wykonali zakupy więcej niż 100 razy, a ostatnie zakupy wykonali co najmniej w roku 2022, ma postać
A.
WHERE punkty > 3000 AND liczbaZakupow > 100 AND ostatnieZakupy >= '2022-01-01'
B.
WHERE (punkty > 3000 OR liczbaZakupow > 100) AND ostatnieZakupy >= '2022-01'
C.
WHERE punkty > 3000 AND liczbaZakupow > 100 OR ostatnieZakupy >= '2022-01-01'
D.
WHERE punkty > 3000 OR liczbaZakupow > 100 OR ostatnieZakupy >= '2022-01-01'
Pytanie z egzaminu CKE, styczeń 2024 (arkusz EE.09-SG-24.01).
Ta klauzula jest poprawna, bo dokładnie oddaje warunek z treści zadania: klient ma spełniać jeden z dwóch warunków dotyczących aktywności lub lojalności, czyli punkty > 3000 albo liczbaZakupow > 100, a oprócz tego jego ostatnie zakupy mają być wykonane nie wcześniej niż od początku 2022 roku. Dlatego część z OR jest zamknięta w nawiasach: WHERE (punkty > 3000 OR liczbaZakupow > 100) AND ostatnieZakupy >= '2022-01'. Bez nawiasów SQL mógłby zinterpretować warunki inaczej, bo operator AND ma wyższy priorytet niż OR. W praktyce takie filtrowanie jest bardzo częste, np. przy wybieraniu klientów do programu lojalnościowego, kampanii mailingowej albo rabatu dla aktywnych kupujących. Moim zdaniem najważniejsza lekcja z tego pytania to właśnie świadome grupowanie warunków logicznych. W dobrych praktykach SQL warto też dla pola DATE stosować pełny zapis daty, np. '2022-01-01', bo jest czytelniejszy i bardziej przenośny między różnymi systemami baz danych. W tym zadaniu zapis '2022-01' oznacza granicę od stycznia 2022, ale w realnym projekcie pełna data byłaby bezpieczniejsza.
W tym zadaniu łatwo pomylić się przez naturalne czytanie zdania od lewej do prawej. Warunek „więcej niż 3000 punktów albo zakupy więcej niż 100 razy” tworzy jedną grupę logiczną, a dopiero do tej grupy trzeba dołączyć warunek daty. Jeśli wszystkie trzy części zostaną połączone przez OR, to zapytanie wybierze również klientów, którzy tylko mają zakupy od 2022 roku, nawet gdy mają mało punktów i mało zakupów. To już nie jest ta sama selekcja, bo data przestaje być obowiązkowym warunkiem. Z kolei zapis bez nawiasów z połączeniem AND oraz OR bywa zdradliwy, ponieważ w SQL operator AND jest wykonywany przed OR. Wtedy baza może odczytać warunek mniej więcej jako: klient ma dużo punktów i dużo zakupów albo ma ostatnie zakupy od 2022 roku. To przepuści za dużo rekordów. Niepoprawne jest też wymaganie jednocześnie punkty > 3000 i liczbaZakupow > 100, bo treść mówi „albo”, a nie „i”. Takie rozróżnienie jest bardzo ważne w bazach danych, szczególnie przy raportach sprzedażowych, segmentacji klientów i filtrowaniu danych do kampanii. Z mojego doświadczenia najlepiej zawsze dopisać nawiasy tam, gdzie mieszają się OR i AND, nawet jeśli znamy priorytety operatorów. Kod SQL jest wtedy czytelniejszy dla innych osób i mniej podatny na głupie, ale kosztowne błędy.