WHERE FRENTE A HAVING EN MYSQL: EL FILTRO QUE CAMBIA EL RESULTADO SIN TOCAR LOS DATOS

En las consultas con agrupaciones, el momento en el que se aplica un filtro determina por completo el resultado final. WHERE y HAVING cumplen la misma función aparente, descartar información, pero actúan en fases distintas del proceso de ejecución.

Diferencia esencial entre WHERE y HAVING

  • WHERE interviene sobre las filas individuales antes de que se produzca el agrupamiento. Solo permite el paso a aquellos registros que cumplen la condición establecida, por ejemplo, importes superiores a 100 euros.
  • HAVING opera después del agrupamiento. Evalúa el resultado de cada grupo, como la suma total por cliente, y decide si ese conjunto permanece o se descarta.
La misma base de datos y la misma lógica de negocio pueden generar resultados diferentes únicamente por el punto en el que se coloca el filtro.

Ejemplo práctico

La siguiente consulta ilustra el comportamiento:

SELECT user_id, SUM(amount) AS total
FROM orders
WHERE amount > 100
GROUP BY user_id
HAVING SUM(amount) > 500;
El proceso se desarrolla en tres etapas:
  1. WHERE filtra las filas: Se eliminan todos los pedidos cuyo importe sea igual o inferior a 100 euros. Solo continúan los que superan ese umbral.
  2. GROUP BY agrupa los datos: Se calculan las sumas de los importes restantes por cada usuario. El resultado intermedio contiene una fila por cliente con su total correspondiente.
  3. HAVING filtra los grupos: Únicamente se conservan aquellos usuarios cuya suma total supera los 500 euros.
El resultado final es más restrictivo: no basta con haber realizado pedidos de cuantía elevada; el conjunto de esos pedidos debe superar el límite fijado.

Principio clave

  • WHERE filtra filas individuales (antes del agrupamiento).
  • GROUP BY agrupa las filas.
  • HAVING filtra los grupos ya formados (después del agrupamiento).

Error frecuente

Es habitual encontrar intentos de escribir condiciones como::

WHERE SUM(amount) > 500
Esta construcción no es válida. Las funciones de agregado, como "SUM", "COUNT", "AVG", requieren datos previamente agrupados. Por ello MySQL exige el uso de HAVING cuando se desea filtrar en función del resultado de una operación de agregación.

Relevancia práctica

En informes de negocio, análisis de ventas o estudios de comportamiento de clientes, la colocación correcta del filtro puede marcar la diferencia entre un resultado preciso y uno engañoso. Un WHERE aplicado en el momento inadecuado puede excluir registros que debían computarse; un HAVING mal utilizado puede incluir grupos que no cumplen el criterio real.
La distinción entre ambos comandos no es meramente sintáctica: determina qué información llega realmente al resultado final.