KWALIFIKACJA INF3 - STYCZEŃ 2019

PYTANIE NR 23.
Które zapytanie SQL dla tabeli pracownicy utworzonej według schematu: id, imie, nazwisko, plec, zarobek, obliczy osobno średni zarobek kobiet i średni zarobek mężczyzn?
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Poprawne zapytanie musi policzyć średnią w dwóch grupach rekordów: dla kobiet i dla mężczyzn. Zapewnia to użycie funkcji AVG(zarobek) razem z GROUP BY plec, które tworzy osobny wynik agregacji dla każdej wartości w kolumnie plec. Pozostałe propozycje nie grupują danych lub mają sprzeczne warunki filtrowania.

Pełne wyjaśnienie:

Aby obliczyć osobno średni zarobek kobiet i średni zarobek mężczyzn, zapytanie musi wykonać agregację w grupach. W SQL uzyskuje się to przez połączenie funkcji agregującej (tu: AVG) z klauzulą GROUP BY po kolumnie, która rozdziela rekordy na grupy (tu: plec).

Zapytanie SELECT AVG(zarobek) FROM pracownicy GROUP BY plec; działa tak, że:

  • najpierw dzieli wiersze tabeli pracownicy na grupy o tej samej wartości w kolumnie plec,
  • następnie dla każdej grupy liczy średnią z kolumny zarobek,
  • zwraca osobny wiersz wyniku dla każdej płci (czyli co najmniej dwa wiersze, jeśli w danych występują dwie wartości).

Dlaczego pozostałe odpowiedzi są błędne?

  • SELECT AVG(zarobek) FROM pracownicy AS sredni_zarobek; — alias po FROM zmienia nazwę tabeli w zapytaniu, ale nie tworzy żadnego podziału na grupy. Wynikiem będzie jedna średnia dla całej tabeli, a nie osobne średnie dla każdej płci.
  • SELECT AVG(zarobek) FROM pracownicy WHERE plec='k' AND plec='m'; — warunek w WHERE jest logicznie sprzeczny: pojedynczy rekord nie może mieć jednocześnie dwóch różnych wartości tej samej kolumny. W efekcie zapytanie zwykle nie wybierze żadnych wierszy (albo zwróci średnią z pustego zbioru).
  • SELECT AVG(zarobek) FROM pracownicy GROUP BY plec HAVING plec='k' AND plec='m';HAVING filtruje już utworzone grupy, ale tu ponownie użyto sprzecznego warunku z AND na tej samej kolumnie. Nawet przy poprawnym GROUP BY żadna grupa nie spełni jednocześnie plec='k' i plec='m'.

Wskazówka egzaminacyjna: jeśli w treści pojawia się "osobno dla każdej kategorii/cechy", bardzo często oznacza to użycie GROUP BY po kolumnie tej cechy oraz funkcji agregującej (AVG, SUM, COUNT, MIN, MAX).

Dodatkowe pytania

Dodatkowe pytania (FAQ):
GROUP BY dzieli wiersze tabeli na grupy o tych samych wartościach wskazanych kolumn. Dzięki temu funkcje agregujące (np. AVG, SUM, COUNT) liczą wynik osobno dla każdej grupy, a nie dla całej tabeli.
AVG oblicza średnią arytmetyczną wartości w kolumnie liczbowej dla zbioru wierszy. Bez GROUP BY policzy średnią dla całego wyniku SELECT, a z GROUP BY policzy średnią oddzielnie dla każdej utworzonej grupy.
Polecenie wymaga średniej dla kobiet i dla mężczyzn, czyli dla dwóch grup danych. GROUP BY plec tworzy te grupy na podstawie wartości w kolumnie plec, a AVG(zarobek) liczy średnią w każdej z nich.
Tak, ale zwykle wymaga to dwóch osobnych zapytań z WHERE lub użycia agregacji warunkowej (np. CASE). W zadaniach testowych najprostsze i najbardziej typowe rozwiązanie dla "osobno dla każdej wartości" to GROUP BY.
AND oznacza, że oba warunki muszą być spełnione jednocześnie w tym samym wierszu. Jedna kolumna nie może mieć naraz dwóch różnych wartości, więc taki filtr zwykle daje pusty wynik. Dla "k lub m" używa się OR.
WHERE filtruje pojedyncze wiersze przed grupowaniem, a HAVING filtruje grupy już po GROUP BY. HAVING jest przydatne np. gdy chcesz zostawić tylko te grupy, których COUNT lub AVG spełnia warunek.
Zwróci jedną wartość: średni zarobek policzony dla wszystkich wierszy spełniających ewentualne warunki WHERE. Nie uzyskasz wtedy osobnych wyników dla kobiet i mężczyzn, bo nie ma mechanizmu podziału na grupy.
W praktyce dopisuje się kolumnę grupującą do SELECT, np. SELECT plec, AVG(zarobek) ... GROUP BY plec. Wiele baz wymaga, aby każda kolumna nieagregowana w SELECT była ujęta w GROUP BY.
Najczęściej: brak GROUP BY mimo wymogu "osobno", mylenie WHERE z HAVING, użycie sprzecznych warunków z AND na tej samej kolumnie oraz traktowanie aliasu tabeli (AS) jak mechanizmu obliczeń. Warto ćwiczyć na małych tabelach.
Przerób serię ćwiczeń z SELECT: agregacje (AVG/SUM/COUNT), GROUP BY, HAVING i proste filtry WHERE. Dobrą metodą jest tworzenie mini-tabeli z kilkoma rekordami i ręczne przewidywanie wyniku zapytania przed uruchomieniem.
info

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

W praktyce zawodowej kluczowe jest to, że poprawne zapytanie musi policzyć średnią w dwóch grupach rekordów: dla kobiet i dla mężczyzn.

Źródła:

  • PostgreSQL Documentation: SELECT — GROUP BY and Aggregate Functions, https://www.postgresql.org/docs/current/sql-select.html (dostęp: 2026-02-27)
  • MySQL 8.0 Reference Manual: GROUP BY Modifiers and Aggregate Functions, https://dev.mysql.com/doc/refman/8.0/en/group-by-modifiers.html (dostęp: 2026-02-27)
  • SQLite Documentation: Aggregate Functions (AVG), https://www.sqlite.org/lang_aggfunc.html (dostęp: 2026-02-27)

Materiały:

  • Dokumentacja SQL dla SELECT, AVG i GROUP BY (np. PostgreSQL/MySQL/SQLite)
  • Ćwiczenia z zapytań agregujących na przykładowych tabelach HR
  • Materiały do INF.3 z działu: zapytania SELECT i funkcje agregujące

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego