Maison > base de données > tutoriel mysql > Requêtes MySQL : OÙ ou HAVING – Quand dois-je utiliser HAVING pour les colonnes personnalisées ?

Requêtes MySQL : OÙ ou HAVING – Quand dois-je utiliser HAVING pour les colonnes personnalisées ?

Mary-Kate Olsen
Libérer: 2025-01-19 22:32:14
original
569 Les gens l'ont consulté

MySQL Queries: WHERE vs. HAVING – When Should I Use HAVING for Custom Columns?

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 :

  • HAVING filtre les données de résultats sélectionnées, y compris les colonnes personnalisées.
  • WHERE filtre les données de résultat avant la sélection, à l'exclusion des colonnes personnalisées.

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion
<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>
Copier après la connexion
<code class="language-sql">EXPLAIN SELECT `value` v FROM `table` having `value`>5;</code>
Copier après la connexion
<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>
Copier après la connexion

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 :

  • Placez des colonnes personnalisées après la clause HAVING pour filtrer les données sélectionnées.
  • Utilisez la clause WHERE pour filtrer efficacement de grands ensembles de données en excluant les lignes non pertinentes.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal