Per poter utilizzare HAVING
nelle query SQL, è necessario un a GROUP BY
per aggregare i nomi delle colonne?
Ci sono casi speciali in cui è possibile utilizzare HAVING
senza GROUP BY
query in SQL?
Devono coesistere contemporaneamente?
Per poter utilizzare HAVING
nelle query SQL, è necessario un a GROUP BY
per aggregare i nomi delle colonne?
Ci sono casi speciali in cui è possibile utilizzare HAVING
senza GROUP BY
query in SQL?
Devono coesistere contemporaneamente?
Risposte:
No.
Non devono coesistere, come dimostrato dal fatto che la seguente query in Oracle funziona:
select * from dual having 1 = 1;
Allo stesso modo, in PostgreSQL funziona la seguente query:
select 1 having 1 = 1;
Quindi having
non richiede group by
.
L'avere viene applicato dopo la fase di aggregazione e deve essere utilizzato se si desidera filtrare i risultati aggregati. Quindi il contrario non è vero e quanto segue non funzionerà:
select a, count(*) as c
from mytable
group by a
where c > 1;
In questo caso è necessario sostituire where
con having
, come segue:
select a, count(*) as c
from mytable
group by a
having c > 1;
NB Il seguente modulo di query funzionerà anche:
select *
from (
select a, count(*) as c
from mytable
group by a
)
where c > 1;
Si può vedere che l'utilizzo having
è semplicemente una versione abbreviata di quest'ultima query.
In sintesi, having
viene applicato dopo la group by
fase mentre where
viene applicato prima della group by
fase.
select 1 having count(*) = 1;
che devo ancora comprendere.
SELECT 1 AS id, 'Colin' AS name;
mentre altri come Oracle hanno una dual
tabella speciale . Non penso che nessuna di queste sintassi sia ANSI / ISO SQL (che richiede FROM
).
from
ma il riferimento a count(*)
nella having
clausola senza alcuna indicazione su quali colonne questo viene aggregato. Presumibilmente si aggrega su tutte le colonne della select
clausola.
Avere viene utilizzato per filtrare i gruppi.
dove la clausola viene utilizzata per filtrare le righe.
having
viene applicato dopo la fase di aggregazione, quindi può essere utilizzato per filtrare i gruppi.
In assenza della clausola GROUP BY, la query considera l'intera relazione come un gruppo.
per esempio
select count(*)
from dual
having count(*) > 5;
SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);