Poprawnie: wyrażenie SELECT COUNT(wartosc) ma za zadanie zwrócić liczbę wierszy, w których kolumna wartosc nie jest pusta (czyli nie ma wartości NULL). Funkcja agregująca COUNT() w SQL właśnie do tego służy – zlicza rekordy. W wersji COUNT(nazwa_kolumny) zliczane są tylko te wiersze, gdzie w tej kolumnie znajduje się jakaś konkretna wartość. To jest ważne rozróżnienie: COUNT(*) liczy wszystkie wiersze w tabeli lub wyniku kwerendy, natomiast COUNT(wartosc) pomija rekordy z NULL w tej kolumnie. Moim zdaniem to jedna z podstawowych rzeczy, które trzeba mieć „w ręku”, pracując z bazami danych. W praktyce używa się tego np. do sprawdzenia, ilu klientów podało numer telefonu, ilu pracowników ma przypisaną premię, ile zamówień ma ustawioną datę realizacji itd. Zamiast ręcznie przeglądać dane, odpalasz prostą kwerendę: SELECT COUNT(telefon) FROM klienci; i od razu wiesz, ile jest uzupełnionych pól. Dobre praktyki mówią też, żeby świadomie wybierać pomiędzy COUNT(*) a COUNT(kolumna), bo dają one różne wyniki przy brakach danych. W raportowaniu biznesowym to ma ogromne znaczenie, bo łatwo wyciągnąć złe wnioski, jeśli ktoś nie rozumie, co dokładnie liczy dana funkcja. W projektach komercyjnych COUNT() jest jedną z najczęściej używanych funkcji agregujących obok SUM(), AVG(), MIN() i MAX(), więc warto od razu nauczyć się jej poprawnej interpretacji i stosowania w połączeniu z klauzulą WHERE oraz GROUP BY, żeby liczyć wiersze spełniające konkretne warunki, np. ilu użytkowników aktywowało konto w danym miesiącu.
Funkcja COUNT() w SQL bardzo często bywa mylona z innymi funkcjami agregującymi, takimi jak SUM() czy AVG(), i stąd biorą się nietrafione interpretacje tego typu zapytań. Trzeba jasno podkreślić: COUNT(wartosc) nie zwraca ani liczby kolumn, ani sumy wartości, ani średniej. Zlicza wiersze, w których dana kolumna ma ustawioną jakąś wartość, czyli nie jest NULL. To jest operacja na rekordach, a nie na strukturze tabeli. Liczba kolumn w tabeli jest cechą schematu bazy danych i jej się nie wyciąga funkcją COUNT() w taki sposób; do tego służą metadane systemowe, np. odpowiednie zapytania do information_schema w systemach zgodnych ze standardem SQL. Mylenie COUNT z operacjami na strukturze wynika często z intuicji, że „liczę coś w SELECT, więc może kolumny”, ale SQL tak nie działa. Z kolei oczekiwanie, że COUNT(wartosc) policzy sumę lub średnią, bierze się z mieszania pojęć między różnymi funkcjami agregującymi. SUM(wartosc) faktycznie dodaje wszystkie nie-NULL wartości w danej kolumnie, a AVG(wartosc) oblicza z nich średnią arytmetyczną. COUNT natomiast w ogóle nie zagląda do treści liczbowej czy tekstowej, interesuje go tylko, czy wiersz ma wartość, czy ma NULL. Typowy błąd myślowy polega na tym, że ktoś widzi w SELECT jakąś nazwę funkcji i kolumnę w nawiasie i automatycznie zakłada, że wynik będzie „jakimś przetworzeniem” danych – sumą, średnią, czymś w tym stylu. Tymczasem w SQL każda funkcja ma bardzo precyzyjnie zdefiniowane działanie i trzeba znać różnice. Dobre praktyki mówią, żeby zawsze dobierać funkcję agregującą do konkretnego pytania biznesowego: jeśli pytasz „ile rekordów?”, używasz COUNT; jeśli „jaka jest łączna wartość?”, wtedy SUM; jeśli „jaka jest przeciętna wartość?”, wtedy AVG. Warto też pamiętać o różnicy między COUNT(*) a COUNT(kolumna), bo to kolejna pułapka: pierwsze liczy wszystkie wiersze, nawet z NULL-ami, drugie tylko te z uzupełnioną wartością. Świadome korzystanie z tych funkcji to podstawa rzetelnej analizy danych w każdej profesjonalnej bazie.