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


Практическое руководство. Использование предложений HAVING и WHERE в одном запросе

В некоторых экземплярах может возникнуть необходимость исключить отдельные строки из групп (с использованием предложения WHERE) до того, как применять условие к группе как к целому (с использованием предложения HAVING).

Предложение HAVING подобно предложению WHERE, но применимо только к целым группам (то есть к строкам в результирующем наборе, представляющим собой группы), тогда как предложение WHERE применимо к отдельным строкам. В запросе могут содержаться оба предложения: WHERE и HAVING. В этом случае:

  • Предложение WHERE применяется сначала к отдельным строкам таблиц или возвращающих табличное значение объектов в области схем. Группируются только строки, которые удовлетворяют условиям в предложении WHERE.

  • Затем предложение HAVING применяется к строкам в результирующем наборе. Только строки, которые удовлетворяют условиям HAVING, появляются в результирующем запросе. Можно применить предложение HAVING только к тем столбцам, которые появляются в предложении GROUP BY или агрегатной функции.

Например, предположим, что нужно соединить таблицы 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

Можно создать оба предложения HAVING и WHERE в области условий. По умолчанию любое заданное условие поиска для столбца становится частью предложения HAVING. Однако можно изменить условие, сделав его предложением WHERE.

Можно создать предложение WHERE и HAVING для одного и того же столбца. Для этого необходимо дважды добавить столбец в область критериев, затем указать один экземпляр как часть предложения HAVING и другой экземпляр как часть предложения WHERE.

Примечание

Отображаемые на компьютере имена или расположения некоторых элементов пользовательского интерфейса Visual Studio могут отличаться от указанных в следующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Параметры Visual Studio.

Чтобы указать условие 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
    

См. также

Другие ресурсы

Сортировка и группировка результатов запроса

Сводка по результатам запроса