Baza danych zawiera tabelę ksiazki o polach: tytul, id_autora, data_wypoz, id_czytelnika. Każdego dnia generowany jest raport książek wypożyczonych danego dnia. Wyświetlane są jedynie tytuły książek. Która z kwerend SQL posłuży do stworzenia tego raportu?
A.
SELECT tytul FROM ksiazki WHERE data_wypoz = CURRENT_DATE();
B.
SELECT tytul, data_wypoz FROM ksiazki WHERE data_wypoz = CURRENT_DATE();
C.
SELECT * FROM ksiazki;
D.
SELECT tytul FROM ksiazki;
Pytanie z egzaminu CKE, czerwiec 2022 (arkusz E.14-SG-22.06).
Ta kwerenda spełnia oba warunki opisane w zadaniu: wybiera tylko kolumnę tytul oraz ogranicza wynik do rekordów, w których data_wypoz jest równa bieżącej dacie. Fragment SELECT tytul odpowiada za projekcję, czyli wskazanie, które pola mają znaleźć się w wyniku. Dzięki temu raport nie pokazuje id_autora, id_czytelnika ani samej daty wypożyczenia, bo użytkownik ma dostać wyłącznie tytuły książek. Warunek WHERE data_wypoz = CURRENT_DATE() wykonuje filtrowanie rekordów i zostawia tylko książki wypożyczone dzisiaj. To jest bardzo typowy schemat raportów dziennych w SQL: wybieramy potrzebne kolumny, a potem zawężamy rekordy warunkiem daty. Moim zdaniem warto tu zapamiętać różnicę między listą kolumn po SELECT a warunkiem WHERE, bo to często ratuje przed robieniem zbyt szerokich raportów. W praktycznych systemach bibliotecznych taka kwerenda mogłaby być uruchamiana automatycznie rano lub wieczorem, np. przez panel administratora albo zadanie cykliczne. Dobra praktyka jest taka, żeby pobierać tylko te dane, które naprawdę są potrzebne. Mniej danych w wyniku to czytelniejszy raport, mniejsze obciążenie bazy i mniejsze ryzyko ujawnienia informacji, które nie powinny być pokazywane. Drobna uwaga z życia: jeżeli data_wypoz byłaby typu DATETIME z godziną, samo porównanie do CURRENT_DATE() mogłoby nie zadziałać tak, jak oczekujemy. Wtedy stosuje się zakres od początku do końca dnia albo funkcje rzutujące datę, zależnie od systemu bazodanowego.
W tym zadaniu łatwo pomylić dwie rzeczy: wybór kolumn z filtrowaniem rekordów. Samo SELECT tytul FROM ksiazki pokazuje rzeczywiście tylko tytuły, ale nie sprawdza daty wypożyczenia. Taki wynik byłby listą wszystkich książek zapisanych w tabeli, a nie raportem z bieżącego dnia. To częsty błąd myślowy: skoro raport ma wyświetlać tytuły, ktoś skupia się tylko na części SELECT i zapomina, że raport dzienny musi mieć warunek czasowy w WHERE. Z kolei SELECT * FROM ksiazki jest jeszcze szersze, bo pobiera wszystkie pola tabeli: tytul, id_autora, data_wypoz oraz id_czytelnika. W praktyce to słabe podejście, bo łamie wymaganie wyświetlania jedynie tytułów i dodatkowo zwraca dane, które nie są potrzebne. W systemach produkcyjnych unika się SELECT *, szczególnie w raportach, bo struktura tabeli może się zmienić, a aplikacja nagle zacznie dostawać więcej danych niż przewidziano. Jest też wariant, który poprawnie filtruje po data_wypoz = CURRENT_DATE(), ale wybiera tytul i data_wypoz. Logicznie jest bliżej celu, jednak nadal nie spełnia treści polecenia, bo raport ma pokazywać jedynie tytuły książek. To niby mały szczegół, ale w SQL szczegóły są ważne. Lista po SELECT określa format wyniku, a WHERE określa, które wiersze mają przejść przez filtr. Poprawne rozwiązanie musi więc połączyć oba elementy: ograniczyć kolumny do tytul i ograniczyć rekordy do dzisiejszej daty wypożyczenia. Z mojego doświadczenia wynika, że najlepszy nawyk to czytać polecenie w dwóch krokach: co ma być wyświetlone oraz które rekordy mają zostać uwzględnione.