HAVING SQL: краткое описание, синтаксис, примеры
SQL представляет собой стандарт языка для работы с реляционными базами данных. Он имеет в своем арсенале множество мощных инструментов манипулирования данными, хранящихся в виде таблиц.
Несомненно, возможность группировать данные при их выборке по определенному признаку является одним из таких инструментов. Оператор SQL HAVING наряду с оператором WHERE позволяет определять условия выборки уже сгруппированных некоторым образом данных.
Параметр HAVING SQL: описание
Прежде всего стоит отметить, что данный параметр является необязательным и применяется исключительно в связке с параметром GROUP BY. Как вы помните, GROUP BY применяется тогда, когда в SELECT используются агрегатные функции, и результаты их вычислений нужно получить по определенным группам. Если WHERE позволяет задать условия выборки перед тем, как данные будут сгруппированы, то HAVING содержит условия, касающиеся данных уже непосредственно в самих группах.
Для лучшего понимания давайте разберем пример со схемой, представленный на рисунке ниже.
Это отличный пример, дающий HAVING SQL описание. Дана таблица с перечнем наименований продукции, компаниями, выпускающими их, и некоторыми другими полями. В запросе в верхнем правом углу мы пытаемся получить информацию о том, какое количество наименований продукции выпускает каждая компания, при этом в результат мы хотим вывести только те компании, которые выпускают более 2 наименований. Параметр GROUP BY сформировал три группы, соответствующие названиям компаний, для каждой из которых посчитано количество продукции (строк). Но параметр HAVING своим условием отсек одну группу из результирующей выборки, поскольку она не удовлетворяла условию. В результате мы получаем две группы, соответствующие компаниям с количеством продукции 5 и 3.
Может возникнуть вопрос о том, зачем использовать HAVING, если в SQL имеется WHERE. Если бы мы использовали WHERE, то он бы смотрел на общее количество строк в таблице, а не по группам, и условие не имело бы смысла в данном случае.
Однако довольно часто они прекрасно уживаются в одном запросе.
На примере выше мы можем видеть, как сначала происходит отбор данных по именам работников, указанным в параметре WHERE, а затем сгруппированный в GROUP BY результат проходит дополнительную проверку по сумме зарплаты для каждого работника.
Параметр SQL HAVING: примеры, синтаксис
Рассмотрим некоторые особенности синтаксиса HAVING SQL. Описание данного параметра довольно простое. Во-первых, как уже отмечалось, он используется исключительно в связке с параметром GROUP BY и указывается сразу же после него и перед ORDER BY, если таковой имеется в запросе. Оно и понятно, так как HAVING определяет условия для уже сгруппированных данных. Во-вторых, в условии этого параметра можно использовать только агрегатные функции и поля, указанные в параметре GROUP BY. Все условия в данном параметре указываются точно таким же образом, как и в случае с WHERE.
Заключение
Как видите, ничего сложного в данном операторе нет.
Семантически он используется так же, как и WHERE. Важно понять то, что WHERE используют относительно всех выбираемых данных, а HAVING — только по отношению к группам, определенным в параметре GROUP BY. Мы представили исчерпывающее для HAVING SQL описание, которого достаточно для уверенной работы с ним.
Оператор SQL: HAVING. — it-black.ru
Оператор SQL: HAVING. — it-black.ruОператор HAVING наряду с оператором WHERE позволяет определять условия выборки уже сгруппированных некоторым образом данных. Только оператор HAVING применяется не для всего набора столбцов таблицы, а для набора созданного оператором SQL GROUP BY и применяется всегда строго после него. Его синтаксис:
HAVING aggregate_function(column_name) operator value;
Примеры оператора SQL HAVING. Имеется следующая таблица Artists:
| Singer | Album | Year | Sale |
| The Prodigy | Invaders Must Die | 2008 | 1200000 |
| Drowning Pool | Sinner | 2001 | 400000 |
| Massive Attack | Mezzanine | 1998 | 2300000 |
| The Prodigy | Fat of the Land | 1997 | 600000 |
| The Prodigy | Music For The Jilted Generation | 1994 | 1500000 |
| Massive Attack | 100th Window | 2003 | 1200000 |
| Drowning Pool | Full Circle | 2007 | 800000 |
| Massive Attack | Danny The Dog | 2004 | 1900000 |
| Drowning Pool | Resilience | 2013 | 500000 |
Пример 1.
Используя оператор SQL HAVING выведем название исполнителей (Singer) число продаж альбомов (Sale) которого больше 2000000:
SELECT Singer, SUM(Sale) FROM Artists GROUP BY Singer HAVING SUM(Sale) > 2000000;
Пример 2. Используя оператор SQL HAVING выведем название исполнителя, который исполнялся еще до 1995 года:
SELECT Singer, MIN(Year) FROM Artists GROUP BY Singer HAVING MIN(Year)Самостоятельно создайте таблицу Artists и выполните каждый пример. В комментариях можете писать новые примеры к данной таблице и не только.
Поделиться в facebook
Поделиться в twitter
Поделиться в vk
VK
Поделиться в google
Google+
Группа в VK
Помощь проекту
Обнаружили опечатку?
Сообщите нам об этом, выделите текст с ошибкой и нажмите Ctrl+Enter, будем очень признательны!
Свежие статьи
Облако меток
Instagram Vk Youtube Telegram Odnoklassniki
Полезно знать
Рубрики
Авторы
© it-black.
ru | 2016 — 2022
Использование предложений HAVING и WHERE в одном запросе — визуальные инструменты для работы с базами данных
Обратная связь Редактировать
Твиттер LinkedIn Фейсбук Эл. адрес
- Статья
- 3 минуты на чтение
Применимо к: SQL Server (все поддерживаемые версии) База данных SQL Azure Управляемый экземпляр Azure SQL Аналитика синапсов Azure Система аналитической платформы (PDW)
В некоторых случаях может потребоваться исключить отдельные строки из групп (используя предложение WHERE) перед применением условия к группам в целом (используя предложение HAVING).
Предложение HAVING похоже на предложение WHERE, но применяется только к группам в целом (то есть к строкам в результирующем наборе, представляющим группы), тогда как предложение WHERE применяется к отдельным строкам. Запрос может содержать как предложение WHERE, так и предложение HAVING. В этом случае:
Предложение WHERE сначала применяется к отдельным строкам в таблицах или табличным объектам на панели диаграммы. Группируются только те строки, которые соответствуют условиям в предложении WHERE.
Предложение HAVING затем применяется к строкам в результирующем наборе. В результатах запроса отображаются только те группы, которые соответствуют условиям HAVING. Вы можете применять предложение HAVING только к столбцам, которые также появляются в предложении GROUP BY или в агрегатной функции.
Например, представьте, что вы объединяете таблицы наименований и издателей , чтобы создать запрос, показывающий среднюю цену книги для набора издателей.
Вы хотите увидеть среднюю цену только для определенного набора издателей — возможно, только для издателей в штате Калифорния. И даже в этом случае вы хотите видеть среднюю цену, только если она превышает 10 долларов США.
Вы можете установить первое условие, включив предложение WHERE, которое отбрасывает всех издателей, которые не находятся в Калифорнии, до расчета средних цен. Для второго условия требуется предложение HAVING, поскольку условие основано на результатах группировки и суммирования данных. Результирующий оператор SQL может выглядеть следующим образом:
SELECT titles.pub_id, AVG(titles.price) ОТ издателей INNER JOIN ON titles.pub_id = publishers.pub_id ГДЕ publishers.state = 'CA' СГРУППИРОВАТЬ ПО titles.pub_id ПРИ СРЕДНЕМ (цене) > 10;
В визуальных инструментах для работы с базами данных в SQL Server Management Studio можно создать предложения HAVING и WHERE на панели критериев . По умолчанию, если вы указываете условие поиска для столбца, оно становится частью предложения HAVING.
Однако вы можете изменить условие на предложение WHERE.
Вы можете создать предложение WHERE и предложение HAVING с использованием одного и того же столбца. Для этого необходимо дважды добавить столбец на панель Criteria , а затем указать один экземпляр как часть предложения HAVING, а другой экземпляр — как часть предложения WHERE.
Чтобы указать условие WHERE в агрегированном запросе
Укажите группы для вашего запроса. Дополнительные сведения см. в разделе Групповые строки в результатах запроса.
Если его еще нет на панели Критерии , добавьте столбец, на котором вы хотите основывать условие WHERE.
Очистите столбец Output , если столбец данных не является частью предложения GROUP BY или включен в агрегатную функцию.
В столбце Фильтр укажите условие ГДЕ. Конструктор запросов и представлений добавляет условие в предложение HAVING оператора SQL.

