Z tabeli mieszkancy należy wybrać niepowtarzające się nazwy miast, w tym celu należy skorzystać z wyrażenia SQL zawierającego klauzulę
A. CHECK
B. UNIQUE
C. HAVING
D. DISTINCT
Pytanie z egzaminu CKE, czerwiec 2022 (arkusz EE.09-SG-22.06).
W tym przypadku właściwą klauzulą jest DISTINCT, ponieważ służy ona do usuwania duplikatów z wyniku zapytania SELECT. Jeżeli w tabeli mieszkancy kilka osób mieszka w tym samym mieście, zwykłe zapytanie SELECT miasto FROM mieszkancy; zwróci nazwę miasta tyle razy, ile rekordów ją zawiera. Natomiast SELECT DISTINCT miasto FROM mieszkancy; pokaże każdą nazwę miasta tylko raz, np. Warszawa, Kraków, Gdańsk bez powtórek. To jest bardzo praktyczne przy raportach, filtrach w panelu administracyjnym albo listach wyboru w formularzach, gdzie nie chcemy mieć dziesięciu identycznych pozycji. Moim zdaniem DISTINCT to jedna z tych klauzul SQL, które warto od razu kojarzyć z hasłem „unikalne wyniki”. Dobra praktyka jest taka, żeby stosować ją świadomie, bo baza danych musi porównać rekordy i czasem posortować lub zgrupować dane wewnętrznie, więc przy dużych tabelach może to mieć wpływ na wydajność. Mimo to w standardowym SQL właśnie DISTINCT jest poprawnym i czytelnym sposobem na pobranie niepowtarzających się wartości z kolumny.
W tym pytaniu łatwo pomylić kilka słów kluczowych SQL, bo wszystkie brzmią dość „bazodanowo” i kojarzą się z kontrolą danych. UNIQUE rzeczywiście ma związek z unikalnością, ale najczęściej używa się go przy definiowaniu ograniczeń tabeli albo indeksów, np. żeby w kolumnie email nie dało się wpisać dwóch takich samych adresów. To działa na poziomie struktury danych i integralności bazy, a nie jako typowa klauzula do filtrowania wyniku zapytania SELECT. W praktyce, gdy chcesz tylko wyświetlić listę miast bez powtórzeń, nie tworzysz ograniczenia UNIQUE na kolumnie miasto, bo wiele osób może przecież mieszkać w tym samym mieście.
CHECK również nie pasuje do tego zadania. Ta klauzula służy do sprawdzania warunków poprawności danych, na przykład wiek >= 18 albo cena > 0. Jest to mechanizm walidacji przy wstawianiu lub modyfikowaniu rekordów, nie narzędzie do wybierania niepowtarzalnych wartości. HAVING z kolei bywa mylone z WHERE albo DISTINCT, bo pojawia się w zapytaniach agregujących. Używa się go do filtrowania grup po GROUP BY, na przykład miasta, w których liczba mieszkańców w tabeli jest większa niż 100. Samo HAVING nie oznacza jednak „usuń duplikaty”. Typowy błąd myślowy polega tu na tym, że ktoś widzi słowo związane z ograniczaniem danych i zakłada, że chodzi o wynik zapytania. A w SQL trzeba odróżniać ograniczenia tabeli, walidację danych, filtrowanie grup i eliminowanie duplikatów. Do tego ostatniego, w przenośnym i czytelnym SQL, służy SELECT DISTINCT.
CHECK również nie pasuje do tego zadania. Ta klauzula służy do sprawdzania warunków poprawności danych, na przykład wiek >= 18 albo cena > 0. Jest to mechanizm walidacji przy wstawianiu lub modyfikowaniu rekordów, nie narzędzie do wybierania niepowtarzalnych wartości. HAVING z kolei bywa mylone z WHERE albo DISTINCT, bo pojawia się w zapytaniach agregujących. Używa się go do filtrowania grup po GROUP BY, na przykład miasta, w których liczba mieszkańców w tabeli jest większa niż 100. Samo HAVING nie oznacza jednak „usuń duplikaty”. Typowy błąd myślowy polega tu na tym, że ktoś widzi słowo związane z ograniczaniem danych i zakłada, że chodzi o wynik zapytania. A w SQL trzeba odróżniać ograniczenia tabeli, walidację danych, filtrowanie grup i eliminowanie duplikatów. Do tego ostatniego, w przenośnym i czytelnym SQL, służy SELECT DISTINCT.