Position des colonnes personnalisées dans les requêtes MySQL : WHERE et HAVING
Question :
Pourquoi les colonnes créées dans l'instruction SELECT doivent-elles être placées après la clause HAVING et non après la clause WHERE dans MySQL ? De plus, y a-t-il des inconvénients à utiliser WHERE 1 au lieu de spécifier la définition complète de la colonne ?
Réponse :
Bien que d'autres réponses aient abordé ce sujet, les principales différences sont les suivantes :
Clause WHERE : Filtre les données avant la sélection, autorisant n'importe quelle colonne du tableau. Il ne peut pas utiliser d'alias ou de fonctions d'agrégation.
Clause HAVING : Filtre les données après sélection, permettant l'utilisation de colonnes, d'alias ou de fonctions d'agrégation sélectionnées.
Localisation :
Les colonnes personnalisées doivent être placées après la clause HAVING car :
Efficacité :
Pour filtrer de grands ensembles de données, l'utilisation de la clause WHERE est plus efficace car elle élimine les lignes non pertinentes avant d'effectuer la sélection.
Exemple :
Considérez la forme suivante :
<code class="language-sql">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</code>
Contient 10 lignes de données, avec des valeurs d'identifiant et de valeur allant de 1 à 10.
Requête :
<code class="language-sql">SELECT `value` v FROM `table` WHERE `value`>5; -- 获取 5 行 SELECT `value` v FROM `table` HAVING `value`>5; -- 获取 5 行</code>
Résultat :
Les deux requêtes renvoient les mêmes résultats, ce qui montre que la clause HAVING peut fonctionner sans la clause GROUP BY.
EXPLIQUEZ :
<code class="language-sql">EXPLAIN SELECT `value` v FROM `table` WHERE `value`>5;</code>
<code>+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+ | 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 | +----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+</code>
<code class="language-sql">EXPLAIN SELECT `value` v FROM `table` having `value`>5;</code>
<code>+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+ | 1 | SIMPLE | table | index | NULL | value | 4 | NULL | 10 | Using index | +----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+</code>
Comme vous pouvez le voir, WHERE et HAVING utilisent des index, mais le nombre de lignes renvoyées est différent. WHERE filtre les données avant la sélection, réduisant le nombre de lignes, tandis que HAVING filtre les lignes après la sélection.
Conclusion :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!