Dana jest tabela przedmioty z polami ocena oraz uczenID. Aby wyświetlić identyfikatory uczniów, których średnia ocen jest większa od 4, należy użyć zapytania
A.
SELECT uczenID FROM przedmioty GROUP BY uczenID WHERE AVG(ocena) > 4;
B.
SELECT uczenID FROM przedmioty WHERE AVG(ocena) > 4;
C.
SELECT uczenID FROM przedmioty GROUP BY uczenID HAVING AVG(ocena) > 4;
D.
SELECT uczenID, AVG(ocena) FROM przedmioty WHERE ocena > 4;
Poprawne jest zapytanie: SELECT uczenID FROM przedmioty GROUP BY uczenID HAVING AVG(ocena) > 4;. Najpierw rekordy z tabeli przedmioty są dzielone na grupy według wartości pola uczenID. Dzięki temu wszystkie oceny jednego ucznia trafiają do jednej grupy. Następnie funkcja agregująca AVG(ocena) oblicza średnią ocen dla każdej takiej grupy. Warunek HAVING AVG(ocena) > 4 filtruje już gotowe grupy, czyli pozostawia tylko tych uczniów, których średnia jest większa od 4. Reguła do zapamiętania: WHERE filtruje pojedyncze wiersze przed grupowaniem, a HAVING filtruje grupy po użyciu GROUP BY. Takie zapytania stosuje się np. w raportach ocen, sprzedaży lub statystyk użytkowników.
Problem dotyczy filtrowania wyniku agregacji, czyli wartości obliczonej dla grupy rekordów. Zapytanie SELECT uczenID FROM przedmioty WHERE AVG(ocena) > 4; używa funkcji AVG w klauzuli WHERE, a WHERE działa przed obliczeniem agregatów, więc nie nadaje się do sprawdzania średniej. Zapytanie SELECT uczenID FROM przedmioty GROUP BY uczenID WHERE AVG(ocena) > 4; zawiera GROUP BY, ale warunek po grupowaniu powinien być zapisany w HAVING, a nie w WHERE. Zapytanie SELECT uczenID, AVG(ocena) FROM przedmioty WHERE ocena > 4; filtruje pojedyncze oceny większe od 4, a nie uczniów ze średnią większą od 4; dodatkowo brakuje GROUP BY dla pola uczenID. Typowy błąd polega na myleniu warunku dla wierszy z warunkiem dla grup. Poprawne zapytanie to: SELECT uczenID FROM przedmioty GROUP BY uczenID HAVING AVG(ocena) > 4;.