Sql group by having by: SQL GROUP BY and HAVING Clause with Examples

Команда HAVING — условие для GROUP BY

Команда HAVING позволяет фильтровать результат группировки,
сделанной с помощью команды GROUP BY.

См. также команду WHERE,
которая задает условие на выборку записей.

Синтаксис

GROUP BY поле HAVING условие

Примеры

Все примеры будут по этой таблице workers, если не сказано иное:

id
айди
name
имя
age
возраст
salary
зарплата
1Дима23100
2Петя23200
3Вася23300
4Коля241000
5Иван242000
6Кирилл251000

Пример

В данном примере демонстрируется работа GROUP BY без условия HAVING:

SELECT age, SUM(salary) as sum FROM workers GROUP BY age

SQL запрос выберет следующие строки:

age
возраст
sum
сумма
23600
243000
251000

А теперь с помощью условия HAVING оставим только те строки, в которых
суммарная зарплата больше или равна 1000:

SELECT age, SUM(salary) as sum FROM workers GROUP BY age HAVING sum>=1000

SQL запрос выберет следующие строки:

age
возраст
sum
сумма
243000
251000

Пример

Подсчитаем с помощью функции COUNT
количество записей в группе (не используя HAVING):

SELECT age, COUNT(*) as count FROM workers GROUP BY age

SQL запрос выберет следующие строки:

age
возраст
count
количество
233
242
251

А теперь с помощью условия HAVING оставим только те группы, в которых
количество строк меньше или равно двум:

SELECT age, COUNT(*) as count FROM workers GROUP BY age HAVING count

SQL запрос выберет следующие строки:

age
возраст
count
количество
242
251

Аналогичного эффекта можно достигнуть, если воспользоваться
командой IN:

SELECT age, COUNT(*) as count FROM workers GROUP BY age HAVING count IN(1,2)

Можно также использовать команду BETWEEN:

SELECT age, COUNT(*) as count FROM workers GROUP BY age HAVING count BETWEEN 1 AND 2

Как вы видите, в HAVING допустимы все команды,
используемые в условии WHERE.

← Предыдущая страница
Следующая страница →

Использование предложений HAVING и WHERE в одном запросе — Visual Database Tools





Twitter




LinkedIn




Facebook




Адрес электронной почты










  • Статья

  • Чтение занимает 2 мин

Область применения: SQL Server (все поддерживаемые версии) База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics Analytics Platform System (PDW)

В некоторых экземплярах может понадобиться исключить отдельные строки из групп (с использованием предложения WHERE) до того, как применять условие к группе как к целому (с использованием предложения HAVING).

Предложение HAVING подобно предложению WHERE, но применимо только к целым группам (то есть к строкам в результирующем наборе, представляющим собой группы), тогда как предложение WHERE применимо к отдельным строкам. В запросе могут содержаться оба предложения: WHERE и HAVING. В этом случае:

  • Предложение WHERE применяется сначала к отдельным строкам таблиц или возвращающих табличное значение объектов на панели диаграмм. Группируются только строки, которые удовлетворяют условиям в предложении WHERE.

  • Затем предложение HAVING применяется к строкам в результирующем наборе. Только строки, которые удовлетворяют условиям HAVING, появляются в результирующем запросе. Можно применить предложение HAVING только к тем столбцам, которые появляются в предложении GROUP BY или агрегатной функции.

Например, соединяются таблицы titles и publishers, чтобы создать запрос, показывающий среднюю цену книги для группы издателей. Требуется средняя цена книги только определенной группы издателей — например, только издателей в штате Калифорния. При этом нужно показать только те средние цены, которые превышают $10,00.

Первое условие можно задать с помощью предложения WHERE, которое устраняет всех издателей не из Калифорнии перед тем, как начать вычисление средней цены. Второе условие требует предложения HAVING, так как условие основано на результатах группирования и сводных данных. Конечная инструкция SQL может выглядеть следующим образом:

