Pregunta

Debo buscar 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 instrucción SQL SELECT ?

EDITAR: Marqué la respuesta de Steven como la correcta ya que contenía la información clave en el enlace:

  

Cuando no se usa GROUP BY , HAVING se comporta como una cláusula WHERE

La situación en la que había visto el DONDE no tenía GROUP BY y es donde comenzó mi confusión. Por supuesto, hasta que sepa esto, no puede especificarlo en la pregunta.

Muchas gracias por todas las respuestas que fueron muy esclarecedoras.

¿Fue útil?

Solución

  

HAVING especifica una condición de búsqueda para un   grupo o una función agregada utilizada en la instrucción SELECT.

Fuente

Otros consejos

TENIENDO: se utiliza para verificar las condiciones después de la agregación tiene lugar.
DONDE: se utiliza para verificar las condiciones antes de que se realice la agregación.

Este código:

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 código:

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 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 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, nuevamente una oportunidad de mejora dentro de la industria.

Ahora considere por un momento eliminar WHERE del idioma. Esta vez, la mayoría de las consultas existentes debería reescribirse sin una construcción alternativa obvia. Los codificadores tendrían que ser creativos, p. 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 anterior WHERE . 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 estarían peor, posiblemente mejor, 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 tabla y requiere que solo aparezcan constantes en la cláusula SELECT . Normalmente, la cláusula HAVING implicará agregados.

Esto es más útil de lo que parece. Por ejemplo, considere esta consulta para probar si la columna 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 contiene el valor 1 , de lo contrario el resultado será el vacío conjunto.

La cláusula HAVING se agregó a SQL porque la palabra clave WHERE no se pudo usar con funciones agregadas.

Consulte este enlace de w3schools para obtener 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;

... puede reescribirse usando una tabla derivada (y omitiendo el HAVING ) así:

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 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.

  • HAVING viene después de GROUP BY; SQL evalúa HAVING después de agrupar registros.

 seleccionar diagrama de declaración

Referencias

HAVING se usa cuando usa un agregado como GROUP BY .

SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;

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.

La cláusula WHERE no funciona para funciones agregadas
significa: no deberías usar así bonus: nombre de la tabla

SELECT name  
FROM bonus  
GROUP BY name  
WHERE sum(salary) > 200  

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

SELECT name  
FROM bonus  
GROUP BY name  
HAVING sum(salary) > 200  

Diferencia b / w WHERE y HAVING cláusula:

La principal diferencia entre la cláusula WHERE y HAVING es que WHERE se usa para operaciones de fila y HAVING es utilizado para operaciones de columna.

¿Por qué necesitamos la cláusula HAVING ?

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, utilizamos funciones agregadas en la cláusula HAVING .

Cuando no se usa GROUP BY , las cláusulas WHERE y HAVING son esencialmente equivalentes.

Sin embargo, cuando se usa GROUP BY :

  • La cláusula WHERE se usa para filtrar registros de un resultado. los el filtrado se produce antes de que se realicen agrupaciones.
  • La cláusula HAVING se usa para filtrar valores de un grupo (es decir, para verifique las condiciones después de que se haya realizado la agregación en grupos).

Recurso de Aquí

Tuve un problema y descubrí otra diferencia entre WHERE y HAVING . No actúa de la misma manera en columnas indexadas.

DONDE 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 el " insertado " más antiguo fila al más nuevo, sin ordenar.

Una forma de pensar es que la cláusula have 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 agrupaciones. Se utiliza una cláusula HAVING para filtrar valores de un grupo

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.

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í !

Utilizo HAVING para restringir una consulta basada en los resultados de una función agregada. P.EJ. seleccione * en el grupo blahblahblah por ALGO que cuenta (ALGO) > 0

De aquí .

  

el estándar SQL requiere que TENGA   debe hacer referencia solo a columnas en el   Cláusula GROUP BY o columnas utilizadas en   funciones agregadas

en oposición a la cláusula WHERE que se aplica a las filas de la base de datos

Mientras trabajaba en un proyecto, esta también era 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.

  

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 sy sum (dailyincome) cuyo sum(dailyincome)>100

Si escribimos:

  

SELECCIONE userid, sum (dailyincome) FROM usertable WHERE   sum (dailyincome) > 100 GROUP BY userid

Esto será un error. La consulta correcta sería:

  

SELECCIONE userid, sum (dailyincome) FROM usertable GROUP BY userid HAVING   sum (ingreso diario) > 100

Puede ser solo que el tema de " donde " es una fila, mientras que el tema de "tener" es un grupo ¿Estoy en lo cierto?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top