Поделиться через


Используйте предложения HAVING и WHERE в одном запросе (визуальные инструменты базы данных)

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics AnalyticsPlatform 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 в агрегатном запросе

  1. Укажите группы для запроса. Дополнительные сведения см. в разделе Группирование строк в результатах запроса (визуальные инструменты для баз данных).

  2. Если он еще не находится в области условий , добавьте столбец, на котором вы хотите создать WHERE условие.

  3. Очистите столбец Вывод , если столбец данных не является частью предложения GROUP BY или не входит в агрегатную функцию.

  4. В столбце "Фильтр" укажите 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'
    
  5. В столбце Группировать выберите 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;