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.
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;
- 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.
- 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.
- HAVING filtra los grupos: Únicamente se conservan aquellos usuarios cuya suma total supera los 500 euros.
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
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.