HAVING-спецификация
Функция
Задает ограничение для сгруппированной таблицы, полученной путем применения предшествующей < FROM-спецификации >
, < WHERE-спецификации >
или < GROUP BY-спецификации >
, которое состоит в том, что исключаются группы, не удовлетворяющие < логическому выражению >
.
Спецификация
::=
Синтаксические правила
-
Каждый элемент
< логического выражения >
(< спецификация столбца >
,< значимое выражение >
или< SQL-параметр >
) должен однозначно указывать на группируемый столбец из результата предшествующих< FROM-спецификации >
,< WHERE-спецификации >
или< GROUP BY-спецификации >
. -
Каждая
< спецификация столбца >
, содержащаяся в< подзапросе > < логического выражения >
и указывающая на внешний столбец, должна быть группирующим столбцом предшествующих< FROM-спецификации >
,< WHERE-спецификации >
или< GROUP BY-спецификации >
либо аргументом агрегатной функции.select distinct make from auto group by make having max(year) > (select min(auto.year) from auto, person where person.personid=auto.personid and length(auto.make)=length(person.name));
-
Запрещено обращение из подзапроса в
< HAVING-спецификации >
к негруппируемым столбцам. -
Числовые значения
< значимого выражения >
, заданного в< логическом выражении >
, допускается представлять в строковом виде.select name, count(*) from person group by name having max(salary) > '50000';
Общие правила
-
Если предшествующая спецификация не содержит
< GROUP BY-спецификацию >
, то результатом< HAVING-спецификации >
является единственная группа, а группируемый столбец отсутствует. -
< Логическое выражение >
применяется к каждой группе из результата предшествующих спецификаций. Результатом< HAVING-спецификации >
будет сгруппированная таблица, в которую войдут те группы, для которых результатом< логического выражения >
будет значение «истина». -
Когда
< логическое выражение >
наложено на группу, то эта группа является аргументом любой агрегатной функции, непосредственно содержащейся в< логическом выражении >
, если только< спецификация столбца >
в агрегатной функции не является внешней ссылкой. -
Все
< подзапросы >
в< логическом выражении >
выполняются для каждой группы, а полученные результаты применяются к каждой группе, удовлетворяющей< логическому выражению >
. Если< подзапрос >
содержит внешнюю ссылку на столбец, то она является ссылкой на значение этого столбца в данной группе.select make from auto group by make having max(year+1900)< (select to_number(to_char(sysdate, 'yyyy')));
-
В
< HAVING-спецификации >
можно указывать только те столбцы и значимые выражения, по которым делается группировка.Получить список производителей машин черного, белого и зеленого цвета с числом цилиндров больше 6:
select make, cylnders, color from auto where color in ('BLACK','WHITE','GREEN') group by make, cylnders, color having max(cylnders) >6;
-
Если в
< HAVING-спецификации >
используется< SQL-параметр >
, то его тип данных должен быть указан обязательно.select distinct model, :year (int)+1900 from auto group by model, year+1900 having :year (int)+1900 >1970 limit 3; 71 |124 SPORT COUPE | 1971| |1275 GT | 1971| |1302 S | 1971|
-
В
< списке выборки >
можно указывать также целиком < значимое выражение >, по которому создается группировка, или другие столбцы, используемые как аргументы агрегатных функций.select make, year+1900 from auto group by make, year+1900 having max( year+1900) between 1969 and 1972;
-
Если запрос с
< HAVING-спецификацией >
не содержит опцииGROUP BY
, то столбцы в SELECT и в HAVING конструкциях могут использоваться только как аргументы агрегатных функций.Допустимый запрос:
select avg(salary) from tab_aggr having max(salary) > 20000;
Недопустимые запросы:
select salary from tab_aggr having max(salary) > 20000; select avg(salary) from tab_aggr having salary > 20000;
-
В
< HAVING-спецификации >
разрешено использовать группированные CAST- и CASE-выражения.select make, cast(year+1900 as double) from auto group by make, cast(year+1900 as double) having cast(year+1900 as double) >1970.05;