lunes, 12 de noviembre de 2012

Where y having

Explicación de la diferencia entre WHERE y HAVING.

La cláusula WHERE filtra datos antes de agrupar, o sea líneas (registros).
La cláusula HAVING filtra los grupos una vez creados.

Se procederá a explicar la siguiente consulta SQL, en la que se mezclan ambas cláusulas:

 SELECT product_cd, SUM(avail_balance) prod_balance
 FROM account
 WHERE last_activity_date >= '2004-12-01'
 GROUP BY product_cd
 HAVING MIN(avail_balance) >= 1000
  AND MAX(avail_balance) <= 10000; 


Se mostrará una tabla con los campos product_cd, SUM(avail_balance) de la tabla account.

De los datos de la tabla, se descartarán los registros que no cumplan la condición WHERE, esto es, sólo se tendrán en cuenta los registros con last_activity_date mayor que el 1 de Diciembre de 2004.



En este caso de todos los registros de la tabla, se queda solo con los que cumplen el criterio de la condición WHERE (en la imagen superior resaltados en amarillo).

Con los registros seleccionados, se crean grupos usando para ello la columna product_cd GROUP BY product_cd.



Este paso genera cinco grupos, y sería el resultado de la consulta sin la subcláusula HAVING.


La subcláusula HAVING se aplica sobre estos grupos creados.

En concreto en este caso, se comprobará que en estos grupos, el mínimo de las cuentas sea mayor o igual de 1000 y el máximo sea menor o igual de 10000.


 HAVING MIN(avail_balance) >= 1000
  AND MAX(avail_balance) <= 10000; 


Observando la imagen anterior, se puede observar que los grupos CHK y SAV no cumpen la condición del mínimo mayor o igual que 1000; mientras que los grupos CHK y SBL no cumplen la condición del máximo menor o igual que 10000.

Por lo tanto la subcláusula HAVING eliminará los grupos CHK, SAV y SBL del conjunto de resultados (resultset).

Quedando solo los grupos que cumplen las condiciones, en este caso CD y MM;




En este caso ambos grupos cumplen las dos condiciones, teniendo casualmente solo una cuenta que cumpla el filtro de la fecha impuesto por la cláusula WHERE.

No hay comentarios:

Publicar un comentario