Чтобы использовать HAVING
в запросах SQL, должен ли быть GROUP BY
агрегировать имена столбцов?
Существуют ли особые случаи, когда можно использовать HAVING
без GROUP BY
SQL-запросов?
Должны ли они сосуществовать одновременно?
Чтобы использовать HAVING
в запросах SQL, должен ли быть GROUP BY
агрегировать имена столбцов?
Существуют ли особые случаи, когда можно использовать HAVING
без GROUP BY
SQL-запросов?
Должны ли они сосуществовать одновременно?
Ответы:
Нет.
Они не должны сосуществовать, что подтверждается тем фактом, что следующий запрос в Oracle работает:
select * from dual having 1 = 1;
Аналогично, в PostgreSQL работает следующий запрос:
select 1 having 1 = 1;
Так having
не требует group by
.
Наличие применяется после фазы агрегации и должно использоваться, если вы хотите фильтровать результаты агрегирования. Так что обратное неверно, и следующее не будет работать:
select a, count(*) as c
from mytable
group by a
where c > 1;
Вам нужно заменить where
с having
в этом случае выглядит следующим образом :
select a, count(*) as c
from mytable
group by a
having c > 1;
NB Следующая форма запроса также будет работать:
select *
from (
select a, count(*) as c
from mytable
group by a
)
where c > 1;
Вы можете видеть, что использование having
- это просто сокращенная версия этого последнего запроса.
Таким образом, having
применяются послеgroup by
того, как фазы , тогда как where
применяются перед тем в group by
фазе.
select 1 having count(*) = 1;
которую я еще не понял.
SELECT 1 AS id, 'Colin' AS name;
то время как другие, как Oracle, имеют специальную dual
таблицу. Я не думаю, что какой-либо из этих синтаксисов является ANSI / ISO SQL (который требует FROM
).
from
а ссылку count(*)
в having
предложении без указания того, по каким столбцам это агрегируется. Предположительно, он объединяет все столбцы в select
предложении.
Наличие используется для фильтрации групп.
предложение where используется для фильтрации строк.
having
будет применяться после того, как фаза агрегации , так может быть использована для фильтров групп.
При отсутствии предложения GROUP BY запрос рассматривает все отношение как одну группу.
например
select count(*)
from dual
having count(*) > 5;
SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);