sql - diferencias - diferencia entre having y where
¿Cuál es la diferencia entre tener y dónde? (18)
HAVING especifica una condición de búsqueda para un grupo o una función agregada utilizada en la instrucción SELECT.
Debo estar buscando en Google de forma incorrecta o estoy teniendo un momento estúpido en el tiempo.
¿Cuál es la diferencia entre HAVING
y WHERE
en una SQL SELECT
?
EDITAR: He marcado la respuesta de Steven como la correcta, ya que contenía el bit de información clave en el enlace:
Cuando
GROUP BY
no se utiliza,HAVING
comporta como una cláusulaWHERE
La situación en la que había visto WHERE
no tenía GROUP BY
y es donde comenzó mi confusión. Por supuesto, hasta que sepas esto, no puedes especificarlo en la pregunta.
Muchas gracias por todas las respuestas que fueron muy esclarecedoras.
Cuando GROUP BY
no se utiliza, las cláusulas WHERE
y HAVING
son esencialmente equivalentes.
Sin embargo, cuando se usa GROUP BY
:
- La cláusula
WHERE
se utiliza para filtrar registros de un resultado. El filtrado se produce antes de realizar cualquier agrupación. - La cláusula
HAVING
se usa para filtrar valores de un grupo (es decir, para verificar las condiciones después de que se haya realizado la agregación en grupos).
Recurso de Here
DONDE se aplica como una limitación en el conjunto devuelto por SQL; utiliza los conjuntos de parámetros e índices integrados de SQL y, por lo tanto, es la forma más rápida de filtrar conjuntos de resultados. Siempre use DONDE siempre que sea posible.
Tener es necesario para algunos filtros agregados. Filtra la consulta DESPUÉS de que sql haya recuperado, ensamblado y ordenado los resultados. Por lo tanto, es mucho más lento que DONDE y debe evitarse, excepto en aquellas situaciones que lo requieran.
SQL Server le permitirá utilizar HAVING incluso cuando DONDE sea mucho más rápido. No lo hagas
Desde here
el estándar SQL requiere que HAVING debe hacer referencia solo a las columnas de la cláusula GROUP BY o a las columnas utilizadas en las funciones agregadas
A diferencia de la cláusula WHERE que se aplica a las filas de la base de datos
Diferencia número uno para mí: si HAVING
se eliminó del lenguaje SQL, la vida continuaría más o menos como antes. Ciertamente, las consultas minoritarias tendrían que volver a escribirse utilizando una tabla derivada, CTE, etc., pero como resultado podrían ser más fáciles de entender y mantener. Tal vez el código del optimizador de los proveedores tendría que ser reescrito para dar cuenta de esto, una vez más, una oportunidad para mejorar dentro de la industria.
Ahora considere por un momento eliminar WHERE
del idioma. Esta vez, la mayoría de las consultas en existencia necesitarían ser reescritas sin una construcción alternativa obvia. Los codificadores tendrían que ser creativos, por ejemplo, una unión interna a una tabla que se sabe que contiene exactamente una fila (por ejemplo, DUAL
en Oracle) utilizando la cláusula ON
para simular la cláusula WHERE
anterior. Tales construcciones serían ideadas; sería obvio que faltaba algo en el idioma y, como resultado, la situación sería peor.
TL; DR podríamos perder HAVING
mañana y las cosas no serían peores, posiblemente mejores, pero no se puede decir lo mismo de WHERE
.
De las respuestas aquí, parece que muchas personas no se dan cuenta de que una cláusula HAVING
puede usarse sin una cláusula GROUP BY
. En este caso, la cláusula HAVING
se aplica a toda la expresión de la tabla y requiere que solo aparezcan constantes en la cláusula SELECT
. Normalmente, la cláusula HAVING
incluirá agregados.
Esto es más útil de lo que parece. Por ejemplo, considere esta consulta para probar si la columna de name
es única para todos los valores en T
:
SELECT 1 AS result
FROM T
HAVING COUNT( DISTINCT name ) = COUNT( name );
Solo hay dos resultados posibles: si la cláusula HAVING
es verdadera, entonces el resultado será una sola fila que contenga el valor 1
, de lo contrario, el resultado será el conjunto vacío.
En una consulta agregada, (cualquier consulta donde se usa una función agregada) los predicados en una cláusula where se evalúan antes de que se genere el conjunto de resultados intermedios agregados,
Los predicados en una cláusula Having se aplican al conjunto de resultados agregado DESPUÉS de que se haya generado. Es por eso que las condiciones de predicado en los valores agregados se deben colocar en la cláusula Having, no en la cláusula Where, y por qué puede usar los alias definidos en la cláusula Select en una cláusula Having, pero no en una cláusula Where.
HAVING: se utiliza para verificar las condiciones después de que se realice la agregación.
DÓNDE: se utiliza para verificar las condiciones antes de que tenga lugar la agregación.
Este codigo
select City, CNT=Count(1)
From Address
Where State = ''MA''
Group By City
Le da una tabla de todas las ciudades en MA y el número de direcciones en cada ciudad.
Este codigo
select City, CNT=Count(1)
From Address
Where State = ''MA''
Group By City
Having Count(1)>5
Le da una tabla de ciudades en MA con más de 5 direcciones y el número de direcciones en cada ciudad.
La cláusula HAVING se agregó a SQL porque la palabra clave WHERE no se pudo usar con funciones agregadas.
Echa un vistazo a este enlace w3schools para más información
Sintaxis:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
Una consulta como esta:
SELECT column_name, COUNT( column_name ) AS column_name_tally
FROM table_name
WHERE column_name < 3
GROUP
BY column_name
HAVING COUNT( column_name ) >= 3;
... se puede reescribir usando una tabla derivada (y omitiendo el HAVING
) como esto:
SELECT column_name, column_name_tally
FROM (
SELECT column_name, COUNT(column_name) AS column_name_tally
FROM table_name
WHERE column_name < 3
GROUP
BY column_name
) pointless_range_variable_required_here
WHERE column_name_tally >= 3;
La cláusula WHERE no funciona para funciones agregadas
significa: no debes usar como este bono: nombre de la tabla
SELECT name
FROM bonus
GROUP BY name
WHERE sum(salary) > 200
AQUÍ En lugar de usar la cláusula WHERE tienes que usar HAVING ...
sin usar la cláusula GROUP BY, la cláusula HAVING simplemente funciona como la cláusula WHERE
SELECT name
FROM bonus
GROUP BY name
HAVING sum(salary) > 200
La cláusula WHERE se usa para comparar valores en la tabla base, mientras que la cláusula HAVING se puede usar para filtrar los resultados de las funciones agregadas en el conjunto de resultados de la consulta ¡Haga clic here !
La diferencia entre los dos está en la relación con la cláusula GROUP BY:
DONDE viene antes GRUPO POR; SQL evalúa la cláusula WHERE antes de agrupar los registros.
Habiendo viene después de GROUP BY; SQL evalúa HAVING después de que agrupa los registros.
Referencias
Mientras trabajaba en un proyecto, esta fue también mi pregunta. Como se indicó anteriormente, HAVING verifica la condición en el resultado de la consulta ya encontrado. Pero WHERE es para verificar la condición mientras se ejecuta la consulta.
Déjame dar un ejemplo para ilustrar esto. Supongamos que tiene una tabla de base de datos como esta.
usertable {int userid, date datefield, int dailyincome}
Supongamos que las siguientes filas están en la tabla:
1, 2011-05-20, 100
1, 2011-05-21, 50
1, 2011-05-30, 10
2, 2011-05-30, 10
2, 2011-05-20, 20
Ahora, queremos obtener el userid
y la sum(dailyincome)
cuya sum(dailyincome)>100
Si escribimos:
SELECCIONE el ID de usuario, suma (ingreso diario) DESDE la tabla de usuario DÓNDE la suma (ingreso diario)> 100 GRUPO POR usuario
Esto será un error. La consulta correcta sería:
SELECCIONE ID de usuario, suma (ingreso diario) DESDE la tabla de usuario GRUPO POR ID DE usuario QUE TIENE suma (ingreso diario)> 100
Puede ser que el tema de "dónde" sea una fila, mientras que el tema de "tener" es un grupo. Estoy en lo cierto
Tuve un problema y descubrí otra diferencia entre WHERE
y HAVING
. No actúa de la misma manera en columnas indexadas.
WHERE my_indexed_row = 123
mostrará filas y realizará automáticamente un "ORDEN ASC" en otras filas indexadas.
HAVING my_indexed_row = 123
muestra todo, desde la fila "insertada" más antigua hasta la más reciente, sin ordenamiento.
Una forma de pensarlo es que la cláusula having es un filtro adicional a la cláusula where.
Una cláusula WHERE se utiliza para filtrar registros de un resultado. El filtro se produce antes de realizar cualquier agrupación. Una cláusula HAVING se usa para filtrar valores de un grupo
Utilizo HAVING para restringir una consulta basada en los resultados de una función agregada. Por ejemplo, seleccione * en blahblahblah group por ALGO que tiene cuenta (ALGO)> 0
HAVING
se utiliza cuando está utilizando un agregado como GROUP BY
.
SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;
Diferencia b / w cláusula WHERE
y HAVING
:
La principal diferencia entre la cláusula WHERE
y HAVING
es, WHERE
se utiliza para operaciones de fila y HAVING
se utiliza para operaciones de columna.
¿Por qué necesitamos tener cláusula?
Como sabemos, las funciones agregadas solo se pueden realizar en columnas, por lo que no podemos usar funciones agregadas en la cláusula WHERE
. Por lo tanto, usamos funciones agregadas en la cláusula HAVING
.