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;