Щоб використовувати 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;
Примітка. Наступна форма запиту також буде працювати:
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
пункту.
Використовується для фільтрації груп.
де пункт використовується для фільтрування рядків.
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);