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

Apr 17, 2020

Probablemente es algo que no sabias 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.

Sponsors

Recibe contenido exclusivo por correo

[AC].dev

Made with ♥️ & 🧉 in Montevideo, Uruguay.

Code highlighting provided by Torchlight.

Este sitio web utiliza cookies para mejorar la experiencia del usuario. Al utilizar nuestro sitio web, acepta todas las cookies de acuerdo con nuestra Política de cookies.
Lee más.

RECHAZAR