Debo buscar en Google de manera incorrecta o estoy teniendo un momento estúpido en el tiempo.
¿Cuál es la diferencia entre HAVING
y WHERE
en una SQL SELECT
declaración?
EDITAR: He marcado la respuesta de Steven como la correcta ya que contenía la información clave en el enlace:
Cuando
GROUP BY
no se usa, seHAVING
comporta como unaWHERE
cláusula
La situación que había visto WHERE
en el no tenía GROUP BY
y es donde comenzó mi confusión. Por supuesto, hasta que sepa esto, no puede especificarlo en la pregunta.
HAVING
es un filtro de agregación posterior, mientras queWHERE
es un filtro de agregación previa.Respuestas:
Fuente
fuente
TENIENDO: se utiliza para verificar las condiciones después de la agregación.
DONDE: se utiliza para verificar las condiciones antes de que se realice la agregación.
Este código:
Le da una tabla de todas las ciudades en MA y el número de direcciones en cada ciudad.
Este código:
Le da una tabla de ciudades en MA con más de 5 direcciones y el número de direcciones en cada ciudad.
fuente
La 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 de una minoría tendrían que reescribirse usando 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 deba reescribirse para tener esto en cuenta, una vez más, una oportunidad de mejora dentro de la industria.Ahora considere por un momento eliminar
WHERE
del lenguaje. Esta vez, la mayoría de las consultas existentes deberían reescribirse sin una construcción alternativa obvia. Los codificadores tendrían que ser creativos, por ejemplo, la unión interna a una tabla que se sabe que contiene exactamente una fila (por ejemplo,DUAL
en Oracle) usando laON
cláusula para simular laWHERE
cláusula anterior . Tales construcciones serían inventadas; sería obvio que faltaba algo en el lenguaje y la situación sería peor como resultado.TL; DR podríamos perder
HAVING
mañana y las cosas no serían peores, posiblemente mejores, pero no se puede decir lo mismoWHERE
.De las respuestas aquí, parece que muchas personas no se dan cuenta de que una
HAVING
cláusula puede usarse sin unaGROUP BY
cláusula. En este caso, laHAVING
cláusula se aplica a toda la expresión de la tabla y requiere que solo aparezcan constantes en laSELECT
cláusula. Típicamente laHAVING
cláusula involucrará agregados.Esto es más útil de lo que parece. Por ejemplo, considere esta consulta para probar si la
name
columna es única para todos los valores enT
:Solo hay dos resultados posibles: si la
HAVING
cláusula es verdadera, el resultado será una sola fila que contenga el valor1
; de lo contrario, el resultado será el conjunto vacío.fuente
La cláusula HAVING se agregó a SQL porque la palabra clave WHERE no se pudo usar con funciones agregadas.
Mira este enlace de w3schools para más información
Sintaxis:
Una consulta como esta:
... puede reescribirse usando una tabla derivada (y omitiendo
HAVING
) como esta:fuente
HAVING
se agregó porque las tablas derivadas no se habían agregado al lenguaje y hasta que se SQL no estaba relacionalmente completo y una vez que inevitablemente seHAVING
volvieron redundantes.La diferencia entre los dos está en la relación con la cláusula GROUP BY:
DONDE viene antes de GROUP BY; SQL evalúa la cláusula WHERE antes de agrupar registros.
HABER viene después de GROUP BY; SQL evalúa HAVING después de que agrupa los registros.
Referencias
SQLite SELECT Sentencia Sintaxis / Diagrama de ferrocarril
Sintaxis de la declaración de Informix SELECT / Diagrama del ferrocarril
fuente
SELECT 1 AS result FROM T HAVING...
- en su diagrama no puedo accederHAVING
sin pasar,GROUP BY
pero mi consulta perfectamente válida y útil no tieneGROUP BY
. Punto menor: no tiene la opción de incluir valores literales en laSELECT
cláusula.WHERE->HAVING
parte, por lo que creo que merece mucha atención al detalle. Si cree que mi respuesta es incorrecta, edítela o publique una corrección sugerida en los comentarios.HAVING
se usa cuando usa un agregado comoGROUP BY
.fuente
WHERE se aplica como una limitación en el conjunto devuelto por SQL; utiliza las operaciones e índices de conjuntos integrados de SQL y, por lo tanto, es la forma más rápida de filtrar conjuntos de resultados. Siempre use DONDE cuando 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á usar HAVING incluso cuando WHERE sería mucho más rápido. No lo hagas
fuente
La cláusula WHERE no funciona para funciones agregadas
significa: no debe usar como esta bonificación: nombre de la tabla
AQUÍ En lugar de usar la cláusula WHERE, debe usar HAVING ..
sin usar la cláusula GROUP BY, la cláusula HAVING simplemente funciona como la cláusula WHERE
fuente
Diferencia b / w
WHERE
yHAVING
cláusula:La principal diferencia entre
WHERE
yHAVING
cláusula es,WHERE
se usa para operaciones de fila yHAVING
se usa para operaciones de columna.¿Por qué necesitamos una
HAVING
cláusula?Como sabemos, las funciones agregadas solo se pueden realizar en columnas, por lo que no podemos usar funciones agregadas en la
WHERE
cláusula. Por lo tanto, utilizamos funciones agregadas en laHAVING
cláusula.fuente
Cuando
GROUP BY
no se usa, las cláusulasWHERE
yHAVING
son esencialmente equivalentes.Sin embargo, cuando
GROUP BY
se usa:WHERE
cláusula se usa para filtrar registros de un resultado. El filtrado se produce antes de realizar cualquier agrupación.HAVING
cláusula se utiliza 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 desde aquí
fuente
Una forma de pensarlo es que la cláusula have es un filtro adicional a la cláusula where.
Se utiliza una cláusula WHERE para filtrar registros de un resultado. El filtro se produce antes de realizar agrupaciones. Una cláusula HAVING se usa para filtrar valores de un grupo
fuente
En una consulta agregada, (Cualquier consulta donde se utiliza una función agregada) Predica en una cláusula where antes de que se genere el conjunto de resultados intermedios agregados,
Los predicados en una cláusula Have 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 deben colocarse en la cláusula Have, no en la cláusula Where, y por qué puede usar alias definidos en la cláusula Select en una cláusula Have, pero no en una cláusula Where.
fuente
Tuve un problema y descubrí otra diferencia entre
WHERE
yHAVING
. No actúa de la misma manera en columnas indexadas.WHERE my_indexed_row = 123
mostrará filas y realizará automáticamente un "ORDER ASC" en otras filas indexadas.HAVING my_indexed_row = 123
muestra todo, desde la fila "insertada" más antigua hasta la más nueva, sin ordenar.fuente
A partir de aquí .
a diferencia de la cláusula WHERE que se aplica a las filas de la base de datos
fuente
HAVING
décadas después de que las tablas derivadas lo "desaprobaran".SELECT 1 FROM T HAVING COUNT(*) >= 1;
: no hace referencia a columnas en laGROUP BY
cláusula (no hay ninguna) ni a columnas en funciones agregadas (la consulta no hace referencia a ninguna columna).Mientras trabajaba en un proyecto, esta también fue 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.
Permítanme dar un ejemplo para ilustrar esto. Supongamos que tiene una tabla de base de datos como esta.
Supongamos que las siguientes filas están en la tabla:
Ahora, queremos obtener el
userid
sysum(dailyincome)
cuyosum(dailyincome)>100
Si escribimos:
Esto sera un error. La consulta correcta sería:
fuente
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 funciones agregadas en el conjunto de resultados de la consulta ¡Haga clic aquí !
fuente
Cuando GROUP BY no se usa, las cláusulas WHERE y HAVING son esencialmente equivalentes.
Sin embargo, cuando se usa GROUP BY:
fuente
Utilizo HAVING para restringir una consulta basada en los resultados de una función agregada. Por ejemplo, seleccione * en el grupo blahblahblah por ALGO que tenga un conteo (ALGO)> 0
fuente
Puede ser solo que el tema de "donde" es una fila, mientras que el tema de "tener" es un grupo. Estoy en lo cierto?
fuente