Чтобы использовать HAVINGв запросах SQL, должен ли быть GROUP BYагрегировать имена столбцов?
Существуют ли особые случаи, когда можно использовать HAVINGбез GROUP BYSQL-запросов?
Должны ли они сосуществовать одновременно?
Чтобы использовать HAVINGв запросах SQL, должен ли быть GROUP BYагрегировать имена столбцов?
Существуют ли особые случаи, когда можно использовать HAVINGбез GROUP BYSQL-запросов?
Должны ли они сосуществовать одновременно?
Ответы:
Нет.
Они не должны сосуществовать, что подтверждается тем фактом, что следующий запрос в 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);