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


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

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

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