Para usar HAVING
en consultas SQL, ¿debe haber un GROUP BY
para agregar los nombres de columna?
¿Hay algún caso especial en el que sea posible usarlo HAVING
sin una GROUP BY
consulta 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 where
con having
en 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 having
es simplemente una versión abreviada de esta última consulta.
En resumen, having
se aplica después de la group by
fase, mientras que where
se aplica antes de la group by
fase.
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 unadual
tabla especial . No creo que ninguna de estas sintaxis sea ANSI / ISO SQL (que requiereFROM
).from
sino la referencia acount(*)
lahaving
cláusula sin ninguna indicación sobre sobre qué columnas se está agregando esto. Presumiblemente se agrega sobre todas las columnas de laselect
cláusula.Tener se utiliza para filtrar grupos.
donde cláusula se utiliza para filtrar filas.
fuente
having
se 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