Przejdź do głównej treści

Kwalifikacja: INF.03 - Tworzenie i administrowanie stronami i aplikacjami internetowymi oraz bazami danych

Zawód: Technik informatyk, Technik programista

Kategorie: Bazy danych

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.
SELECT pasmo, szczyt, MAX(wysokosc) FROM gory;
B.
SELECT pasmo, szczyt, wysokosc FROM gory WHERE (pasmo, wysokosc) IN (SELECT pasmo, MAX(wysokosc) FROM gory GROUP BY pasmo);
C.
SELECT pasmo, szczyt, wysokosc FROM gory;
D.
SELECT pasmo, szczyt FROM gory GROUP BY wysokosc;

Opracowane na podstawie zadania CKE, styczeń 2023 (arkusz EE.09-SG-23.01): W arkuszu kluczem była kwerenda z MAX(wysokosc) i GROUP BY pasmo - nie gwarantuje ona, że nazwa szczytu pochodzi z wiersza z najwyższą wysokością. Zastąpiono ją kwerendą z podzapytaniem.

Ta kwerenda dobrze rozwiązuje problem, bo najpierw wyznacza maksymalną wysokość osobno dla każdego pasma, a dopiero potem pobiera pełne rekordy szczytów pasujących do tych wyników. Podzapytanie SELECT pasmo, MAX(wysokosc) FROM gory GROUP BY pasmo tworzy zestaw par: nazwa pasma oraz największa wysokość w tym paśmie. Następnie warunek WHERE (pasmo, wysokosc) IN (...) sprawdza, które wiersze z tabeli gory mają dokładnie takie pasmo i taką wysokość. Dzięki temu można wyświetlić także nazwę szczytu, a nie tylko samą liczbę. To jest ważne, bo funkcja agregująca MAX sama z siebie nie wie, z którego wiersza pochodzi pozostała kolumna, np. szczyt. Moim zdaniem to bardzo praktyczny przykład typowego zadania SQL: znajdź rekord o maksymalnej wartości w każdej grupie. Podobnie robi się np. przy szukaniu najdroższego produktu w każdej kategorii, najnowszego zamówienia klienta albo najlepszego wyniku ucznia w każdej klasie. W dobrych praktykach baz danych warto pamiętać, że kolumny nieobjęte agregacją powinny być pobierane dopiero po poprawnym ustaleniu grupy i maksimum. Ta wersja ma też sens, gdy w jednym paśmie dwa szczyty miałyby tę samą wysokość, bo zwróci oba rekordy, co często jest bardziej uczciwe niż losowe wybranie jednego.
W tym zadaniu łatwo pomylić zwykłe wyświetlenie danych z wyznaczaniem wyniku zagregowanego. Samo SELECT pasmo, szczyt, wysokosc FROM gory zwróci wszystkie zapisane szczyty, czyli pełną zawartość tabeli w zakresie tych kolumn. Nie ma tam żadnego mechanizmu, który wybierałby tylko najwyższy szczyt w każdym paśmie, więc taka kwerenda jest bardziej raportem ogólnym niż Koroną Gór Polskich. Użycie MAX(wysokosc) bez GROUP BY pasmo też nie rozwiązuje sprawy, bo wtedy liczona jest maksymalna wysokość dla całej tabeli, a nie osobno dla każdego pasma. Dodatkowo w standardowym SQL nie powinno się mieszać kolumn zwykłych, takich jak pasmo i szczyt, z agregacją, jeśli te kolumny nie są w GROUP BY. Niektóre systemy, zwłaszcza przy luźniejszych ustawieniach, mogą coś zwrócić, ale nazwa pasma i szczytu może być przypadkowa albo niezgodna z wartością maksimum. To jest typowy błąd: widzimy MAX i zakładamy, że baza sama dopasuje resztę wiersza. Niestety, SQL tak nie działa. Grupowanie po kolumnie wysokosc również jest złym kierunkiem, ponieważ wtedy grupy powstają według wysokości, a nie według pasma górskiego. W efekcie otrzymujemy zbiory szczytów mających tę samą wysokość, co nie odpowiada pytaniu. Żeby znaleźć najwyższy szczyt w każdym paśmie, trzeba najpierw pogrupować dane po paśmie i obliczyć MAX(wysokosc), a potem powiązać ten wynik z oryginalną tabelą, aby odzyskać nazwę szczytu. Z mojego doświadczenia to jedno z tych miejsc w SQL, gdzie warto myśleć etapami: najpierw obliczenie wartości granicznej w grupie, potem pobranie pełnego rekordu.

Wymagane logowanie

Ocenianie trudności pytań jest dostępne tylko dla zalogowanych użytkowników. Zaloguj się, aby skorzystać z pełni możliwości platformy.

Twoja ocena pomoże innym uczniom w przygotowaniu do egzaminu, a Tobie pozwoli na dostęp do spersonalizowanych statystyk.

Zgłoś błąd w pytaniu

Rozwiń sekcję i zmień pole, którego dotyczy błąd. Wysłane zostaną tylko zmienione sekcje.

Błędna kwalifikacja
Błąd w treści pytania
Błąd w treści odpowiedzi
Błąd w obrazie
Dane kontaktowe (opcjonalnie)
Podaj email, jeśli chcesz otrzymać informację o rozpatrzeniu zgłoszenia.