Aby obliczyć osobno średni zarobek kobiet i średni zarobek mężczyzn, zapytanie musi wykonać agregację w grupach. W SQL uzyskuje się to przez połączenie funkcji agregującej (tu: AVG) z klauzulą GROUP BY po kolumnie, która rozdziela rekordy na grupy (tu: plec).
Zapytanie SELECT AVG(zarobek) FROM pracownicy GROUP BY plec; działa tak, że:
- najpierw dzieli wiersze tabeli pracownicy na grupy o tej samej wartości w kolumnie plec,
- następnie dla każdej grupy liczy średnią z kolumny zarobek,
- zwraca osobny wiersz wyniku dla każdej płci (czyli co najmniej dwa wiersze, jeśli w danych występują dwie wartości).
Dlaczego pozostałe odpowiedzi są błędne?
- SELECT AVG(zarobek) FROM pracownicy AS sredni_zarobek; — alias po FROM zmienia nazwę tabeli w zapytaniu, ale nie tworzy żadnego podziału na grupy. Wynikiem będzie jedna średnia dla całej tabeli, a nie osobne średnie dla każdej płci.
- SELECT AVG(zarobek) FROM pracownicy WHERE plec='k' AND plec='m'; — warunek w WHERE jest logicznie sprzeczny: pojedynczy rekord nie może mieć jednocześnie dwóch różnych wartości tej samej kolumny. W efekcie zapytanie zwykle nie wybierze żadnych wierszy (albo zwróci średnią z pustego zbioru).
- SELECT AVG(zarobek) FROM pracownicy GROUP BY plec HAVING plec='k' AND plec='m'; — HAVING filtruje już utworzone grupy, ale tu ponownie użyto sprzecznego warunku z AND na tej samej kolumnie. Nawet przy poprawnym GROUP BY żadna grupa nie spełni jednocześnie plec='k' i plec='m'.
Wskazówka egzaminacyjna: jeśli w treści pojawia się "osobno dla każdej kategorii/cechy", bardzo często oznacza to użycie GROUP BY po kolumnie tej cechy oraz funkcji agregującej (AVG, SUM, COUNT, MIN, MAX).