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 spełniają co najmniej jeden z warunków: mają więcej niż 3000 punktów i jednocześnie wykonali zakupy więcej niż 100 razy albo ostatnie zakupy wykonali co najmniej w roku 2022, ma postać
A.
WHERE punkty > 3000 AND (liczbaZakupow > 100 OR ostatnieZakupy >= '2022-01-01')
B.
WHERE punkty > 3000 AND liczbaZakupow > 100 OR ostatnieZakupy >= '2022-01-01'
C.
WHERE (punkty > 3000 OR liczbaZakupow > 100) AND ostatnieZakupy >= '2022-01-01'
D.
WHERE punkty > 3000 OR liczbaZakupow > 100 OR ostatnieZakupy >= '2022-01-01'
Ta klauzula jest poprawna, bo dokładnie odwzorowuje logikę warunku z treści zadania: klient ma spełniać co najmniej jeden z dwóch większych warunków. Pierwszy warunek złożony to: punkty > 3000 AND liczbaZakupow > 100, czyli klient ma jednocześnie dużo punktów i dużo zakupów. Drugi warunek to: ostatnieZakupy >= '2022-01-01', czyli ostatni zakup był wykonany od początku roku 2022 lub później. W SQL operator AND ma wyższy priorytet niż OR, więc zapis WHERE punkty > 3000 AND liczbaZakupow > 100 OR ostatnieZakupy >= '2022-01-01' jest interpretowany tak, jakby było: WHERE (punkty > 3000 AND liczbaZakupow > 100) OR ostatnieZakupy >= '2022-01-01'. To jest właśnie sens zdania z pytania. W praktyce, moim zdaniem, lepiej i czytelniej byłoby dopisać nawiasy, nawet jeśli SQL ich tu nie wymaga, bo zmniejsza to ryzyko pomyłki przy późniejszej edycji zapytania. W bazach produkcyjnych takie warunki często służą np. do wyboru klientów VIP albo osób objętych promocją. Trzeba też pamiętać, że format daty 'YYYY-MM-DD' jest typowy i bezpieczny w SQL, szczególnie przy porównaniach wartości typu DATE.
W tym zadaniu najważniejsze jest poprawne odczytanie logiki zdania oraz znajomość priorytetu operatorów w SQL. Warunek z treści nie oznacza, że data zakupu musi być spełniona razem z pozostałymi warunkami. Jeśli zapisujemy coś w stylu: (punkty > 3000 OR liczbaZakupow > 100) AND ostatnieZakupy >= '2022-01-01', to robimy z daty warunek obowiązkowy dla każdego klienta. Taki zapis odrzuciłby klienta, który ma np. 5000 punktów i 150 zakupów, ale ostatnio kupował w 2021 roku, mimo że według treści powinien przejść przez filtr, bo spełnia pierwszy warunek złożony. Z drugiej strony zapis oparty wyłącznie na OR między wszystkimi trzema porównaniami jest za szeroki. Wtedy wystarczyłoby mieć tylko więcej niż 3000 punktów albo tylko więcej niż 100 zakupów, a w poleceniu wyraźnie jest mowa, że te dwa kryteria mają wystąpić jednocześnie. To częsty błąd: ktoś widzi zwrot co najmniej jeden z warunków i automatycznie wstawia OR wszędzie, bez sprawdzenia, które warunki są złożone. Niepoprawne jest też uzależnianie całego wyniku od liczby punktów, czyli logika punkty > 3000 AND (liczbaZakupow > 100 OR ostatnieZakupy >= '2022-01-01'). Taki filtr pominąłby klienta, który ostatni zakup miał w 2023 roku, ale ma mało punktów, a przecież sam warunek daty miał wystarczyć. W SQL trzeba pamiętać, że AND wykonuje się przed OR, podobnie jak mnożenie przed dodawaniem w matematyce. Z mojego doświadczenia najlepiej przy takich zapytaniach najpierw rozpisać sobie warunki słownie, a potem dodać nawiasy dla czytelności, nawet gdy silnik bazy i tak zna kolejność działań.