Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
32
Добавлен:
16.04.2013
Размер:
1.04 Mб
Скачать
      1. Группировка результата (фраза group by).

Довольствуйся настоящим, но стремись к лучшему”

ИСОКРАТ 436-338 гг. до н.э.

Запрос, в котором имеется фраза GROUP BY называетсягруппирующим запросом. В нем содержатся данные, которые получаются путем группировки информации при выполненииSELECT. При этом в таблице результатов для каждой группы формируется единственная строка описания её обобщающих значений (агрегатов). Поэтому столбцы, определяемые во фразеGROUP BY называютсягруппируемыми столбцами. СтандартISO предполагает тесную связь предложения SELECT и фразыGROUP BY. При использовании в операторе SELECTфразыGROUP BY каждый элемент списка в в предложении SELECT должен иметьединственное значение для всей группы. Более того, предложениеSELECT может включать в себя только следующие типы элементов:

  • имена столбцов;

  • обобщающие функции;

  • константы;

  • выражения из элементов перечисленных типов.

Все имена столбцов, перечисленные в списке SELECTдолжны присутствовать и во фразеGROUP BY (за исключением случая его использования в обобщающей функции). Обратное утрерждение в общем случае неверно. Если совместно с фразой GROUP BY используется предложение WHERE, то оно обрабатывается первым, т.е. последующей группировки подвергаются только те строки, которые удовлетворяют условию поиска.

Стандарт ISOпри группировке рассматривает все неопределённые данные как равные. Поэтому, при соблюдении прочих условий, строки со значениемNULLв обобщающем поле окажутся в одной группе. Рассмотрим пример.

      1. Примеры простой группировки.

Ученость – это сладкий плод горького корня.”

ИСОКРАТ 436-338 гг. до н.э.

Простая группировка предполагает, что в исходной таблице задается подмножество столбцов, содержание которых будет квалифицировать значения её ключевых строк по группам. Разбиение всех строк исходной таблицы на группы (по эквивалентным значениям столбцов - ключей) позволяет для каждой из них построить обощенные показатели (с помощью соответствующих функций). Сложная группировка предполагает иерархическое построение системы многоуровневых разбиений (как это принято в разного рода корпоративных отчетах), например территориально-административного деления стран. Это очень полезная практическая особенность языка SQLне является реляционным свойством (скорее это наследие характерно для электронных таблиц).

Использование фразы GROUP BY.

SELECT bno, COUNT(sno) AS count, SUM(salary) AS sum

FROM staff

GROUP BY bno

ORDER BY bno;

Запрос определяет количество персонала в каждом из отделений компании и их суммарную заработанную плату по отделениям. Таблица результата состоит из трех столбцов bno, count и sum, а количество строк равно количеству отделений.

Использование вложенных запросов.

Стандарт SQL92допускает помешение в список предложенийSELECT вложенных запросов. Поэтому данный запрос можно переписать следующим образом.

SELECT bno,

(SELECT COUNT(sno) AS count

FROM staff s

WHERE s.bno = b.bno),

(SELECT SUM(salary) AS sum

FROM staff s

WHERE s.bno = b.bno)

FROM branch b

ORDER BY bno;

Ограничения на выполнение группирования.

Фраза HAVING используется в GROUP BY совместно для задания ограничений, с целью фильтрации тех групп, которые будут помещены в результирующую таблицу запроса. ФразаHAVING используется и в предложении WHERE, но имеет совсем иной смысл – фильтрация строк. СтандартISOтребует, чтобы имена столбцов, используемых во фразеHAVINGобъязательно присутствовали в списке фразыGROUP BY или применялись в обобщающих функциях. На практике условия поиска во фразеHAVING всегда включают как минимум одну обобщающую функцию, иначе эти условия писка можно пместить в предложенииWHERE и применяться для отбора отдельных строк. (Обобщающие функции не могут использоваться в предложенииWHERE).

Фраза HAVING не является объязательной частью языкаSQL, т.к. любой запрос с её использованием можно переписать в без неё в ином виде.Рассмотрим пример.

Использование фразы HAVING.

SELECT bno, COUNT(sno) AS count, SUM(salary) AS sum

FROM staff

GROUP BY bno

HAVING COUNT(sno)>1

ORDER BY bno;

Здесь используется дополнительное ограничение группировки, которые отражает наш интерес только к отделениям, в котором работает более одного человека. В таблице результатов строки обощения с нулевым количеством сотрудников будут отсутствовать.

Соседние файлы в папке УП_ОПТ2