Cúal es la diferencia entre where y having en mysql?

Angel Cruz
Angel Cruz

17 DE April DE 2020

Probablemente es algo que no sabías y te puede servir así como a mi.

Vayamos directo al grano:

Digamos que tenemos esta tabla:

1CREATE TABLE `table` (
2 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
3 `value` int(10) unsigned NOT NULL,
4 PRIMARY KEY (`id`),
5 KEY `value` (`value`)
6) ENGINE=InnoDB DEFAULT CHARSET=utf8

Donde tenemos 10 rows, ambos con id y value que van de 1 a 10:

1INSERT INTO `table`(`id`, `value`) VALUES (1, 1),(2, 2),(3, 3),(4, 4),(5, 5),(6, 6),(7, 7),(8, 8),(9, 9),(10, 10);

Si hacemos las siguientes querys:

1SELECT `value` v FROM `table` WHERE `value`>5; -- Get 5 rows
2SELECT `value` v FROM `table` HAVING `value`>5; -- Get 5 rows

Se obtienen exactamente los mismos resultados y como pueden ver, la clausula having puede trabajar sin la clausula GROUP BY

Acá la diferencia

Si hacemos esto:

1SELECT `value` v FROM `table` WHERE `v`>5;

Vamos a obtener:

1Error #1054 - Unknown column 'v' in 'where clause'

En cambio:

1SELECT `value` v FROM `table` HAVING `v`>5; -- Get 5 rows

La clausula WHERE permite una condición para usar cualquier columna de una tabla pero no permite usar alias o funciones agregadas. La clausula HAVING permite hacer condiciones para usar una columna, alias o una funcion agregada.

Esto se debe a que la clausula WHERE filtra la data antes de ejecutar el select pero HAVING filtra los resultados despues de hacer el select

Usemos EXPLAIN para entender las diferencias:

1
2EXPLAIN SELECT `value` v FROM `table` WHERE `value`>5;
3+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
4| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
5+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
6| 1 | SIMPLE | table | range | value | value | 4 | NULL | 5 | Using where; Using index |
7+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
8
9
10EXPLAIN SELECT `value` v FROM `table` having `value`>5;
11+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
12| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
13+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
14| 1 | SIMPLE | table | index | NULL | value | 4 | NULL | 10 | Using index |
15+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+

Cualquiera de los dos (WHERE o HAVING) usan indexpero las rows son diferentes.

Fuente.

Te podrá interesar
Descubre qué es MCP (Model Context Protocol), cómo funciona y por qué se ha convertido en una herramienta esencial para construir agentes inteligentes conectados, seguros y escalables.
¿Vale la pena testear modelos en Laravel? Descubre cuándo es útil, mejores prácticas y errores comunes al hacerlo.
Laravel Nightwatch es la nueva herramienta oficial de monitoreo de Laravel. Descubre cómo se compara frente a Sentry en esta guía completa y optimizada para SEO.

Made with ♥️ & 🧉 in Montevideo, Uruguay.

[AC].dev is not affiliated with Laravel or Laravel LLC. Laravel is a Trademark of Taylor Otwell.

Code highlighting provided by Torchlight.

We use cookies!

Hi, this website uses essential cookies to ensure its proper operation and tracking cookies to understand how you interact with it.