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 | Дима | 23 | 100 |
2 | Петя | 23 | 200 |
3 | Вася | 23 | 300 |
4 | Коля | 24 | 1000 |
5 | Иван | 24 | 2000 |
6 | Кирилл | 25 | 1000 |
Пример
В данном примере демонстрируется работа GROUP BY без условия HAVING:
SELECT age, SUM(salary) as sum FROM workers GROUP BY age
SQL запрос выберет следующие строки:
age возраст | sum сумма |
---|---|
23 | 600 |
24 | 3000 |
25 | 1000 |
А теперь с помощью условия HAVING оставим только те строки, в которых
суммарная зарплата больше или равна 1000:
SELECT age, SUM(salary) as sum FROM workers GROUP BY age HAVING sum>=1000
SQL запрос выберет следующие строки:
age возраст | sum сумма |
---|---|
24 | 3000 |
25 | 1000 |
Пример
Подсчитаем с помощью функции COUNT
количество записей в группе (не используя HAVING):
SELECT age, COUNT(*) as count FROM workers GROUP BY age
SQL запрос выберет следующие строки:
age возраст | count количество |
---|---|
23 | 3 |
24 | 2 |
25 | 1 |
А теперь с помощью условия HAVING оставим только те группы, в которых
количество строк меньше или равно двум:
SELECT age, COUNT(*) as count FROM workers GROUP BY age HAVING count
SQL запрос выберет следующие строки:
age возраст | count количество |
---|---|
24 | 2 |
25 | 1 |
Аналогичного эффекта можно достигнуть, если воспользоваться
командой 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 в статистическом запросе
Укажите группы для запроса. Дополнительные сведения см. в статье о группировании строк в результатах запроса.
Если столбца, на котором основывается условие WHERE, нет на панели критериев, то добавьте его.
Очистите столбец Вывод , если столбец данных не является частью предложения GROUP BY или не входит в агрегатную функцию.
В столбце Фильтр укажите условие 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'
В столбце Группировать выберите 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
Предложение В этом синтаксисе предложение Поскольку SQL Server обрабатывает предложение Вместо этого вы должны использовать выражение агрегатной функции в предложении Давайте рассмотрим несколько примеров, чтобы понять, как работает предложение См. следующую таблицу В этом примере: Язык кода: SQL (язык структурированных запросов) (sql) В этом примере: См. следующие продукты Следующий оператор сначала находит максимальную и минимальную прейскурантные цены в каждой категории продуктов. Затем он отфильтровывает категорию с максимальной прейскурантной ценой более 4000 или минимальной прейскурантной ценой менее 500: НАЛИЧИЕ 9Предложение 0432
HAVING
часто используется с предложением GROUP BY
для фильтрации групп на основе указанного списка условий. Ниже показан синтаксис предложения HAVING
:
SELECT
select_list
ИЗ
имя_таблицы
ГРУППА ПО
список_групп
НАЛИЧИЕ
условия;
GROUP BY
объединяет строки в группы, а Пункт HAVING
применяет к этим группам одно или несколько условий. В результат включаются только группы, в которых условия оцениваются как TRUE
. Другими словами, группы, для которых условие оценивается как ЛОЖЬ
или НЕИЗВЕСТНО
, отфильтровываются. HAVING
после предложения GROUP BY
, вы не можете ссылаться на агрегатную функцию, указанную в списке выбора, с помощью псевдонима столбца. Следующий запрос завершится ошибкой:
ВЫБЕРИТЕ
имя_столбца1,
имя_столбца2,
агрегатная_функция (имя_столбца3) псевдоним_столбца
ИЗ
имя_таблицы
ГРУППА ПО
имя_столбца1,
имя_столбца2
НАЛИЧИЕ
алиас_столбца > значение;
HAVING
явно следующим образом:
SELECT
имя_столбца1,
имя_столбца2,
агрегатная_функция (column_name3) псевдоним
ИЗ
имя_таблицы
ГРУППА ПО
имя_столбца1,
имя_столбца2
НАЛИЧИЕ
агрегатная_функция (имя_столбца3) > значение;
SQL Server
HAVING
примеров HAVING
. SQL Server
HAVING
с функцией COUNT
Пример заказов
из примера базы данных: год:
ВЫБЕРИТЕ
Пользовательский ИД,
ГОД (дата_заказа),
COUNT (идентификатор_заказа) количество_заказов
ИЗ
заказы на продажу
ГРУППА ПО
Пользовательский ИД,
ГОД (дата_заказа)
НАЛИЧИЕ
COUNT (идентификатор_заказа) >= 2
СОРТИРОВАТЬ ПО
Пользовательский ИД;
GROUP BY
группирует заказ на продажу по клиенту и году заказа. Функция COUNT()
возвращает количество заказов, размещенных каждым клиентом за каждый год. HAVING
отфильтровывало всех клиентов, число заказов которых меньше двух. SQL Server
Условие HAVING
с функцией SUM()
номер заказа,
СУММА (
количество * list_price * (1 - скидка)
) чистая стоимость
ИЗ
продажи.order_items
ГРУППА ПО
номер заказа
НАЛИЧИЕ
СУММА (
количество * list_price * (1 - скидка)
) > 20000
СОРТИРОВАТЬ ПО
чистая стоимость;
SUM()
возвращает чистую стоимость заказов на продажу. HAVING
фильтрует заказы на продажу, чистая стоимость которых меньше или равна 20 000. Пример SQL Server
HAVING
с функциями MAX
и MIN
table: SELECT
id_категории,
МАКС.