KWALIFIKACJA INF3 - STYCZEŃ 2023 (test 2)

PYTANIE NR 18.
Tabela gory zawiera informacje o polskich szczytach oraz pasmach górskich, w których te szczyty się znajdują. Aby wyświetlić Koronę Gór Polskich, czyli najwyższy szczyt w każdym z pasm górskich, należy wydać kwerendę
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Poprawna kwerenda musi zwrócić wiersz odpowiadający maksymalnej wysokości w danym paśmie, a nie tylko samą wartość MAX(wysokosc). Podzapytanie skorelowane wylicza MAX(wysokosc) osobno dla każdego pasma i filtruje te rekordy, których wysokosc równa się temu maksimum.

Pełne wyjaśnienie:

W zadaniu trzeba wyświetlić "najwyższy szczyt w każdym paśmie", czyli w praktyce: dla każdej wartości pasmo wybrać taki rekord (wiersz), który ma największą wysokość w tej grupie. To jest klasyczny problem SQL typu "maksimum w grupie".

Odpowiedź "SELECT g1.pasmo, g1.szczyt, g1.wysokosc FROM gory g1 WHERE g1.wysokosc = (SELECT MAX(g2.wysokosc) FROM gory g2 WHERE g2.pasmo = g1.pasmo);" jest poprawna, ponieważ:

  • zewnętrzne zapytanie pracuje na konkretnych wierszach tabeli gory (alias g1),
  • podzapytanie skorelowane liczy MAX(g2.wysokosc) osobno dla pasma bieżącego wiersza (warunek g2.pasmo = g1.pasmo),
  • warunek w WHERE zostawia tylko te wiersze, których wysokosc jest równa maksimum w danym paśmie.

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

  • "SELECT pasmo, szczyt, MAX(wysokosc) FROM gory GROUP BY pasmo;" łamie regułę standardowego SQL: kolumna szczyt nie jest ani agregowana, ani ujęta w GROUP BY. W większości systemów to błąd, a nawet jeśli DBMS to dopuści, nie ma gwarancji, że zwrócony "szczyt" będzie tym z maksymalną wysokością.
  • "SELECT pasmo, szczyt, MAX(wysokosc) FROM gory;" miesza kolumny nieagregowane z agregacją bez grupowania. Nie wyznacza maksimum w podziale na pasma i w typowych DBMS jest niepoprawne składniowo lub semantycznie.
  • "SELECT pasmo, szczyt FROM gory GROUP BY wysokosc;" grupuje po wysokosc, a nie po pasmo, więc nie rozwiązuje problemu "najwyższego w każdym paśmie". Dodatkowo zwraca kolumny niezgodne z logiką agregacji (brak funkcji agregujących dla potrzebnego wyboru).

Wskazówka egzaminacyjna: gdy chcesz wypisać dodatkowe kolumny (np. nazwę szczytu) z rekordu o wartości MAX/MIN w grupie, zwykle potrzebujesz: podzapytania, JOIN do agregatu albo funkcji okna. Samo MAX() nie wybiera "reszty pól" z właściwego wiersza.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
GROUP BY grupuje wiersze o tych samych wartościach wskazanych kolumn i pozwala liczyć agregaty (np. MAX, COUNT) dla każdej grupy. Samo grupowanie nie wybiera "najlepszego wiersza" z grupy — tylko tworzy grupy, dla których wyliczasz wartości zbiorcze.
W standardowym SQL każda kolumna w SELECT musi być albo objęta funkcją agregującą, albo wymieniona w GROUP BY. W przeciwnym razie baza nie wie, który z wielu wierszy w grupie ma reprezentować tę kolumnę, więc wynik byłby niejednoznaczny lub niedeterministyczny.
Błąd polega na tym, że kolumna szczyt nie jest ani agregowana, ani ujęta w GROUP BY. Nawet jeśli DBMS dopuści takie zapytanie, może zwrócić dowolny "szczyt" z grupy, który nie musi odpowiadać rekordowi o maksymalnej wysokości.
Najczęściej stosuje się jedną z metod: podzapytanie skorelowane (porównanie z MAX w danej grupie), JOIN do podzapytania z MAX na GROUP BY albo funkcje okna (ROW_NUMBER z PARTITION BY). Wybór zależy od DBMS i wymagań.
Podzapytanie jest liczone osobno dla każdego wiersza zapytania zewnętrznego, bo odwołuje się do jego kolumn (np. pasmo). Dzięki temu MAX(wysokosc) jest wyznaczane w obrębie konkretnego pasma, a filtr WHERE zostawia tylko wiersze równe temu maksimum.
Nie. MAX(wysokosc) zwraca tylko wartość liczbową (maksimum), a nie "cały rekord" z tej wysokości. Aby dostać nazwę szczytu z tego samego wiersza, musisz wskazać mechanizm wyboru wiersza: podzapytanie, JOIN do agregatu lub funkcję okna.
JOIN do podzapytania z MAX bywa wygodny, gdy chcesz najpierw policzyć maksima per grupa, a potem dołączyć pełne rekordy. Często jest też czytelny i bywa dobrze optymalizowany. Podzapytanie skorelowane jest proste, ale w dużych danych może wymagać dobrych indeksów.
Jeśli w jednym paśmie są dwa rekordy z identycznym maksimum, warunek "wysokosc = MAX(...)" zwróci oba wiersze. To może być poprawne lub nie — zależy od założeń zadania. Gdy trzeba wybrać jeden rekord, stosuje się dodatkowe kryterium (np. ROW_NUMBER z ORDER BY).
Funkcje okna (np. ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ...)) często są najwygodniejsze do "top 1 w grupie", bo nie gubią kolumn wiersza i nie wymagają obejść. Nie zawsze są jednak omawiane na poziomie podstawowym i wymagają DBMS z obsługą SQL:2003.
Najczęstsze pomyłki to: dopisywanie do SELECT kolumny niezagregowanej (np. nazwy) bez GROUP BY, mylenie "maksymalnej wartości" z "rekordem o maksymalnej wartości" oraz grupowanie po złej kolumnie (np. po wysokosc zamiast po pasmo). Warto zawsze sprawdzić, co jest grupą.
info

To pytanie poprawnie rozwiązuje 66% zdających egzamin. średnie

W praktyce zawodowej kluczowe jest to, że poprawna kwerenda musi zwrócić wiersz odpowiadający maksymalnej wysokości w danym paśmie, a nie tylko samą wartość MAX(wysokosc).

Źródła:

  • PostgreSQL Documentation: "GROUP BY Clause" (SELECT, GROUP BY rules) — https://www.postgresql.org/docs/current/queries-table-expressions.html#QUERIES-GROUP — accessed 2026-03-13
  • MySQL 8.0 Reference Manual: "SQL Mode" oraz "ONLY_FULL_GROUP_BY" — https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html — accessed 2026-03-13
  • Microsoft Learn: "GROUP BY (Transact-SQL)" — https://learn.microsoft.com/en-us/sql/t-sql/queries/select-group-by-transact-sql — accessed 2026-03-13

Materiały:

  • Dokumentacja DBMS: sekcja dotycząca GROUP BY i funkcji agregujących
  • Ćwiczenia SQL: zadania typu "największa wartość w grupie" (greatest-n-per-group)
  • Materiały o podzapytaniach skorelowanych i JOIN z agregacją

Aktualizacja pytania: 03.04.2026



Aktualizacja pytania: 03.04.2026
📡 Brak połączenia internetowego