SELECT titles.pub_id, AVG(titles.price)  
FROM titles INNER JOIN publishers  
   ON titles.pub_id = publishers.pub_id  
WHERE publishers.state = 'CA'  
GROUP BY titles.pub_id  
HAVING AVG(price) > 10;  

В визуальных инструментах базы данных среды SQL Server Management Studio можно создать оба предложения HAVING и WHERE на панели условий. По умолчанию любое заданное условие поиска для столбца становится частью предложения HAVING. Однако можно изменить условие, сделав его предложением WHERE.

Можно создать предложение WHERE и HAVING для одного и того же столбца. Для этого необходимо дважды добавить столбец в области критериев, затем указать один экземпляр как часть предложения HAVING и другой экземпляр как часть предложения WHERE.

Задание условия WHERE в статистическом запросе

  1. Укажите группы для запроса. Дополнительные сведения см. в статье о группировании строк в результатах запроса.

  2. Если столбца, на котором основывается условие WHERE, нет на панели критериев, то добавьте его.

  3. Очистите столбец Вывод , если столбец данных не является частью предложения GROUP BY или не входит в агрегатную функцию.

  4. В столбце Фильтр укажите условие WHERE. Конструктор запросов и представлений добавляет условие в предложение HAVING инструкции SQL.

    Примечание

    В качестве примера данной процедуры показан запрос, соединяющий две таблицы titles и publishers.

    В этой точке в запросе инструкции SQL содержится предложение HAVING:

    SELECT titles. pub_id, AVG(titles.price)  
    FROM titles INNER JOIN publishers   
       ON titles.pub_id = publishers.pub_id  
    GROUP BY titles.pub_id  
    HAVING publishers.state = 'CA'  
    
  5. В столбце Группировать выберите Where из списка параметров группировки и сводки. Конструктор запросов и представлений удаляет условие из предложения HAVING инструкции SQL и добавляет его в предложение WHERE.

    Инструкция SQL изменяется, теперь она содержит предложение WHERE:

    SELECT titles.pub_id, AVG(titles.price)  
    FROM titles INNER JOIN publishers   
       ON titles.pub_id = publishers.pub_id  
    WHERE publishers.state = 'CA'  
    GROUP BY titles.pub_id  
    

См. также

  • SELECT — HAVING

Дальнейшие действия

  • Сортировка и группировка результатов запроса
  • Резюмирование результатов запросов






Предложение SQL GROUP BY и HAVING с примерами

Ричард Петерсон

Часы

Обновлено

Что такое группа SQL по пункту?

Предложение GROUP BY — это команда SQL, которая используется для группировки строк с одинаковыми значениями . Предложение GROUP BY используется в операторе SELECT. При необходимости он используется в сочетании с агрегатными функциями для создания сводных отчетов из базы данных.

Вот что он делает, суммирование данных из базы данных.

Запросы, содержащие предложение GROUP BY, называются групповыми запросами и возвращают только одну строку для каждого сгруппированного элемента.

Синтаксис SQL GROUP BY

Теперь, когда мы знаем, что такое предложение SQL GROUP BY, давайте рассмотрим синтаксис базовой группы по запросу.

 Операторы SELECT... GROUP BY имя_столбца1[имя_столбца2,...] [ИМЕЕТ условие]; 

ЗДЕСЬ

  • Операторы SELECT… — это стандартный запрос команды SQL SELECT.
  • « GROUP BY имя_столбца1 » — это предложение, которое выполняет группировку на основе имя_столбца1.
  • «[column_name2,…]» не является обязательным; представляет другие имена столбцов, когда группировка выполняется более чем по одному столбцу.
  • «[ИМЕЕТ условие]» является необязательным; он используется для ограничения строк, затронутых предложением GROUP BY. Это похоже на предложение WHERE.

Группировка с использованием одного столбца

