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
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.
Descubre cómo aplicar diseño atómico en Laravel con Blade para crear interfaces escalables, limpias y reutilizables. ¡Guía paso a paso!
¡Descubre cómo Studio de WordPress revoluciona el desarrollo web! Descarga gratis y crea tus proyectos con facilidad. El futuro es ahora. ¡Haz clic para más información!

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.