sintaxis entre diferencias diferencia sql where having

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.

Source

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áusula WHERE

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 !



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 .