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?
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?
Respuestas:
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 1 having count(*) = 1;
que aún tengo que comprender.
SELECT 1 AS id, 'Colin' AS name;
mientras que otros como Oracle tienen una dual
tabla especial . No creo que ninguna de estas sintaxis sea ANSI / ISO SQL (que requiere FROM
).
from
sino la referencia a count(*)
la having
cláusula sin ninguna indicación sobre sobre qué columnas se está agregando esto. Presumiblemente se agrega sobre todas las columnas de la select
cláusula.
Tener se utiliza para filtrar grupos.
donde cláusula se utiliza para filtrar filas.
having
se aplica después de la fase de agregación, por lo que puede usarse para filtrar grupos.
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;
SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);