Uso de HAVING sin GROUP BY en consultas SQL

26

Para usar HAVINGen consultas SQL, ¿debe haber un GROUP BYpara agregar los nombres de columna?

¿Hay algún caso especial en el que sea posible usarlo HAVINGsin una GROUP BYconsulta SQL?

¿Deben coexistir al mismo tiempo?

Computernerd
fuente

Respuestas:

25

No.

No tienen que coexistir, como lo demuestra el hecho de que la siguiente consulta en Oracle funciona:

select * from dual having 1 = 1;

Del mismo modo, en PostgreSQL funciona la siguiente consulta:

select 1 having 1 = 1;

Entonces having no requiere group by .

Tener se aplica después de la fase de agregación y debe usarse si desea filtrar los resultados agregados. Entonces, lo contrario no es cierto, y lo siguiente no funcionará:

select a, count(*) as c
from mytable
group by a
where c > 1;

Debe reemplazar wherecon havingen este caso, de la siguiente manera:

select a, count(*) as c
from mytable
group by a
having c > 1;

Nota: el siguiente formulario de consulta también funcionará:

select *
from (
  select a, count(*) as c
  from mytable
  group by a
)
where c > 1;

Puede ver que usar havinges simplemente una versión abreviada de esta última consulta.


En resumen, havingse aplica después de la group byfase, mientras que wherese aplica antes de la group byfase.

Colin 't Hart
fuente
2
Otro ejemplo:SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);
ypercubeᵀᴹ
1
Sí. Y PostgreSQL permite la siguiente construcción select 1 having count(*) = 1;que aún tengo que comprender.
Colin 't Hart
SQL Server también lo permite, SELECT 1 AS id, 'Colin' AS name;mientras que otros como Oracle tienen una dualtabla especial . No creo que ninguna de estas sintaxis sea ANSI / ISO SQL (que requiere FROM).
ypercubeᵀᴹ
No quise decir la falta fromsino la referencia a count(*)la havingcláusula sin ninguna indicación sobre sobre qué columnas se está agregando esto. Presumiblemente se agrega sobre todas las columnas de la selectcláusula.
Colin 't Hart
Ah ok Sí, estoy de acuerdo en que eso es lo que hace (agregado sobre todas las filas que quiere decir, sobre todas las filas de una tabla vacía).
ypercubeᵀᴹ
4

Tener se utiliza para filtrar grupos.

donde cláusula se utiliza para filtrar filas.

ingeniero
fuente
1
Su primera declaración no es correcta. havingse aplica después de la fase de agregación, por lo que puede usarse para filtrar grupos.
Colin 't Hart
1

TENER es filtrar los grupos. Si no tiene causa GROUP BY, todas las filas presentan un grupo. Entonces, si el predicado en HAVING se evalúa como verdadero, obtienes una fila, de lo contrario no hay filas.

msi77
fuente
1

En ausencia de la cláusula GROUP BY, la consulta considera toda la relación como un grupo.

p.ej

     select count(*)
     from dual
     having count(*) > 5;
Vikrant Singh
fuente