Poprawnie – to zapytanie zwraca liczbę uczniów, których kolumna „srednia” ma wartość równą dokładnie 5. Funkcja agregująca COUNT(*) w SQL nie liczy sumy ani średniej, tylko po prostu zlicza wiersze spełniające warunek w klauzuli WHERE. W tym przypadku tabela Uczniowie jest filtrowana warunkiem srednia = 5, więc do liczenia trafiają wyłącznie rekordy uczniów, którzy mają średnią ocen równą 5. Dopiero na takim przefiltrowanym zbiorze wykonywany jest COUNT(*), który zwraca jedną liczbę – ile takich rekordów istnieje. Moim zdaniem to jedno z najczęściej używanych połączeń: WHERE + COUNT(*), bo w praktyce non stop chcemy wiedzieć „ile jest elementów spełniających warunek”. W raportach, panelach administracyjnych, dashboardach – np. ile jest klientów z określonym statusem, ilu użytkowników ma aktywne konto, ilu pracowników ma premię powyżej jakiegoś progu itd. Warto też zauważyć, że COUNT(*) liczy wszystkie wiersze, niezależnie od tego, czy jakieś inne kolumny są NULL, a kluczowe jest tylko to, że warunek WHERE jest spełniony. Dobrą praktyką jest zawsze dokładne określanie warunku filtrowania, bo drobna zmiana, np. srednia >= 5 zamiast srednia = 5, całkowicie zmienia znaczenie zapytania. W projektowaniu baz danych i zapytań SQL takie precyzyjne myślenie o warunkach i funkcjach agregujących jest absolutną podstawą profesjonalnej pracy z danymi.
To zapytanie bardzo dobrze pokazuje, jak łatwo jest pomylić różne typy operacji w SQL: zliczanie, sumowanie i obliczanie średniej. Wiele osób widząc tabelę Uczniowie i kolumnę srednia automatycznie myśli o obliczaniu średnich albo sum ocen, a tymczasem kluczowe jest tu słowo kluczowe COUNT(*) oraz warunek w klauzuli WHERE. Funkcja COUNT(*) nie oblicza ani średniej, ani sumy wartości liczbowych – ona jedynie zlicza wiersze. Niezależnie od tego, co jest w kolumnach, COUNT(*) po prostu mówi: „ile rekordów przeszło przez filtr WHERE”. Dlatego interpretacja, że wynik to liczba wszystkich uczniów, jest niepoprawna, bo zapytanie nie działa na całej tabeli, tylko na jej podzbiorze określonym przez srednia = 5. Gdyby ktoś chciał policzyć wszystkich uczniów, nie używałby warunku WHERE albo zastosowałby inny warunek, który obejmuje wszystkich. Błędne jest też kojarzenie tego zapytania z obliczaniem średniej ocen wszystkich uczniów. Do tego służyłaby funkcja AVG(srednia) albo AVG(ocena), w zależności od struktury bazy. Tutaj nie ma żadnej funkcji AVG, więc silnik bazy danych nie wykonuje żadnego uśredniania, tylko zwykłe zliczanie rekordów. Podobnie z interpretacją, że wynik to suma ocen uczniów – do sumowania wartości liczbowych wykorzystuje się funkcję SUM(kolumna), a nie COUNT(*). Typowy błąd myślowy polega na tym, że ktoś widzi dane „szkolne” i od razu narzuca im kontekst matematyczny, ignorując faktyczną składnię SQL. Z mojego doświadczenia wynika, że warto patrzeć na zapytania SQL w dwóch krokach: najpierw zrozumieć filtr (czyli WHERE – które rekordy przechodzą dalej), a dopiero potem funkcję agregującą (czyli co robimy z tym zbiorem: liczymy, sumujemy, uśredniamy). W tym zadaniu filtr przepuszcza wyłącznie uczniów z średnią równą 5, a agregacja COUNT(*) liczy ilu ich jest. Wszystkie inne interpretacje pojawiają się zwykle z pośpiechu, braku uwagi do słów kluczowych lub mylenia nazw funkcji agregujących, co w praktycznej pracy z bazami danych potrafi mocno wypaczyć wyniki raportów.