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.