KWALIFIKACJA INF3 - STYCZEŃ 2024 (test 2)

PYTANIE NR 13.
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.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Warunek ma wybrać klientów spełniających (punkty > 3000 LUB liczbaZakupow > 100) oraz jednocześnie takich, u których data ostatnieZakupy jest nie wcześniejsza niż początek 2022 roku. Nawiasy są kluczowe, bo OR ma niższy priorytet niż AND i bez nich logika zapytania się zmienia.

Pełne wyjaśnienie:

Opis słowny zawiera dwa poziomy warunków:

  • pierwszy poziom: klient ma więcej niż 3000 punktów albo wykonał więcej niż 100 zakupów;
  • drugi poziom: ostatnie zakupy były co najmniej w roku 2022 (czyli data nie jest wcześniejsza niż początek 2022).

Dlatego poprawna logika to: (A OR B) AND C. W praktyce zapisuje się to z nawiasami:

WHERE (punkty > 3000 OR liczbaZakupow > 100) AND ostatnieZakupy >= '2022-01'

Nawiasy są istotne, ponieważ w SQL operator AND ma wyższy priorytet niż OR. Bez nawiasów silnik mógłby zinterpretować warunek jako A OR (B AND C), a to daje inny zbiór wyników niż wymagany w treści.

Dlaczego pozostałe propozycje są błędne:

  • Łączenie punkty > 3000 AND liczbaZakupow > 100 wymaga spełnienia jednocześnie obu kryteriów aktywności, mimo że w treści jest alternatywa ("albo"). To zbyt zawęża wynik.
  • Użycie OR pomiędzy wszystkimi trzema warunkami powoduje, że wystarczy spełnić tylko warunek daty, aby rekord się pojawił. Treść wymaga natomiast, aby warunek daty był spełniony zawsze, razem z jednym z warunków aktywności.
  • Zapis z trzema operatorami AND wymusza spełnienie wszystkich kryteriów, co jest sprzeczne z częścią "więcej niż 3000 punktów albo więcej niż 100 zakupów".

Wskazówka egzaminacyjna: najpierw zamień opis na symbole (A, B, C), ułóż formułę logiczną (tu: (A OR B) AND C), a dopiero potem przepisz na SQL. To minimalizuje ryzyko błędu priorytetu AND/OR.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
W SQL zwykle AND ma wyższy priorytet niż OR, więc wyrażenie bez nawiasów może zostać policzone inaczej, niż czytasz je "po kolei". Aby wymusić właściwą logikę, stosuj nawiasy, np. (A OR B) AND C.
Nawiasy wymuszają, aby najpierw została oceniona alternatywa: punkty lub liczbaZakupow. Bez nawiasów silnik może związać AND z drugim warunkiem i otrzymasz logikę typu A OR (B AND C), co zmienia wyniki.
To znaczy, że data w polu typu DATE nie może być wcześniejsza niż początek 2022 roku. Najczęściej zapisuje się to jako porównanie do daty granicznej, np. ostatnieZakupy >= '2022-01-01' (dokładny zapis zależy od silnika i przyjętego formatu dat).
"Albo" odpowiada operatorowi OR, a "oraz" operatorowi AND. Typowy błąd to użycie samych AND (zbyt wąski wynik) albo samych OR (zbyt szeroki wynik). Dodatkowo często pomija się nawiasy, co zmienia kolejność oceny.
Najbezpieczniej stosować pełny format YYYY-MM-DD, bo jest jednoznaczny dla typu DATE w wielu silnikach. Skrócone zapisy mogą być różnie interpretowane lub zależne od ustawień. Na egzaminie warto trzymać się pełnej daty, jeśli nie podano inaczej.
Najprościej przygotować kilka rekordów testowych: jeden spełniający tylko warunek punktów, drugi tylko liczbę zakupów, trzeci tylko datę oraz czwarty spełniający wszystkie. Uruchom zapytanie i sprawdź, czy pojawiają się wyłącznie rekordy spełniające logikę (A OR B) AND C.
Typ DATE reprezentuje datę bez czasu. Porównania typu >= działają chronologicznie, ale ważne jest, aby literał był poprawnie rozpoznany jako data. Jeśli podasz tekst w nietypowym formacie, silnik może go skonwertować inaczej albo odrzucić, zależnie od DBMS.
Funkcje typu YEAR(data) bywają używane, gdy pytanie dotyczy wyłącznie roku. Trzeba jednak uważać, bo użycie funkcji na kolumnie może utrudniać wykorzystanie indeksu. Często lepiej porównywać do zakresu dat, np. od 2022-01-01.
To typowy filtr do segmentacji klientów: wybierasz osoby "wartościowe" (wysokie punkty lub dużo zakupów), ale tylko aktywne w ostatnim okresie (zakupy od 2022). Takie kryteria wykorzystuje się w raportach, kampaniach lojalnościowych i analizie retencji.
Zamień opis na logikę: A = punkty, B = liczba zakupów, C = data. Ułóż formułę: (A OR B) AND C, a dopiero potem przepisz na SQL. Zawsze dodawaj nawiasy, gdy mieszasz AND i OR, nawet jeśli wydaje się to "oczywiste".
info

Statystycznie 46% uczniów zna prawidłową odpowiedź. trudne

Według specjalistów z branży: "Warunek ma wybrać klientów spełniających (punkty > 3000 LUB liczbaZakupow > 100) oraz jednocześnie takich, u których data ostatnieZakupy jest nie wcześniejsza niż początek 2022 roku."

Źródła:

  • MySQL 8.0 Reference Manual: "12.3.2 The DATE, DATETIME, and TIMESTAMP Types" (format YYYY-MM-DD) https://dev.mysql.com/doc/refman/8.0/en/datetime.html - dostęp 2026-03-01
  • PostgreSQL Documentation: "8.5. Date/Time Types" oraz opis wprowadzania wartości daty https://www.postgresql.org/docs/current/datatype-datetime.html - dostęp 2026-03-01
  • Microsoft Learn (SQL Server): "Logical Operators (Transact-SQL)" (AND/OR, zasady łączenia) https://learn.microsoft.com/en-us/sql/t-sql/language-elements/logical-operators-transact-sql - dostęp 2026-03-01

Materiały:

  • Dokumentacja silnika bazy danych używanego na zajęciach (sekcje: WHERE, AND/OR, typ DATE)
  • Ćwiczenia z przekształcania opisu słownego na wyrażenia logiczne
  • Zadania praktyczne: tworzenie zapytań z łączonymi warunkami i testowanie wyników na danych przykładowych

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego