Alle Antworten auf nicht den entscheidenden Punkt getroffen hat.
Angenommen, wir haben eine Tabelle:
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
Und haben 10 Zeilen sowohl mit id und Wert von 1 bis 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);
Versuchen Sie, die folgenden zwei Abfragen:
SELECT `value` v FROM `table` WHERE `value`>5; -- Get 5 rows
SELECT `value` v FROM `table` HAVING `value`>5; -- Get 5 rows
Sie erhalten genau die gleichen Ergebnisse, Sie können sehen, dass die HAVING-Klausel ohne GROUP BY-Klausel funktionieren kann.
Hier ist der Unterschied:
SELECT `value` v FROM `table` WHERE `v`>5;
Fehler # 1054 - Unknown column 'v' in 'where clause'
SELECT `value` v FROM `table` HAVING `v`>5; -- Get 5 rows
WHERE-Klausel eine Bedingung erfordert eine Spalte in einer Tabelle zu sein, aber Die HAVING-Klausel kann entweder eine Spalte oder einen Alias verwenden.
Dies liegt daran, dass WHERE-Klausel Daten vor Auswahl filtert, aber HAVING-Klausel filtert Daten nach Auswahl.
Also setzen Sie die Bedingungen in WHERE-Klausel effizienter, wenn Sie viele viele Zeilen in einer Tabelle haben.
Versuchen Sie erklären den entscheidenden Unterschied zu sehen:
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 |
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
Sie sehen entweder WHERE oder HAVING Verwendungen Index, aber die Zeilen unterschiedlich sind.
Es ist wahr zu einigen erhalten. Sie können immer noch Ihr ganzes 'Where' in die having-Klausel einfügen. –
Siehe auch http://stackoverflow.com/questions/2905292/where-vs-having#comment48406726_18710763 – Pacerier