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;