Предложение GROUP BY неразрывно связано с агрегирующими функциями. Предложение GROUP BY разделяет таблицу на наборы, а агрегирующая функция вычисляет для каждого из них итоговое значение.
Пример:
SELECT SUM(Оклад) FROM СП_СЛ
Возвращает фонд заработной платы для ВСЕЙ организации.
SELECT Код лаборатории, SUM(Оклад) FROM СП_СЛ GROUP BY Код лаборатории
Возвращает фонд заработной платы для каждой лаборатории.
В большинстве диалектов SQL каждый элемент из списка GROUP BY должен обязательно присутствовать в списке выбора, то есть группировать можно только выбираемые элементы.
Использование предложения GROUP BY без агрегирующих функций напоминает использование предложения DISTINCT. Оно разделяет таблицу на группы и для каждой из них возвращает по одной строке.
Пример:
SELECT Код лаборатории FROM СП_СЛ GROUP BY Код лаборатории
SELECT DISTINCT Код лаборатории FROM СП_СЛ
Оба запроса возвращают аналогичный результат.
В самом общем смысле, предложение HAVING работает аналогично предложению WHERE, но применяется к группам. WHERE накладывает ограничения на строки, а HAVING – на группы. Как правило, предложение HAVING используется совместно GROUP BY.
Если запрос содержит предложения WHERE, GROUP BY, HAVING и агрегирующие функции, то он выполняется в следующей последовательности.
1. Предложение WHERE находит требуемые строки.
2. Предложение GROUP BY делит найденные строки на группы.
3. Когда группы составлены, вычисляются обобщающие значения для каждой группы.
4. Предложение HAVING проверяет результирующие строки всех групп и решает, следует ли включить их в окончательный результат.
Пример:
1. SELECT Код лаборатории, COUNT(*) FROM СП_СЛ GROUP BY Код лаборатории HAVING COUNT(*)>5
Выбирает только те лаборатории, в которых работает больше 5 сотрудников.
2. SELECT Код лаборатории, COUNT(*) FROM СП_СЛ GROUP BY Код лаборатории HAVING Код лаборатории LIKE ‘1%’
SELECT Код лаборатории, COUNT(*) FROM СП_СЛ WHERE Код лаборатории LIKE ‘1%’ GROUP BY Код лаборатории
Оба запроса возвращают лаборатории, имеющие код, начинающийся с «1», и количество служащих, работающих в этих лабораториях. Однако второй запрос более эффективен, так как строки, содержащие коды лабораторий, которые не начинаются с «1», будут удалены до группирования, а не после него, как это произойдет в первом случае.