Dana jest tabela o nazwie przedmioty z polami ocena i uczenID. Aby policzyć, ile ocen ma uczeń o ID równym 7, należy posłużyć się zapytaniem
A.
SELECT COUNT(ocena) FROM przedmioty WHERE uczenID = 7;
B.
SELECT SUM(ocena) FROM przedmioty WHERE uczenID = 7;
C.
COUNT SELECT ocena FROM przedmioty WHERE uczenID = 7;
D.
SELECT AVG(ocena) FROM przedmioty WHERE uczenID = 7;
To zapytanie jest właściwe, bo używa funkcji agregującej COUNT(ocena), która zlicza liczbę niepustych wartości w kolumnie ocena. Warunek WHERE uczenID = 7 ogranicza rekordy tylko do ocen przypisanych do ucznia o identyfikatorze 7, więc baza nie liczy ocen wszystkich uczniów, tylko tego jednego konkretnego. Schemat jest zgodny z typową składnią SQL: SELECT określa, co chcemy otrzymać, FROM wskazuje tabelę, a WHERE filtruje wiersze. W praktyce takie zapytanie przydaje się np. w dzienniku elektronicznym, gdy trzeba sprawdzić, ile wpisów z ocenami ma dany uczeń z danego przedmiotu albo w całej tabeli ocen. Moim zdaniem warto zapamiętać też różnicę między COUNT(ocena) i COUNT(*). COUNT(ocena) nie liczy wartości NULL, czyli pustych ocen, a COUNT(*) liczy wszystkie pasujące wiersze. Jeśli kolumna ocena zawsze jest wypełniona, wynik będzie taki sam. W dobrej praktyce bazodanowej filtr po identyfikatorze ucznia jest bardzo sensowny, bo ID jest zwykle kluczem lub polem indeksowanym, więc zapytanie działa szybko i jednoznacznie.
W tym zadaniu kluczowe jest odróżnienie zliczania rekordów od wykonywania obliczeń na samych wartościach ocen. Jeżeli chcemy wiedzieć, ile ocen ma uczeń, nie interesuje nas średnia ani suma ocen, tylko liczba pasujących wpisów w tabeli. Funkcja AVG(ocena) oblicza średnią arytmetyczną z ocen ucznia, więc odpowiedziałaby na pytanie w stylu: jaka jest średnia ocen ucznia o ID 7. To zupełnie inny wynik, np. 4.25 zamiast liczby wpisanych ocen. Funkcja SUM(ocena) dodaje wartości ocen, czyli zwróciłaby sumę typu 3 + 5 + 4 = 12. Taki wynik czasem może być używany w raportach, ale sam z siebie nie mówi, ile ocen zostało wpisanych. Częsty błąd polega na tym, że ktoś widzi kolumnę ocena i myśli, że każda funkcja agregująca na tej kolumnie będzie dobra, a SQL jest tu dość konkretny: COUNT liczy, AVG uśrednia, SUM sumuje. Problemem może być też składnia z przestawioną kolejnością słów, gdzie COUNT pojawia się przed SELECT. W standardowym SQL zapytanie zaczyna się od SELECT, potem podaje się wyrażenie lub funkcję, następnie FROM z nazwą tabeli i ewentualnie WHERE z warunkiem. Baza danych nie potraktuje składni COUNT SELECT ocena jako poprawnej kwerendy, bo parser SQL oczekuje innej kolejności elementów. Z mojego doświadczenia najlepiej czytać takie polecenia jak zdanie: wybierz liczbę ocen z tabeli przedmioty, ale tylko tam, gdzie uczenID wynosi 7. Wtedy naturalnie wychodzi SELECT COUNT(ocena) FROM przedmioty WHERE uczenID = 7; i trudniej pomylić to ze średnią albo sumą.