Klauzule GROUP BY i HAVING występujące w rozkazie SELECT pozwalają dzielić relację wynikową na grupy, wybierać niektóre z tych grup i na każdej z nich z osobna wykonywać pewne (dozwolone przez system) operacje. Operacje te działają na wszystkich wierszach wchodzących w skład grupy. Na samym końcu zwracana jest tylko zbiorcza informacja o wybranych grupach (nie zwraca się wszystkich wierszy wchodzących w skład grupy).
Klauzula GROUP BY służy do dzielenia krotek relacji na mniejsze grupy. Sposób takiego podziału ilustruje przykład:
SELECT stanowisko, avg(placa_podstawowa)
FROM pracownicy
GROUP BY stanowisko ;
Istnieje możliwość odrzucenia pewnych krotek przed podziałem na grupy. Dokonuje się tego za pmocą klauzuli WHERE:
SELECT stanowisko, avg(placa_podstawowa)
FROM pracownicy
WHERE stanowisko != 'KIEROWCA'
GROUP BY stanowisko ;
Dzielenie na grupy może być zagnieżdżane, co umożliwia wydzielanie podgrup w uprzednio znalezionych podgrupach. W przykładzie poniżej wszyscy pracownicy są dzieleni na wydziały, w których pracują, a w ramach każdego wydziały grupowani według stanowiska:
SELECT wydzial, stanowisko, avg(placa_podstawowa)
FROM pracownicy
GROUP BY nr_wydzialu, stanowisko ;
Klauzula HAVING ogranicza wyświetlanie grup do tych, które spełniają określony warunek. Chcąc wyświetlić tylko te grupy, w których płaca podstawowa przynajmniej jednego pracownika jest większa niż 3 000 należy zastosować następujące zapytanie: