GROUP BY группировка данных, синтаксис SQL-запросов

  1. Пример группировки записей
  2. Группировка записей на практике
  3. суммирование

Группировка данных заключается в создании групп записей на основе определения группировки (предложение GROUP BY). Этот шаг выполняется как другой после фильтрации записей, в соответствии с условиями, указанными в WHERE (если мы вообще что-либо фильтруем), или непосредственно после FROM, если мы не используем выбор строки.

(5) ВЫБРАТЬ (1) ИЗ (2) ГДЕ (3) Сгруппировать (4) Иметь (6) ЗАКАЗАТЬ

Чтобы понять возможности, предлагаемые группировкой записей, необходимо знать, как она реализована реляционным механизмом.

При использовании GROUP BY во время обработки запроса создаются два раздела данных.

Раздел группировки состоит из атрибутов, которые составляют определение группировки (это столбцы, указанные в GROUP BY). Группы создаются строками с одинаковыми значениями в этом разделе. Группа может быть создана одной (если она уникальна в определении группы) или несколькими строками, если они имеют одинаковые значения в столбцах, которые мы группируем.

Раздел необработанных данных содержит все другие данные, которые уже могут быть уникальными для каждой строки в разделе группировки. Раздел необработанных данных всегда рассматривается в контексте группы.

Пример группировки записей

Самый простой способ представить эту разбивку на конкретный случай. Посмотрите на фрагмент данных в таблице dbo.Employees через призму будущей операции группировки. Вы захотите сгруппировать сотрудников по названию должности (названию) и месту работы (стране). У компании есть два предприятия - одно в США, а другое в Великобритании.

Northwind GO выберите Название, Страна, Фамилия, Имя, литье (Дата рождения как дата). Дата рождения, приведение (Дата рождения как дата) HireDate из dbo. Сотрудники ORDER BY Страна, Должность;

Сгруппировав данные по столбцам Заголовок и Страна, в соответствии с определением механизмов группировки, будут созданы два раздела
Сгруппировав данные по столбцам Заголовок и Страна, в соответствии с определением механизмов группировки, будут созданы два раздела.

Раздел группировки - будет состоять из уникальных элементов (создающих актуальные группы), описанных двумя атрибутами группирования Название и Страна. У нас будет таких групп по 5. Два, которые содержат три элемента (поскольку они более интересны, я пометил их красными рамками) и три одноэлементных (например, менеджер по продажам из Великобритании).

Раздел необработанных данных включает все остальные столбцы. Каждая группа раздела группировки напрямую связана с правой - группой необработанных данных (я выделил две более интересные синим цветом - вы можете видеть, что они содержат уникальные значения внутри группы).

Группировка записей на практике

Мы уже знаем, какие данные будут работать и как эти разделы будут определены в теории. Итак, давайте напишем запрос, который группирует записи по должности и месту работы.

выберите Название, Страна, СЧЕТ (*) как EmQty из dbo. Сотрудники GROUP BY Страна, Название

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

В нашем примере в SELECT мы можем ссылаться только непосредственно на столбцы Title и Country.

Обратите внимание, что в результате группировки мы получили набор из 5 элементов. Принцип прямого доступа только к данным из атрибутов группировки, на мой взгляд, интуитивно понятен. В контексте, например, элемента Торговый представитель из Великобритании - эта группа состоит из трех строк. Я показал это с помощью функции COUNT (), использованной в этом запросе. Это также видно в предыдущем примере, где я представил все данные, над которыми я буду работать (синяя рамка - подходит для этой группы записей).

Попытка извлечения непосредственно в SELECT информации из столбца HireDate, откуда реляционный движок узнает, какое значение нам нужно. Внутри группы есть три записи, каждая из которых имеет различное значение «1993-10-17», «1994-01-02» и «1994-11-15».

Язык SQL основан на математической теории множеств, в которой (почти) нет случаев. Это строго определено. Поэтому на каждом шаге после GROUP BY у нас есть прямой доступ только к столбцам, которые составляют группу (перечислены в GROUP BY), а к другим столбцам мы можем ссылаться только на агрегатные функции .

Несмотря на это «ограничение», у нас есть возможность выполнять любые преобразования и действия с необработанными данными перед агрегацией.

В следующем примере я вычисляю средний возраст (AVG) сотрудника в группе, а также показываю информацию о самом старшем (MIN) и самом младшем (MAX). Я также использую две скалярные встроенные функции - YEAR (), которая извлекает год из даты, и GETDATE () - возвращает текущее системное время.

Выберите заголовок, страну, COUNT (*) в качестве EmQty, AVG (ГОД (Getdate ()) - YEAR (BirthDate)) в качестве AvgAge, MAX (YEAR (Getdate ()) - YEAR (BirthDate)) в качестве MaxAge, MIN (YEAR ( Getdate ()) - YEAR (Дата рождения)) как MinAge из dbo. Сотрудники GROUP BY Country, Название ORDER BY AvgAge

Обратите внимание, что в ORDER BY он ссылается на псевдоним результата функции AVG ()
Обратите внимание, что в ORDER BY он ссылается на псевдоним результата функции AVG (). Это подтверждение того, что шаг ORDER BY выполняется последним - после SELECT.

суммирование

Представленный выше метод GROUP BY является сущностью группировки записей. Следует помнить, что создаются разделы группировки атрибутов и необработанных данных. Не имеет значения, будем ли мы сначала группировать после столбца «x», а затем после «y». В теории множеств порядок элементов и атрибутов по определению не имеет значения.

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

SQL Server 2008 R2 также предлагает другие способы группировки записей. Они основаны на вышеуказанном принципе и являются лишь расширением механизма группировки. Они облегчают и оптимизируют несколько групповых задач (ГРУППОВЫЕ НАБОРЫ, CUBE, ROLLUP).