Aby wyświetlić liczbę osób w poszczególnych klasach oraz nazwę klasy, zapytanie musi wykonać dwa kroki logiczne:
- Podzielić (pogrupować) wiersze tabeli na grupy według wartości w kolumnie klasa.
- Policzyć liczbę wierszy w każdej grupie przy pomocy funkcji agregującej.
Do grupowania służy klauzula GROUP BY klasa. Dzięki niej baza tworzy osobne "koszyki" dla każdej wartości klasy (np. 1A, 1B itd.). Następnie COUNT(id) zlicza, ile rekordów (uczniów) znajduje się w każdej takiej grupie. W efekcie wynik ma po jednym wierszu na klasę, zawierając parę: liczba uczniów i nazwa klasy.
Dlaczego pozostałe odpowiedzi są niepoprawne?
- SUM(id) sumuje wartości liczbowe w kolumnie id. Identyfikator jest kluczem technicznym i jego suma nie ma związku z liczbą osób; może dawać dowolne, mylące wartości.
- ORDER BY klasa jedynie sortuje rekordy, nie tworzy agregacji. Bez GROUP BY zapytanie nie zwróci "jednego wiersza na klasę", tylko nadal będzie operować na pojedynczych rekordach (albo będzie niezgodne z regułami agregacji w wielu DBMS).
- Połączenie SUM(id) z GROUP BY klasa poprawnie tworzy grupy, ale nadal liczy niewłaściwą miarę (sumę identyfikatorów zamiast liczby uczniów).
W praktyce spotkasz też warianty typu COUNT(*) (zliczanie wszystkich wierszy) lub nadawanie aliasów kolumnom, ale rdzeń rozwiązania pozostaje ten sam: COUNT + GROUP BY dla kolumny grupującej.