Dana jest tabela uczniowie o polach id, imie, nazwisko, data_ur (format rrrr-mm-dd). Które zapytanie w języku SQL wyświetli tylko imiona i nazwiska uczniów urodzonych w 2001 roku?
A.
SELECT imie, nazwisko FROM uczniowie WHERE data_ur like "2001-%-%";
B.
SELECT * FROM uczniowie WHERE data_ur == 2001-%-%;
C.
SELECT id, imie, nazwisko, data_ur FROM uczniowie WHERE data_ur like "2001-*-*";
D.
SELECT * FROM uczniowie WHERE data_ur like "2001";
Pytanie z egzaminu CKE, czerwiec 2021 (arkusz E.14-SG-21.06).
Zapytanie SELECT imie, nazwisko FROM uczniowie WHERE data_ur like '2001-%-%'; spełnia oba warunki z treści zadania: wybiera tylko kolumny imie i nazwisko oraz filtruje rekordy uczniów urodzonych w roku 2001. Operator LIKE służy do porównywania tekstu z wzorcem, a znak % oznacza dowolny ciąg znaków. Ponieważ data ma format rrrr-mm-dd, początek wartości daty to właśnie rok. Wzorzec '2001-%-%' pasuje więc np. do 2001-01-15, 2001-06-03 i 2001-12-31. Nie pasuje za to do 2000-12-31 ani 2002-01-01. Moim zdaniem to bardzo czytelny sposób przy nauce SQL, bo dobrze pokazuje działanie maski tekstowej. W praktyce branżowej, jeśli pole data_ur jest prawdziwym typem DATE, często lepszą praktyką jest użycie zakresu dat, np. data_ur >= '2001-01-01' AND data_ur < '2002-01-01', bo baza może wtedy efektywniej użyć indeksu. Jednak w tym zadaniu chodzi o dopasowanie do formatu rrrr-mm-dd i wyświetlenie tylko dwóch wymaganych pól, więc podane zapytanie jest właściwe.
W tym zadaniu łatwo pomylić dwie rzeczy: filtrowanie rekordów i wybór kolumn do wyświetlenia. Samo znalezienie uczniów z odpowiedniego roku nie wystarczy, bo polecenie mówi wyraźnie, że mają zostać pokazane tylko imiona i nazwiska. Użycie SELECT * zwraca wszystkie pola tabeli, czyli także id oraz data_ur. W normalnej pracy z bazą danych to nie jest dobra praktyka, jeżeli nie potrzebujemy kompletu danych. Pobieramy wtedy więcej informacji niż trzeba, co może pogarszać czytelność wyniku, wydajność zapytania i czasem też bezpieczeństwo danych. Problemem jest też zapis warunku. Operator LIKE wymaga wzorca tekstowego, a przy dacie zapisanej jako rrrr-mm-dd trzeba dopasować początek ciągu, czyli rok oraz dalszą część daty. Sam wzorzec '2001' oznacza dokładnie tekst 2001, a nie dowolną datę zaczynającą się od tego roku. Brakuje tam znaku %, który w SQL zastępuje dowolny ciąg znaków. Częsty błąd to też przenoszenie składni z języków programowania, na przykład używanie == zamiast = lub LIKE. W SQL porównanie równości zapisuje się pojedynczym znakiem =, a dopasowanie wzorca właśnie przez LIKE. Z kolei gwiazdka * nie jest symbolem wieloznacznym w operatorze LIKE; w SQL do tego służy %. Gwiazdka ma inne znaczenie, na przykład w SELECT * oznacza wszystkie kolumny. Dlatego poprawne rozwiązanie musi jednocześnie wskazać konkretne kolumny imie i nazwisko oraz zastosować wzorzec pasujący do całej daty z roku 2001.