По умолчанию все строки таблицы рассматриваются как одна группа. Для разбиения таблицы на меньшие группы строк используется предложение GROUP BY команды SELECT.
Синтаксис:
SELECT {столбец, групповая_функция} FROM Таблица [WHERE условие] [GROUP BY выражение_группирования] [ORDER BY {Столбец, выражение} [ASC|DESC]]; |
где
выражение_группирования |
Определяет столбец, по значениям которого группируются строки |
Для получения сводной информации по каждой группе можно использовать групповые функции. Если в предложение SELECT включена групповая функция, получить одновременно отдельные результаты можно только в случае, если в предложении GROUP BY задан отдельный столбец. Если список столбцов отсутствует, выдается сообщение об ошибке.
Предложение WHERE позволяет исключить некоторые строки до начала разбиения на группы.
Если в списке SELECT заданы столбцы одновременно с групповыми функциями, их список должен использоваться и в предложении GROUP BY. В предложении GROUP BY нельзя использовать позиционные обозначения или псевдонимы столбцов.
По умолчанию строки сортируются в порядке возрастания в соответствии со списком GROUP BY. Изменить порядок сортировки можно с помощью предложения ORDER BY.
Пример: Вывод номера фамилии, номера отдела сотрудников из отдела 41
ID | LAST_NAME | DEPATMENT |
--------- | ------------------ | --------------- |
2 | Ngao | 41 |
6 | Urguhart | 41 |
16 | Maduro | 41 |
17 | Smith | 41 |
Пример: Вывод номера отдела и количества сотрудников из отдела 41
DEPT_ID -------------------- |
NUMBER ------------------------- |
41 | 4 |
1 row selected |
Пример: Вывод всех возможных кредитных рейтингов и количества клиентов в каждой категории. Столбец должен иметь заголовок “# Cust”.
CREDIT_RATING --------------------------------- |
# CUST --------------------- |
EXELLENT | 9 |
GOOD | 3 |
POOR | 3 |
... |
Пример: Вывод всех должностей, кроме вице-президента, и соответствующей общей заработной платы за месяц. Список сортируется по общей заработной плате.
TITLE ------------------------ |
PAYROLL ------------------------- |
President | 2500 |
Warehouse | 6157 |
Sales | 7380 |
Stock | 9490 |
... |
Столбец, заданный в предложении GROUP BY, не обязательно должен быть задан в предложении SELECT. С другой стороны, если столбец из предложения GROUP BY входит в список SELECT, результат имеет больше смысла.
Если в одной и той же команде SELECT указаны как отдельные элементы данных, так и групповые функции, но пропущено предложение GROUP BY, описывающее эти отдельные элементы, выдается сообщение об ошибке.
Пример:
Для исправления этой ошибки следует добавить предложение GROUP BY.
Группы внутри групп.
Сводные результаты по группам и подгруппам можно получить путем указания более чем одного столбца в предложении GROUP BY. В следующем примере количество людей подсчитывается не только по отделам, но и по должностям. Порядок сортировки, используемый по умолчанию, определяется порядком столбцов в предложении GROUP BY.
Пример: Вывод количества служащих по должностям внутри отделов.
DEPT_ID ----------- |
TITLE ----------------------- |
COUNT(*) -------------- |
... | ||
34 | Sales Representative | 1 |
34 | Stock Clerk | 1 |
35 | Sales Representative | 1 |
41 | Stock Clerk | 2 |
41 | VP, Operations | 1 |
... |
Предложение HAVING.
Предложение WHERE для исключения групп не используется. Для исключения целиком некоторых групп следует пользоваться предложением HAVING.
Пример: Вывод номера отдела и средней заработной платы для отделов, где средняя заработная плата превышает 2000.
Вместо этого для ограничения количества групп следует использовать предложение HAVING.
DEPT_ID ------------------ |
AVG(SALARY) ---------------------------- |
50 | 2025 |
Предложение HAVING задает условие отбора групп для вывода. Следовательно, на группы накладывается дальнейшее ограничение, основанное на сводной информации.
Синтаксис:
|
где
HAVING |
Вывод конкретных групп. |
Условие_группы |
Включает в выходной результат только те группы, для которых заданное условие истинно (TRUE). |
Если используется предложение HAVING, сервер Oracle7 выполняет следующие действия:
Предложение HAVING может предшествовать предложению GROUP BY, но более логично ставить предложение GROUP BY первым. Образование групп и вычисление групповых функций происходят до того, как к группам из списка SELECT применяется ограничение, заданное в предложении HAVING.
Пример: Вывод должности и общей заработной платы для всех должностей с заработной платой более 5000 в месяц, кроме вице-президентов. Выходные строки сортируются по заработной плате.
Сервер Oracle7 рассматривает предложения в следующем порядке:
Предложение GROUP BY можно использовать без указания групповой функции в списке SELECT. Если отбор строк производится по результатам групповой функции, то использование как предложения GROUP BY, так и предложения HAVING обязательно.
![]() |
Для закрепления материала рекомендуется выполнить Практическое задание 4. |