W tabeli mieszkancy zapisane są osoby z całej Polski. Aby policzyć, ile różnych miast występuje w danych tabeli, należy zapisać kwerendę
A.
SELECT COUNT(miasto) FROM mieszkancy;
B.
SELECT DISTINCT miasto FROM mieszkancy;
C.
SELECT COUNT(DISTINCT miasto) FROM mieszkancy;
D.
SELECT COUNT(miasto) FROM mieszkancy DISTINCT;
Pytanie z egzaminu CKE, styczeń 2024 (arkusz EE.09-SG-24.01).
Zapytanie SELECT COUNT(DISTINCT miasto) FROM mieszkancy; jest właściwe, bo łączy dwie potrzebne operacje: usunięcie powtórzeń oraz policzenie wyniku. DISTINCT powoduje, że baza danych bierze pod uwagę tylko unikalne wartości z kolumny miasto, czyli np. Warszawa występująca 500 razy zostanie potraktowana jako jedna wartość. COUNT(...) następnie zlicza, ile takich różnych wartości zostało znalezionych. W praktyce to bardzo częsty schemat w raportach, statystykach i panelach administracyjnych, np. gdy chcemy sprawdzić liczbę miast klientów, liczbę kategorii produktów albo liczbę unikalnych adresów e-mail. Z mojego doświadczenia warto zapamiętać, że DISTINCT umieszczamy wewnątrz funkcji agregującej, jeśli chcemy policzyć unikalne wystąpienia, a nie tylko je wypisać. W większości systemów SQL, takich jak MySQL, PostgreSQL czy SQL Server, COUNT(DISTINCT kolumna) liczy unikalne wartości niepuste, czyli zwykle pomija NULL. To też jest dobra praktyka: zapytanie jest krótkie, czytelne i jednoznacznie mówi, jaki wynik ma zwrócić baza.
W tym zadaniu łatwo pomylić samo liczenie rekordów z liczeniem różnych wartości w kolumnie. Jeżeli użyje się SELECT COUNT(miasto) FROM mieszkancy;, baza danych policzy liczbę niepustych wpisów w kolumnie miasto, a nie liczbę unikalnych miast. Czyli jeśli w tabeli jest 10 000 osób, a połowa z nich mieszka w Krakowie, to Kraków nadal zostanie policzony wiele razy. To jest typowy błąd myślowy: kolumna nazywa się miasto, więc ktoś zakłada, że COUNT(miasto) liczy miasta jako byty, a SQL tak nie działa. SQL liczy wiersze lub wartości, zależnie od funkcji i argumentu.
Samo SELECT DISTINCT miasto FROM mieszkancy; też nie rozwiązuje zadania do końca. Taka kwerenda zwróci listę różnych miast, np. Gdańsk, Poznań, Łódź, ale nie poda jednej liczby jako wyniku. Jest przydatna, gdy chcemy zobaczyć zestawienie nazw, jednak pytanie brzmi: ile różnych miast występuje w danych. Do tego potrzebna jest funkcja agregująca COUNT.
Niepoprawne jest również dopisywanie DISTINCT po nazwie tabeli, czyli w stylu FROM mieszkancy DISTINCT. W standardowej składni SQL DISTINCT występuje po SELECT albo wewnątrz funkcji agregującej, np. COUNT(DISTINCT miasto). Umieszczenie go po FROM jest składniowo błędne w popularnych bazach danych. Moim zdaniem najlepsza zasada do zapamiętania jest prosta: gdy chcesz wypisać unikalne wartości, użyj SELECT DISTINCT kolumna, a gdy chcesz je policzyć, użyj SELECT COUNT(DISTINCT kolumna).
Samo SELECT DISTINCT miasto FROM mieszkancy; też nie rozwiązuje zadania do końca. Taka kwerenda zwróci listę różnych miast, np. Gdańsk, Poznań, Łódź, ale nie poda jednej liczby jako wyniku. Jest przydatna, gdy chcemy zobaczyć zestawienie nazw, jednak pytanie brzmi: ile różnych miast występuje w danych. Do tego potrzebna jest funkcja agregująca COUNT.
Niepoprawne jest również dopisywanie DISTINCT po nazwie tabeli, czyli w stylu FROM mieszkancy DISTINCT. W standardowej składni SQL DISTINCT występuje po SELECT albo wewnątrz funkcji agregującej, np. COUNT(DISTINCT miasto). Umieszczenie go po FROM jest składniowo błędne w popularnych bazach danych. Moim zdaniem najlepsza zasada do zapamiętania jest prosta: gdy chcesz wypisać unikalne wartości, użyj SELECT DISTINCT kolumna, a gdy chcesz je policzyć, użyj SELECT COUNT(DISTINCT kolumna).