В основном потому, что они были определены для разных целей. Предложение WHERE
предназначено для фильтрации записей, а предложение HAVING
предназначено для фильтрации с помощью агрегатных функций (GROUP BY
). Во втором запросе используется неявная фильтрация GROUP BY
, поэтому, например, если вы добавите еще один столбец в предложение SELECT
, вы получите другие результаты.
ИЗМЕНИТЬ на основе исправления Мартина Смита
HAVING
был создан, чтобы разрешить фильтрацию строк, полученных в результате GROUP BY
. Если GROUP BY
не указано, весь результат считается группой.
Если ни <where clause>
, ни <group by clause>
не указаны, то пусть T будет результатом предыдущего <from clause>
or
... группа - это вся таблица, если не указано <group by clause>
EDIT 2 Теперь о Псевдониме:
Спецификация предложения WHERE относительно ссылок на столбцы в условии поиска говорит следующее:
Каждое <column reference>
, непосредственно содержащееся в <search
condition>
, должно однозначно ссылаться на столбец T или быть внешней ссылкой.
См.: 7.6 <where clause>
, Синтаксическое правило 1.
Спецификация предложения HAVING относительно ссылок на столбцы в условии поиска говорит следующее:
Каждое <column reference>
, непосредственно содержащееся в <search
condition>
, должно однозначно ссылаться на столбец группировки T или быть внешней ссылкой.
См.: 7.8 <having clause>
, Синтаксическое правило 1.
А столбец группировки определяется как:
Столбец, указанный в <group by clause>
, является столбцом группировки.
Итак, в заключение WHERE
должен ссылаться на столбец таблицы, а предложение HAVING
должно ссылаться на группирующий столбец группы строк.
(второй проект неофициальной проверки) ISO/IEC 9075:1992, язык баз данных SQL - 30 июля 1992 г.
person
davidmontoyago
schedule
23.08.2012
having
в SQL Server. - person Martin Smith   schedule 23.08.2012