Практическое руководство. Использование предложений HAVING и WHERE в одном запросе
Обновлен: Ноябрь 2007
В некоторых экземплярах может возникнуть необходимость исключить отдельные строки из групп (с использованием предложения 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. |
Чтобы указать условие 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