KWALIFIKACJA INF3 - CZERWIEC 2021 (test 2)

PYTANIE NR 13.
Dana jest tabela uczniowie o polach id, nazwisko, imie, klasa. Które zapytanie SQL wyświetli liczbę osób w poszczególnych klasach oraz nazwę klasy?
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Poprawne zapytanie musi zgrupować rekordy po kolumnie klasa oraz użyć funkcji agregującej do zliczenia osób w każdej grupie. Dlatego właściwe jest połączenie COUNT(id) z GROUP BY klasa. Samo ORDER BY tylko sortuje, a SUM(id) nie liczy osób.

Pełne wyjaśnienie:

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.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
GROUP BY grupuje wiersze o tej samej wartości w wybranej kolumnie (np. klasa) w jedną grupę. Dzięki temu można policzyć lub podsumować dane w ramach każdej grupy, używając funkcji agregujących, np. COUNT, SUM, AVG.
COUNT zlicza liczbę rekordów (wierszy) spełniających warunek. SUM dodaje wartości liczbowe z kolumny. Kolumna id to identyfikator, więc jego suma nie oznacza "liczby uczniów" i daje przypadkowe, nieinterpretowalne wyniki.
Tak. COUNT(*) zlicza wszystkie wiersze w grupie, niezależnie od tego, czy konkretna kolumna ma NULL. COUNT(id) nie zlicza NULL w kolumnie id. W praktyce id zwykle jest NOT NULL, więc oba warianty dadzą ten sam wynik.
GROUP BY zmienia "ziarnistość" danych: z wielu rekordów robi jeden wynik na grupę (np. na klasę). ORDER BY tylko sortuje wynik (np. alfabetycznie po klasie) i nie wykonuje agregacji. Często stosuje się oba: najpierw GROUP BY, potem ORDER BY.
Stosuje się agregację: wybierasz kolumnę grupującą (klasa) oraz funkcję zliczającą (COUNT), a następnie dodajesz GROUP BY klasa. To klasyczny wzorzec raportowania: "miara" + "wymiar".
Gdy w SELECT masz funkcję agregującą (np. COUNT) i jednocześnie zwykłą kolumnę (np. klasa), wiele baz wymaga, aby ta kolumna była w GROUP BY. Samo ORDER BY nie rozwiązuje problemu, bo nie definiuje grupowania.
Użyj aliasów po wyrażeniach w SELECT, np. COUNT(id) AS liczba oraz klasa AS nazwa_klasy. Alias ułatwia odczyt wyniku i późniejsze użycie w aplikacji (np. w JSON lub w widoku tabeli w panelu admina).
Różnica pojawia się, gdy w kolumnie liczonej występują wartości NULL. COUNT(kolumna) nie zlicza NULL, a COUNT(*) zlicza wszystkie wiersze. Jeśli id jest kluczem głównym, zwykle jest NOT NULL, więc wyniki są takie same.
Dodaj filtr w WHERE, np. ograniczając do konkretnych wartości klasy. Najpierw filtrujesz wiersze (WHERE), potem grupujesz (GROUP BY) i liczysz (COUNT). To typowa kolejność logiczna w raportach dla aplikacji internetowych.
Najczęstsze pomyłki to: mylenie ORDER BY z GROUP BY, użycie niewłaściwej funkcji (SUM zamiast COUNT), brak dopasowania kolumn w SELECT do klauzuli GROUP BY oraz ignorowanie wpływu NULL na COUNT(kolumna). Warto ćwiczyć na małych tabelach.
info

Statystycznie 56% uczniów zna prawidłową odpowiedź. średnie

Według specjalistów z branży: "Poprawne zapytanie musi zgrupować rekordy po kolumnie klasa oraz użyć funkcji agregującej do zliczenia osób w każdej grupie."

Źródła:

  • PostgreSQL Documentation: "GROUP BY" (SQL Commands) https://www.postgresql.org/docs/current/sql-select.html (accessed 2026-03-01)
  • MySQL 8.0 Reference Manual: "GROUP BY" and aggregate functions https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html (accessed 2026-03-01)
  • SQLite Documentation: "Aggregate Functions" (COUNT, SUM) https://sqlite.org/lang_aggfunc.html (accessed 2026-03-01)

Materiały:

  • Dokumentacja DBMS (np. MySQL/PostgreSQL): sekcje o COUNT(), SUM() i GROUP BY
  • Kurs podstaw SQL: agregacje i grupowanie
  • Zadania praktyczne: tworzenie raportów z użyciem GROUP BY

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego