Используйте предложения HAVING и WHERE в одном запросе (визуальные инструменты базы данных)
Применимо: 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 или в агрегатной функции.
Указание предложения WHERE и HAVING для двух присоединенных таблиц
Примечание.
База данных, используемая в этой статье, является базой данных, доступной pubs
из Northwind и пабов примеры баз данных для 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;
В visual Database Tools of 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;