Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
применимо:SQL Server
База данных Azure SQL
Управляемый экземпляр Azure SQL
Azure Synapse Analytics
Платформа аналитики (PDW)
В некоторых случаях может потребоваться исключить отдельные строки из групп (с помощью предложения WHERE
) перед применением условия к группам в целом (с помощью предложения HAVING
).
Предложение HAVING
похоже на предложение WHERE
, но применяется только к группам в целом (то есть к строкам в результирующем наборе, представляющей группы), в то время как предложение WHERE
применяется к отдельным строкам. Запрос может содержать предложение WHERE
и предложение HAVING
. В этом случае:
Предложение
WHERE
применяется сначала к отдельным строкам в таблицах или табличных значениях в панели диаграммы . Группируются только строки, соответствующие условиям в предложенииWHERE
.Затем предложение
HAVING
применяется к строкам в результирующем наборе. В выходных данных запроса отображаются только группы, соответствующие условиямHAVING
. Можно применить предложениеHAVING
только к столбцам, которые также отображаются в предложении GROUP BY или в агрегатной функции.
Укажите предложение WHERE и HAVING для двух объединённых таблиц
Заметка
База данных, используемая в этой статье, — это база данных pubs
, доступная в образцах баз данных Northwind и pubs для Microsoft SQL Server на сайте GitHub.
Например, предположим, что вы присоединяеесь к 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;
В визуальных Database Tools в 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'
В столбце Группировать по выберите Где из списка параметров группы и сводки. Конструктор запросов и представлений удаляет условие из предложения
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 (Transact-SQL)
- Результаты сортировки и группового запроса (визуальные инструменты базы данных)
- сводка результатов запроса (визуальные инструменты базы данных)