Чтобы лучше понять действие предложения SQL Group By, давайте выполним простой запрос, который возвращает все записи пола из таблицы участников.

 ВЫБЕРИТЕ `пол` ИЗ `членов`; 
 
пол
Женский
Женский
Мужской
Женский
Мужской
Мужской
Мужской
Мужской
Мужской

Предположим, мы хотим получить уникальные значения для полов. Мы можем использовать следующий запрос —

 ВЫБЕРИТЕ `пол` ИЗ `членов` СГРУППИРОВАТЬ ПО `полу`; 

Выполнение вышеуказанного скрипта в рабочей среде MySQL для Myflixdb дает нам следующие результаты.

 
пол
Женский
Мужской

Обратите внимание, что были возвращены только два результата. Это потому, что у нас есть только два гендерных типа: мужской и женский. Предложение GROUP BY в SQL сгруппировало все «мужские» члены вместе и вернуло для него только одну строку. То же самое было и с «женскими» участницами.

Группировка с использованием нескольких столбцов

Предположим, что мы хотим получить список фильмов category_id и соответствующих лет, в которых они были выпущены.

Давайте посмотрим на результат этого простого запроса

 SELECT `category_id`,`year_released` FROM `movies` ; 
 
идентификатор_категории год выпуска
1 2011
2 2008
НУЛЕВОЙ 2008
НУЛЕВОЙ 2010
8 2007
6 2007
6 2007
8 2005
НУЛЕВОЙ 2012
7 1920
8 НУЛЕВОЙ
8 1920

Приведенный выше результат имеет много дубликатов.

