Per poter utilizzare HAVINGnelle query SQL, è necessario un a GROUP BYper aggregare i nomi delle colonne?
Ci sono casi speciali in cui è possibile utilizzare HAVINGsenza GROUP BYquery in SQL?
Devono coesistere contemporaneamente?
Per poter utilizzare HAVINGnelle query SQL, è necessario un a GROUP BYper aggregare i nomi delle colonne?
Ci sono casi speciali in cui è possibile utilizzare HAVINGsenza GROUP BYquery 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 wherecon 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, havingviene applicato dopo la group byfase mentre whereviene applicato prima della group byfase.
select 1 having count(*) = 1;che devo ancora comprendere.
SELECT 1 AS id, 'Colin' AS name;mentre altri come Oracle hanno una dualtabella speciale . Non penso che nessuna di queste sintassi sia ANSI / ISO SQL (che richiede FROM).
fromma il riferimento a count(*)nella havingclausola senza alcuna indicazione su quali colonne questo viene aggregato. Presumibilmente si aggrega su tutte le colonne della selectclausola.
Avere viene utilizzato per filtrare i gruppi.
dove la clausola viene utilizzata per filtrare le righe.
havingviene 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);