W języku SQL dla dowolnych zestawów danych w tabeli Uczniowie, aby wybrać rekordy, które zawierają wyłącznie uczennice o imieniu „Aleksandra”, urodzone po roku „1998”, należy zapisać zapytanie
A.
SELECT * FROM Uczniowie WHERE imie="Aleksandra" OR rok_urodzenia < "1998";
B.
SELECT * FROM Uczniowie WHERE imie="Aleksandra" OR rok_urodzenia > "1998";
C.
SELECT * FROM Uczniowie WHERE imie="Aleksandra" AND rok_urodzenia < "1998";
D.
SELECT * FROM Uczniowie WHERE imie="Aleksandra" AND rok_urodzenia > "1998";
Pytanie z egzaminu CKE, styczeń 2018 (arkusz E.14-X-18.01).
To zapytanie spełnia oba warunki naraz: wybiera rekordy z tabeli Uczniowie tylko wtedy, gdy pole imie ma wartość „Aleksandra” oraz pole rok_urodzenia jest większe niż 1998. Operator AND jest tutaj kluczowy, bo oznacza logiczne „i”, czyli każdy zwrócony rekord musi przejść oba filtry jednocześnie. Warunek rok_urodzenia > 1998 dobrze oddaje sformułowanie „urodzone po roku 1998”, więc obejmuje np. lata 1999, 2000, 2001 itd., ale nie 1998. W praktyce takie zapytanie mogłoby wyglądać najlepiej tak: SELECT * FROM Uczniowie WHERE imie = 'Aleksandra' AND rok_urodzenia > 1998;. Moim zdaniem warto zapamiętać, że w standardzie SQL tekst zapisuje się w apostrofach, a liczby bez cudzysłowu, jeśli kolumna ma typ liczbowy. Cudzysłowy czasem działają w wybranych systemach, ale nie jest to dobra, przenośna praktyka. SELECT * jest wygodne w testach i prostych ćwiczeniach, natomiast w realnych projektach lepiej podawać konkretne kolumny, np. imie, nazwisko, rok_urodzenia, bo zapytanie jest czytelniejsze i zwykle mniej obciąża bazę.
W tym zadaniu najłatwiej pomylić dwa różne pomysły: „spełnia jeden z warunków” oraz „spełnia wszystkie warunki”. Operator OR oznacza alternatywę, czyli rekord zostanie wybrany, gdy imię będzie równe Aleksandra albo rok urodzenia będzie zgodny z podanym porównaniem. To daje za szeroki wynik. Do takiego wyniku mogłyby trafić osoby o imieniu Aleksandra urodzone w dowolnym roku, ale też uczniowie o innych imionach, jeżeli tylko ich rok urodzenia pasuje do warunku. A pytanie mówi o rekordach zawierających wyłącznie uczennice o imieniu Aleksandra urodzone po roku 1998, więc filtr ma być zawężający, nie rozszerzający. Z mojego doświadczenia to klasyczny błąd przy SQL: czytamy zdanie po polsku i widzimy dwa kryteria, ale nie zastanawiamy się, czy mają działać razem, czy zamiennie. Drugi problem to znak porównania. Rok mniejszy niż 1998 oznacza osoby urodzone przed 1998, czyli starsze, a nie po tym roku. Dla „po roku 1998” potrzebne jest rok_urodzenia > 1998. Warto też pamiętać o typach danych. Jeżeli rok_urodzenia jest liczbą, dobrym stylem jest porównywać go z liczbą 1998, a nie z tekstem '1998'. Baza często sobie z tym poradzi przez konwersję typów, ale w pracy zawodowej takie drobiazgi mogą prowadzić do dziwnych błędów, szczególnie przy innych formatach dat albo różnych silnikach baz danych.