Toutes les autres réponses à cette question n'ont pas atteint le point clé.
Supposons que nous ayons une table:
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
Et avoir 10 lignes avec à la fois id et valeur de 1 à 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);
Essayez les 2 requêtes suivantes:
SELECT `value` v FROM `table` WHERE `value`>5; -- Get 5 rows
SELECT `value` v FROM `table` HAVING `value`>5; -- Get 5 rows
Vous obtiendrez exactement les mêmes résultats, vous pouvez voir que la clause HAVING peut fonctionner sans la clause GROUP BY.
Voici la différence:
SELECT `value` v FROM `table` WHERE `v`>5;
Erreur # 1054 - Colonne inconnue 'v' dans la clause 'where'
SELECT `value` v FROM `table` HAVING `v`>5; -- Get 5 rows
La clause WHERE permet à une condition d'utiliser n'importe quelle colonne de table, mais elle ne peut pas utiliser d'alias ou de fonctions d'agrégation. La clause HAVING permet à une condition d'utiliser une colonne (!), Un alias ou une fonction d'agrégation sélectionnée.
En effet, la clause WHERE filtre les données avant la sélection, mais la clause HAVING filtre les données résultantes après la sélection.
Donc, mettre les conditions dans la clause WHERE sera plus efficace si vous avez beaucoup de lignes dans une table.
Essayez EXPLAIN pour voir la différence clé:
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 |
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
Vous pouvez voir WHERE ou HAVING utilise l'index, mais les lignes sont différentes.
SELECT value, COUNT(*) frequency FROM table GROUP BY value HAVING frequency > 10
...HAVING clause can use both column and alias.
vers...HAVING clause can use either column or alias.
et changement...WHERE clause will be more effective
vers...WHERE clause will be more efficient
La principale différence est qu'il
WHERE
ne peut pas être utilisé sur un élément groupé (commeSUM(number)
) alors queHAVING
peut.La raison en est que le
WHERE
processus est effectué avant le regroupement etHAVING
est effectué après le regroupement.la source
HAVING
est utilisé pour filtrer les agrégations dans votre fichierGROUP BY
.Par exemple, pour rechercher des noms en double:
la source
Ces 2 seront les mêmes que les premiers, car les deux sont utilisés pour dire une condition pour filtrer les données. Bien que nous puissions utiliser "avoir" à la place de "où" dans tous les cas, il y a des cas où nous ne pouvons pas utiliser "où" au lieu de "avoir". En effet, dans une requête de sélection, «où» filtre les données avant «sélectionner» tout en «ayant» les données de filtre après «sélectionner». Ainsi, lorsque nous utilisons des noms d'alias qui ne figurent pas réellement dans la base de données, «où» ne peut pas les identifier mais «ayant» le peut.
Ex: laissez la table Student contenir student_id, nom, anniversaire, adresse. Supposons que l'anniversaire est de type date.
la source
WHERE
etHAVING
.Et continue,
Extrait de: Forta, Ben. «Sams vous enseigne le SQL en 10 minutes (5e édition) (Sams vous enseigne ...).».
la source
Avoir n'est utilisé qu'avec l'agrégation mais où avec les instructions de non agrégation Si vous avez où le mot le place avant l'agrégation (grouper par)
la source