Давайте выполним тот же запрос, используя group by в SQL –

 SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`; 

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

 
идентификатор_категории год выпуска
НУЛЕВОЙ 2008
НУЛЕВОЙ 2010
НУЛЕВОЙ 2012
1 2011
2 2008
6 2007
7 1920
8 1920
8 2005
8 2007

Предложение GROUP BY работает как с идентификатором категории, так и с годом выпуска, чтобы идентифицировать уникальных строк в нашем примере выше.

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

Группировка и агрегатные функции

Предположим, нам нужно общее количество мужчин и женщин в нашей базе данных. Для этого мы можем использовать следующий скрипт, показанный ниже.

 ВЫБЕРИТЕ `gender`,COUNT(`membership_number`) FROM `members` GROUP BY `gender`; 

Выполнение вышеуказанного скрипта в рабочей среде MySQL для myflixdb дает нам следующие результаты.

 
пол СЧЕТ('членский_номер')
Женский 3
Мужской 5

Показанные ниже результаты сгруппированы по каждому уникальному опубликованному значению пола, а количество сгруппированных строк подсчитывается с помощью агрегатной функции COUNT.

Ограничение результатов запроса с помощью предложения

HAVING

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

. Предположим, мы хотим узнать все годы выпуска для категории фильмов с идентификатором 8. Мы будем использовать следующий сценарий для достижения наших результатов.

 SELECT * FROM `movies` GROUP BY `category_id`, `year_released`, ИМЕЮЩИЙ `category_id` = 8; 

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

 
фильм_идентификатор название директор год выпуска id категории
9 Медовые лунатики Джон Шульц 2005 8
5 Папины маленькие девочки НУЛЕВОЙ 2007 8

Обратите внимание, что наше предложение GROUP BY затронуло только фильмы с идентификатором категории 8.

Сводка

  • Предложение GROUP BY SQL используется для группировки строк с одинаковыми значениями.
  • Предложение GROUP BY используется вместе с оператором SQL SELECT.
  • Оператор SELECT, используемый в предложении GROUP BY, может содержать только имена столбцов, агрегатные функции, константы и выражения.
  • Предложение SQL Have используется для ограничения результатов, возвращаемых предложением GROUP BY.
  • Предложение MYSQL GROUP BY используется для сбора данных из нескольких записей и возврата набора записей по одному или нескольким столбцам.

SQL Server HAVING Пункт

Резюме : в этом руководстве вы узнаете, как использовать SQL Server HAVING пункт для фильтрации групп на основе заданных условий.

Введение в SQL Server

НАЛИЧИЕ 9Предложение 0432

Предложение HAVING часто используется с предложением GROUP BY для фильтрации групп на основе указанного списка условий. Ниже показан синтаксис предложения HAVING :

 

SELECT select_list ИЗ имя_таблицы ГРУППА ПО список_групп НАЛИЧИЕ условия;

Язык кода: SQL (язык структурированных запросов) (sql)

В этом синтаксисе предложение GROUP BY объединяет строки в группы, а Пункт HAVING применяет к этим группам одно или несколько условий. В результат включаются только группы, в которых условия оцениваются как TRUE . Другими словами, группы, для которых условие оценивается как ЛОЖЬ или НЕИЗВЕСТНО , отфильтровываются.

Поскольку SQL Server обрабатывает предложение HAVING после предложения GROUP BY , вы не можете ссылаться на агрегатную функцию, указанную в списке выбора, с помощью псевдонима столбца. Следующий запрос завершится ошибкой:

 

ВЫБЕРИТЕ имя_столбца1, имя_столбца2, агрегатная_функция (имя_столбца3) псевдоним_столбца ИЗ имя_таблицы ГРУППА ПО имя_столбца1, имя_столбца2 НАЛИЧИЕ алиас_столбца > значение;

Язык кода: SQL (язык структурированных запросов) (sql)

Вместо этого вы должны использовать выражение агрегатной функции в предложении HAVING явно следующим образом:

 

SELECT имя_столбца1, имя_столбца2, агрегатная_функция (column_name3) псевдоним ИЗ имя_таблицы ГРУППА ПО имя_столбца1, имя_столбца2 НАЛИЧИЕ агрегатная_функция (имя_столбца3) > значение;

Язык кода: SQL (язык структурированных запросов) (sql)

SQL Server

HAVING примеров

Давайте рассмотрим несколько примеров, чтобы понять, как работает предложение HAVING .

SQL Server

HAVING с функцией COUNT Пример

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

 

ВЫБЕРИТЕ Пользовательский ИД, ГОД (дата_заказа), COUNT (идентификатор_заказа) количество_заказов ИЗ заказы на продажу ГРУППА ПО Пользовательский ИД, ГОД (дата_заказа) НАЛИЧИЕ COUNT (идентификатор_заказа) >= 2 СОРТИРОВАТЬ ПО Пользовательский ИД;

Язык кода: SQL (язык структурированных запросов) (sql)

В этом примере:

  • Во-первых, предложение GROUP BY группирует заказ на продажу по клиенту и году заказа. Функция COUNT() возвращает количество заказов, размещенных каждым клиентом за каждый год.
  • Во-вторых, условие HAVING отфильтровывало всех клиентов, число заказов которых меньше двух.

SQL Server

Условие HAVING с функцией SUM()
номер заказа,
СУММА (
количество * list_price * (1 - скидка)
) чистая стоимость
ИЗ
продажи.order_items
ГРУППА ПО
номер заказа
НАЛИЧИЕ
СУММА (
количество * list_price * (1 - скидка)
) > 20000
СОРТИРОВАТЬ ПО
чистая стоимость;

Язык кода: SQL (язык структурированных запросов) (sql)

В этом примере:

  • Сначала функция SUM() возвращает чистую стоимость заказов на продажу.
  • Во-вторых, предложение HAVING фильтрует заказы на продажу, чистая стоимость которых меньше или равна 20 000.

Пример SQL Server

HAVING с функциями MAX и MIN

См. следующие продукты table:

Следующий оператор сначала находит максимальную и минимальную прейскурантные цены в каждой категории продуктов. Затем он отфильтровывает категорию с максимальной прейскурантной ценой более 4000 или минимальной прейскурантной ценой менее 500:

SELECT
id_категории,
МАКС.