Чтобы использовать 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 MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);
select 1 having count(*) = 1;
которую я еще не понял.SELECT 1 AS id, 'Colin' AS name;
то время как другие, как Oracle, имеют специальнуюdual
таблицу. Я не думаю, что какой-либо из этих синтаксисов является ANSI / ISO SQL (который требуетFROM
).from
а ссылкуcount(*)
вhaving
предложении без указания того, по каким столбцам это агрегируется. Предположительно, он объединяет все столбцы вselect
предложении.Наличие используется для фильтрации групп.
предложение where используется для фильтрации строк.
источник
having
будет применяться после того, как фаза агрегации , так может быть использована для фильтров групп.HAVING фильтрует группы. Если у вас нет причины GROUP BY, все строки представляют одну группу. Таким образом, если предикат в HAVING оценивается как true, вы получите одну строку, иначе строк нет.
источник
При отсутствии предложения GROUP BY запрос рассматривает все отношение как одну группу.
например
источник