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: Programowanie webowe Bazy danych

Słowa kluczowe: DQL w SQL Funkcja MAX() w SQL Funkcje agregujące w SQL WHERE w SQL

W bazie danych sklepu istnieją dwie tabele powiązane relacją: produkty oraz oceny. Tabela oceny zawiera dowolną liczbę ocen klientów dla danego produktu opisaną polami: id, ocena (pole numeryczne), produktID (klucz obcy). Aby wskazać maksymalną ocenę dla produktu o ID równym 10, należy posłużyć się zapytaniem

A.
SELECT MAX(ocena) FROM oceny WHERE produktID = 10;
B.
SELECT MAX COUNT(ocena) FROM oceny WHERE produktID = 10;
C.
COUNT MAX SELECT ocena FROM oceny WHERE produktID = 10;
D.
MAX SELECT ocena FROM oceny WHERE produktID = 10;

Pytanie z egzaminu CKE, styczeń 2021 (arkusz EE.09-SG-21.01).

Zapytanie SELECT MAX(ocena) FROM oceny WHERE produktID = 10; jest poprawne, bo używa funkcji agregującej MAX() dokładnie do tego, do czego została zaprojektowana: do znalezienia największej wartości w wybranej kolumnie. Najpierw klauzula WHERE ogranicza rekordy tylko do ocen produktu o identyfikatorze 10, a dopiero z tego zestawu danych obliczana jest maksymalna wartość pola ocena. To jest typowy i zgodny ze standardem SQL sposób pracy z agregacją danych. W praktyce takie zapytanie przyda się np. w sklepie internetowym do pokazania najwyższej oceny produktu, wyróżnienia najlepiej ocenionych pozycji albo przygotowania statystyk w panelu administracyjnym. Moim zdaniem warto od razu pisać czytelniej, np. SELECT MAX(ocena) AS maksymalna_ocena FROM oceny WHERE produktID = 10;, bo alias ułatwia późniejszą obsługę wyniku w PHP, JavaScript albo w narzędziu typu phpMyAdmin. Dobrą praktyką jest też założenie indeksu na kolumnie produktID, szczególnie gdy tabela ocen rośnie do tysięcy albo milionów rekordów. Trzeba pamiętać, że jeśli produkt nie ma żadnej oceny, wynik MAX() może być NULL, a nie 0, co czasem zaskakuje przy wyświetlaniu danych użytkownikowi.
W tym zadaniu kluczowe jest rozróżnienie składni polecenia SELECT od nazw funkcji agregujących. W SQL zapytanie rozpoczyna się od SELECT, potem podaje się wyrażenie lub kolumny, które mają zostać zwrócone, następnie FROM wskazuje tabelę, a WHERE filtruje rekordy. Samo przestawienie słów, na przykład zapisanie MAX SELECT ocena, nie tworzy poprawnego zapytania. MAX nie jest osobnym poleceniem rozpoczynającym kwerendę, tylko funkcją wywoływaną w części SELECT, czyli jako MAX(ocena). Nawiasy są tu ważne, bo pokazują, na której kolumnie funkcja ma pracować. Częsty błąd polega na traktowaniu SQL jak zdania po polsku: maksimum wybierz ocenę z tabeli. Niestety parser bazy danych tak tego nie zrozumie. Równie mylące jest dokładanie COUNT, bo COUNT() służy do liczenia rekordów lub niepustych wartości, a nie do wskazywania największej oceny. Jeśli zapytasz o COUNT(ocena), dostaniesz liczbę ocen, a nie ich najwyższą wartość. Konstrukcje typu COUNT MAX SELECT albo SELECT MAX COUNT(ocena) mieszają dwie różne funkcje agregujące bez poprawnej składni. W standardowym SQL funkcje agregujące zapisuje się jako nazwa_funkcji(argument), np. MAX(ocena), AVG(ocena), COUNT(*). Gdyby naprawdę trzeba było znaleźć np. największą liczbę ocen w grupach produktów, użyłoby się GROUP BY i często podzapytania, ale to już inny problem. Tutaj chodzi wyłącznie o jedną kolumnę ocena przefiltrowaną po produktID = 10, więc poprawna jest prosta agregacja MAX() z warunkiem WHERE. Z mojego doświadczenia, jak ktoś zapamięta kolejność SELECT ... FROM ... WHERE ..., to takie pytania robią się dużo łatwiejsze.

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.