Aby za pomocą polecenia SELECT wyświetlić nazwiska osób mieszkających na osiedlu tak, aby te nazwiska nie powtarzały się, należy zapisać zapytanie w postaci
A.
SELECT DISTINCT nazwisko FROM mieszkancy;
B.
SELECT AVG(nazwisko) FROM mieszkancy;
C.
SELECT TOP 10 nazwisko FROM mieszkancy;
D.
SELECT nazwisko FROM mieszkancy ORDER BY nazwisko;
Pytanie z egzaminu CKE, czerwiec 2020 (arkusz EE.09-SG-20.06).
W tym zapytaniu kluczowe jest użycie słowa DISTINCT: SELECT DISTINCT nazwisko FROM mieszkancy;. W SQL oznacza ono, że wynik ma zawierać tylko unikalne wartości z wybranej kolumny lub zestawu kolumn. Czyli jeśli w tabeli mieszkancy kilka osób ma nazwisko Kowalski, to w wyniku zobaczysz je tylko raz. To jest dokładnie to, o co chodzi w pytaniu: wyświetlić nazwiska bez powtórzeń. Moim zdaniem warto zapamiętać, że DISTINCT działa na wynik zapytania, a nie usuwa danych z tabeli. Baza nadal przechowuje wszystkie rekordy mieszkańców, tylko prezentacja danych jest oczyszczona z duplikatów. W praktyce używa się tego np. do listy miast klientów, nazwisk mieszkańców, kategorii produktów albo działów pracowników. Dobrą praktyką jest też, jeśli wynik ma być czytelny, dopisać sortowanie: SELECT DISTINCT nazwisko FROM mieszkancy ORDER BY nazwisko;. DISTINCT jest elementem standardowego SQL i działa w większości systemów baz danych, choć szczegóły sortowania mogą zależeć od ustawień porównywania tekstu, czyli tzw. collation.
W tym zadaniu łatwo pomylić kilka różnych operacji wykonywanych przez SELECT, bo wszystkie wyglądają podobnie: coś wybieramy z tabeli i dostajemy wynik. Samo SELECT nazwisko FROM mieszkancy ORDER BY nazwisko; tylko sortuje rekordy według nazwiska. ORDER BY porządkuje dane alfabetycznie, ale nie usuwa powtórzeń. Jeśli w tabeli są trzy osoby o nazwisku Nowak, to po sortowaniu nadal pojawią się trzy wiersze z tym samym nazwiskiem, tylko będą ustawione obok siebie. To częsty błąd myślowy: uporządkowanie danych wydaje się czasem tym samym co ich pogrupowanie, ale w SQL to zupełnie inna rzecz. Konstrukcja SELECT TOP 10 nazwisko FROM mieszkancy; ogranicza liczbę zwracanych rekordów, zwykle do dziesięciu pierwszych według domyślnej kolejności albo według ORDER BY, jeśli go dodamy. Nie gwarantuje unikalności, więc może zwrócić dziesięć wierszy, w tym powtarzające się nazwiska. Do tego TOP jest charakterystyczne głównie dla MS SQL Server, a nie jest najbardziej uniwersalnym rozwiązaniem w standardowym SQL. Z kolei AVG(nazwisko) jest merytorycznie nietrafione, bo AVG oblicza średnią arytmetyczną z danych liczbowych. Nazwisko to tekst, a nie wartość numeryczna, więc taka funkcja agregująca nie ma tu sensu i w wielu bazach zakończy się błędem. Właściwe podejście polega na świadomym użyciu DISTINCT, bo ono usuwa duplikaty z wyniku zapytania bez modyfikowania tabeli źródłowej.