Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
применимо: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;