Выражение GROUP BY
Выражение GROUP BY
определяет, какие столбцы должны использоваться для группировки при выполнении любых агрегаций в выражении SELECT
. Если указано условие GROUP BY
, запрос всегда является агрегированным, даже если в условии SELECT
нет явно заданного агрегирования.
Если указано условие GROUP BY
, все кортежи, имеющие совпадающие данные в группирующих столбцах (т. е. все кортежи, принадлежащие одной группе), будут объединены. Значения самих группирующих столбцов не изменяются, а любые другие столбцы могут быть объединены с помощью агрегатной функции (например, count
, sum
, avg
, и т. д.).
GROUP BY ALL
Используйте GROUP BY ALL
для группировки всех столбцов в выражении SELECT
, которые не обернуты в агрегатные функции. Это упрощает синтаксис, позволяя хранить список столбцов в одном месте, и предотвращает ошибки, сохраняя гранулярность SELECT
в соответствии с гранулярностью GROUP BY
(например, предотвращает дублирование).
Синтаксис
Могут использоваться следующие варианты синтаксиса:
SELECT ...
FROM ...
[ ... ]
GROUP BY groupItem [ , groupItem [ , ... ] ]
[ ... ]
SELECT ...
FROM ...
[ ... ]
GROUP BY ALL
[ ... ]
где:
groupItem ::= { <column_alias> | <position> | <expr> }
Параметры
-
<column_alias>
Псевдоним столбца, заданный в выраженииSELECT
.
-
<position>
Позиция выражения в выраженииSELECT
.
-
<expr>
Любое выражение, заданное на таблицах в текущей области видимости.
-
GROUP BY ALL
Указывает, что все элементы в выраженииSELECT
, которые не используют агрегатные функции, должны использоваться для группировки.
Примеры
-
Вычислим количество записей в таблице
employees
(работников), относящихся к каждому отделу:SELECT department, count(*) FROM employees GROUP BY department;
-
Вычислим среднюю зарплату для каждого отдела каждого подразделения:
SELECT division, department, avg(salary) FROM employees GROUP BY division, department;
-
Сгруппируем данные по отделам и подразделениям, чтобы увидеть все уникальные пары "отдел — подразделение":
SELECT division, department FROM employees GROUP BY ALL;