Maison > base de données > tutoriel mysql > Pourquoi ne puis-je pas utiliser un alias d'agrégation dans une clause SQL HAVING ?

Pourquoi ne puis-je pas utiliser un alias d'agrégation dans une clause SQL HAVING ?

Susan Sarandon
Libérer: 2024-12-21 00:32:16
original
676 Les gens l'ont consulté

Why Can't I Use an Aggregate Alias in a SQL HAVING Clause?

Pourquoi ne puis-je pas utiliser un alias d'agrégation dans une clause HAVING ?

Considérez l'instruction SQL suivante :

select col1,count(col2) as col7
from --some join operation
group by col1
having col7 >= 3 -- replace col7 by count(col2) to make the code work
Copier après la connexion

Ce code génère une erreur indiquant que "col7" est un nom de colonne invalide. Pourquoi en est-il ainsi ?

La raison réside dans l'ordre d'exécution des instructions SQL. La clause HAVING est évaluée avant la clause SELECT. Cela signifie que lorsque la clause HAVING est évaluée, l'alias "col7" pour la fonction d'agrégation count(col2) n'est pas encore défini.

SQL exécute les requêtes dans l'ordre suivant :

  1. Calculez le produit cartésien de toutes les tables spécifiées dans la clause FROM.
  2. Filtrez les lignes en fonction de WHERE
  3. Regroupez les lignes en fonction de la clause GROUP BY.
  4. Filtrez les groupes en fonction de la clause HAVING.
  5. Évaluez les expressions dans la liste cible de la clause SELECT.
  6. Supprimez les lignes en double si DISTINCT est spécifié.
  7. Effectuez des unions si des sous-sélections sont présente.
  8. Trier les lignes en fonction de la clause ORDER BY.
  9. Appliquer la clause TOP, si présente.

Par conséquent, dans le code donné, la clause HAVING tente d'utiliser l'alias "col7" avant qu'il ne soit défini dans la clause SELECT. Pour résoudre le problème, vous pouvez remplacer "col7" par la fonction d'agrégation elle-même :

select col1,count(col2)
from --some join operation
group by col1
having count(col2) >= 3
Copier après la connexion

Cela permet à la clause HAVING d'évaluer correctement le nombre agrégé de col2.

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