todas las respuestas a no golpear el punto clave.
Asumamos que tenemos una tabla:
CREATE TABLE `table` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`value` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `value` (`value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
y tiene 10 filas con ambos ID y el valor de 1 a 10:
INSERT 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);
Pruebe las siguientes 2 preguntas:
SELECT `value` v FROM `table` WHERE `value`>5; -- Get 5 rows
SELECT `value` v FROM `table` HAVING `value`>5; -- Get 5 rows
Obtendrá exactamente los mismos resultados, puede ver que la cláusula HAVING puede funcionar sin la cláusula GROUP BY.
Aquí está la diferencia:
SELECT `value` v FROM `table` WHERE `v`>5;
Error # 1054 - Desconocido columna 'v' en 'cláusula where'
SELECT `value` v FROM `table` HAVING `v`>5; -- Get 5 rows
cláusula WHERE requiere una condición para ser una columna de una tabla, pero La cláusula HAVING puede usar columna o alias.
Esto se debe a que la cláusula WHERE filtra los datos antes de seleccionarlos, pero HAVING cláusula filtra los datos después de seleccionarlos.
Por lo tanto, ponga las condiciones en la cláusula WHERE será más eficiente si tiene muchas filas en una tabla.
Trate de explicarle a ver la diferencia clave:
EXPLAIN SELECT `value` v FROM `table` WHERE `value`>5;
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
| 1 | SIMPLE | table | range | value | value | 4 | NULL | 5 | Using where; Using index |
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
EXPLAIN SELECT `value` v FROM `table` having `value`>5;
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
| 1 | SIMPLE | table | index | NULL | value | 4 | NULL | 10 | Using index |
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
se puede ver ya sea WHERE o HAVING índice de usos, pero las filas son diferentes.
Es cierto para algunos existentes. Todavía puede poner todo su 'Dónde' en la cláusula having. –
También vea http://stackoverflow.com/questions/2905292/where-vs-having#comment48406726_18710763 – Pacerier