Cúal es la diferencia entre where y having en mysql?
Este artículo tiene más de un año de antigüedad, el contenido pudiera estar obsoleto.
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 rows2SELECT `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 910EXPLAIN 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 index
pero las rows son diferentes.