HAVING-спецификация

Функция

Задает ограничение для сгруппированной таблицы, полученной путем применения предшествующей < FROM-спецификации >, < WHERE-спецификации > или < GROUP BY-спецификации >, которое состоит в том, что исключаются группы, не удовлетворяющие < логическому выражению >.

Спецификация

   
< HAVING-спецификация >::=

Синтаксические правила

  1. Каждый элемент < логического выражения > (< спецификация столбца >, < значимое выражение > или < SQL-параметр >) должен однозначно указывать на группируемый столбец из результата предшествующих < FROM-спецификации >, < WHERE-спецификации > или < GROUP BY-спецификации >.

  2. Каждая < спецификация столбца >, содержащаяся в < подзапросе > < логического выражения > и указывающая на внешний столбец, должна быть группирующим столбцом предшествующих < 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));
  3. Запрещено обращение из подзапроса в < HAVING-спецификации > к негруппируемым столбцам.

  4. Числовые значения < значимого выражения >, заданного в < логическом выражении >, допускается представлять в строковом виде.

    select name, count(*) from person
     group by name having max(salary)  > '50000';

Общие правила

  1. Если предшествующая спецификация не содержит < GROUP BY-спецификацию >, то результатом < HAVING-спецификации > является единственная группа, а группируемый столбец отсутствует.

  2. < Логическое выражение > применяется к каждой группе из результата предшествующих спецификаций. Результатом < HAVING-спецификации > будет сгруппированная таблица, в которую войдут те группы, для которых результатом < логического выражения > будет значение «истина».

  3. Когда < логическое выражение > наложено на группу, то эта группа является аргументом любой агрегатной функции, непосредственно содержащейся в < логическом выражении >, если только < спецификация столбца > в агрегатной функции не является внешней ссылкой.

  4. Все < подзапросы > в < логическом выражении > выполняются для каждой группы, а полученные результаты применяются к каждой группе, удовлетворяющей < логическому выражению >. Если < подзапрос > содержит внешнюю ссылку на столбец, то она является ссылкой на значение этого столбца в данной группе.

    select make from auto
     group by make
    having max(year+1900)< (select to_number(to_char(sysdate, 'yyyy')));
  5. В < HAVING-спецификации > можно указывать только те столбцы и значимые выражения, по которым делается группировка.

    Получить список производителей машин черного, белого и зеленого цвета с числом цилиндров больше 6:

    select make, cylnders, color from auto
     where color in ('BLACK','WHITE','GREEN')
     group by make, cylnders, color
    having max(cylnders) >6;
  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|

  7. В < списке выборки > можно указывать также целиком < значимое выражение >, по которому создается группировка, или другие столбцы, используемые как аргументы агрегатных функций.

    select make, year+1900 from auto
     group by make, year+1900
    having max( year+1900) between 1969 and 1972;
  8. Если запрос с < 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;
  9. В < 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;