SELECT COUNT(cena) FROM uslugi; Przedstawione zapytanie wybierze
SELECT COUNT(cena) FROM uslugi;Przedstawione zapytanie wybierze
A. sumę cen usług w tabeli.
B. wszystkie ceny usług w tabeli.
C. liczbę wszystkich cen usług w tabeli.
D. średnią cenę usług w tabeli.
Pytanie z egzaminu CKE, czerwiec 2023 (arkusz EE.09-SG-23.06).
Zapytanie SELECT COUNT(cena) FROM uslugi; używa funkcji agregującej COUNT, czyli zliczania. W tym przypadku baza danych nie zwraca samych wartości z kolumny cena, tylko jedną liczbę: ile wartości w tej kolumnie zostało znalezionych. Ważny szczegół praktyczny jest taki, że COUNT(cena) zlicza tylko wartości niepuste, czyli inne niż NULL. Jeśli jakaś usługa nie ma wpisanej ceny, to taka komórka nie zostanie policzona. Gdyby chodziło o liczbę wszystkich rekordów w tabeli, częściej stosuje się COUNT(*). Moim zdaniem to jest jeden z tych drobiazgów SQL, które naprawdę warto zapamiętać, bo potem przy raportach sprzedażowych łatwo o przekłamania. W praktyce takie zapytanie może służyć np. do sprawdzenia, ile usług ma uzupełnioną cenę w cenniku. Dobre praktyki mówią, żeby świadomie wybierać między COUNT(kolumna), COUNT(*) oraz funkcjami SUM i AVG, bo każda z nich odpowiada na inne pytanie biznesowe.
W tym zapytaniu łatwo pomylić różne funkcje agregujące SQL, bo wszystkie pracują na kolumnach i zwracają jakiś wynik zbiorczy. SELECT COUNT(cena) FROM uslugi; nie oblicza sumy cen, ponieważ do sumowania służy funkcja SUM(cena). Gdyby tabela zawierała usługi za 100, 200 i 300 zł, SUM zwróciłoby 600, natomiast COUNT(cena) zwróciłoby 3, o ile żadna z tych wartości nie jest NULL. To zupełnie inna informacja. Nie jest to też średnia cena usług, bo średnią wylicza AVG(cena). AVG bierze wartości liczbowe i oblicza przeciętną, a COUNT tylko liczy, ile takich wartości istnieje. Częsty błąd myślowy polega na tym, że skoro w nawiasie jest nazwa kolumny cena, to ktoś zakłada, że SQL pokaże ceny albo coś na nich policzy matematycznie. Tak nie działa składnia SELECT z funkcją agregującą. Zapytanie nie zwróci również wszystkich cen z tabeli. Do tego wystarczyłoby SELECT cena FROM uslugi; bez COUNT. Funkcja COUNT zmienia charakter wyniku: zamiast wielu wierszy dostajesz jedną wartość liczbową. Warto też pamiętać o NULL, bo COUNT(cena) pomija puste ceny. Z mojego doświadczenia wynika, że to właśnie rozróżnienie między COUNT(cena) i COUNT(*) często wychodzi dopiero przy prawdziwych danych, kiedy raport nagle nie zgadza się z liczbą rekordów w tabeli.