• константа;
•
статистическая функция, возвращающая одно значение для всех строк,
входящих в группу;
•
столбец группировки, который по определению имеет одно и то же
значение во всех строках группы;
•
выражение, включающее в себя перечисленные выше элементы.
3) Если совместно с GROUP BY используется WHERE, то WHERE
обрабатывается первым, а группированию подвергаются только те строки,
которые удовлетворяют условию фильтра. По ISO, NULL-значения входят в
одну группу.
Для фильтрации данных группы по заданным условиям используется
подгруппа HAVING, которая в условиях отбора может использовать агрегатные
функции (что запрещено делать в секции фильтра WHERE!). Кроме того, в
HAVING нельзя записывать просто имена полей, не используемых в GROUP
BY, т.к. эти данные будут представлять множество значений и сравнение с
ними констант и множеств констант не возможно.
Пример группирующего запроса:
SELECT column2, COUNT(*), COUNT(column3), AVG(column1)
FROM t1
WHERE (column1 > 0.4)
GROUP BY column2 HAVING (COUNT(column3) > 1);
На логическом уровне данный запрос выполняется следующим образом:
1) Для всех строк таблицы t1 выполняется фильтрация по предикату
(column1 > 0.4).
2) Данные, прошедшие фильтр WHERE, по столбцу column2 делятся на
группы, по одной группе для каждого значения из column2.
3) Для каждой группы вычисляется COUNT(*), COUNT(column3),
AVG(column1) по всем строкам, входящим в группу, и генерируется одна
итоговая строка результатов. К этой строке будет дописано соответствующее
значение из column2.
142