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?

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.


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ᵀᴹ


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.


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;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.