Примечание
Запрос, показанный в примере для этой процедуры, объединяет две таблицы:
titlesиpublishers.На этом этапе запроса оператор SQL содержит предложение HAVING:
ВЫБЕРИТЕ titles.pub_id, AVG(titles.price) ОТ издателей INNER JOIN ON titles.pub_id = publishers.pub_id СГРУППИРОВАТЬ ПО titles.pub_id НАЛИЧИЕ publishers.state = 'CA'
В столбце Group By выберите Where из списка параметров группировки и сводки. Конструктор запросов и представлений удаляет условие из предложения HAVING в операторе SQL и добавляет его в предложение WHERE.
Оператор SQL изменяется и вместо него включает предложение WHERE:
ВЫБЕРИТЕ titles.pub_id, AVG(titles.price) ОТ издателей INNER JOIN ON titles.pub_id = publishers.pub_id ГДЕ publishers.state = 'CA' СГРУППИРОВАТЬ ПО titles.pub_id
См. также
- SELECT — HAVING
Следующие шаги
- Сортировка и группировка результатов запроса
- Суммировать результаты запроса
Обратная связь
Отправить и просмотреть отзыв для
Этот продукт Эта страница
Просмотреть все отзывы о странице
MySQL HAVING
Сводка : В этом руководстве вы узнаете, как использовать предложение MySQL HAVING для указания условия фильтрации для групп строк или агрегатов.
Введение в предложение MySQL HAVING
HAVING используется в операторе SELECT для указания условий фильтрации для группы строк или агрегатов. Предложение HAVING часто используется с предложением GROUP BY для фильтрации групп на основе заданного условия. Если опустить предложение GROUP BY , предложение HAVING будет вести себя как предложение WHERE .
Ниже показан синтаксис предложения HAVING :
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT select_list ИЗ имя_таблицы КУДА условие_поиска ГРУППА ПО group_by_expression НАЛИЧИЕ групповое_условие;
В этом синтаксисе вы указываете условие в предложении HAVING .
Предложение HAVING оценивает каждую группу, возвращаемую предложением GROUP BY. Если результат верен, строка включается в набор результатов.
Обратите внимание, что предложение HAVING применяет условие фильтрации к каждой группе строк, а предложение WHERE применяет условие фильтрации к каждой отдельной строке.
MySQL оценивает , имеющие предложение после из группы , , где , Select и на Claouses и до на и ограничения CLAUSES:
888, и Ограничение CLAUSES: примечательно, что STARDIFIE STARDIFE, что STARDIFIE STARDIFIE, что STARDIFIE SPARIESE:
, и . Specifie Spetifie, что SPARIFIESE STARDIFIE, 9003 HAVING оценивается до SELECT и после GROUP BY . Примеры предложения MySQL HAVING
HAVING 9Пункт 0038, чтобы увидеть, как это работает.
Мы будем использовать таблицу orderdetails в образце базы данных для демонстрации.
Следующее использует предложение GROUP BY для получения номеров заказов, количества товаров, проданных по заказу, и общего объема продаж для каждого из таблицы деталей заказа :
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT порядковый номер, SUM(количествоЗаказано) AS itemsCount, СУММ(ценакаждого*количествоЗаказа) КАК итого ИЗ Информация для заказа СГРУППИРОВАТЬ ПО номеру заказа;
Попробуйте
Теперь вы можете найти заказ с общим объемом продаж больше 1000 , используя условие HAVING следующим образом:
ВЫБЕРИТЕ
порядковый номер,
SUM(количествоЗаказано) AS itemsCount,
СУММ(ценакаждого*количествоЗаказа) КАК итого
ИЗ
Информация для заказа
ГРУППА ПО
порядковый номер
НАЛИЧИЕ
всего > 1000; Язык кода: SQL (язык структурированных запросов) (sql) Попробуйте
В предложении HAVING можно сформировать сложное условие, используя логические операторы, такие как ИЛИ и И .
В следующем примере предложение HAVING используется для поиска заказов, общая сумма которых превышает 1000 и которые содержат более 600 позиций:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT порядковый номер, SUM(количествоЗаказано) AS itemsCount, СУММ(ценакаждого*количествоЗаказа) КАК итого ИЗ Информация для заказа СГРУППИРОВАТЬ ПО номеру заказа НАЛИЧИЕ всего > 1000 И количество предметов > 600;
Попробуйте
Предположим, вы хотите найти все заказы, которые уже отправлены и общая сумма которых превышает 1500, вы можете присоединиться к сведениям о заказе таблица с таблицей заказов с использованием предложения INNER JOIN и применить условие к столбцу состояния и сумме всего , как показано в следующем запросе:
SELECT номер заказа, статус, СУММА(ценакаждого*количествоЗаказа) итого ИЗ детали заказа ВНУТРЕННЕЕ СОЕДИНЕНИЕ заказы b ВКЛ b.


