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?
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.
SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);select 1 having count(*) = 1;que aún tengo que comprender.SELECT 1 AS id, 'Colin' AS name;mientras que otros como Oracle tienen unadualtabla especial . No creo que ninguna de estas sintaxis sea ANSI / ISO SQL (que requiereFROM).fromsino la referencia acount(*)lahavingcláusula sin ninguna indicación sobre sobre qué columnas se está agregando esto. Presumiblemente se agrega sobre todas las columnas de laselectcláusula.Tener se utiliza para filtrar grupos.
donde cláusula se utiliza para filtrar filas.
fuente
havingse aplica después de la fase de agregación, por lo que puede usarse para filtrar grupos.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.
fuente
En ausencia de la cláusula GROUP BY, la consulta considera toda la relación como un grupo.
p.ej
fuente