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