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
Susan Sarandonoriginal
2024-12-21 00:32:16716parcourir

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

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

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!

Déclaration:
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