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 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
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.
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.