Maison >base de données >tutoriel mysql >HAVING peut-il être utilisé dans SQL sans clause GROUP BY ?

HAVING peut-il être utilisé dans SQL sans clause GROUP BY ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-29 18:12:101016parcourir

Can HAVING be Used in SQL Without a GROUP BY Clause?

Une clause HAVING peut-elle être utilisée sans clause GROUP BY ?

La norme SQL définit des critères spécifiques pour l'utilisation de la clause HAVING, qui incluent faisant référence à des colonnes qui dépendent fonctionnellement de la clause GROUP BY ou de références externes. Cependant, la requête fournie soulève la question de savoir s'il est possible d'utiliser HAVING sans GROUP BY.

Spécifications SQL standard

Selon la norme, une clause HAVING sans une clause GROUP BY n'est pas explicitement interdite. Cependant, la requête présente un comportement discutable :

SELECT *
FROM Book
HAVING NumberOfPages = MAX(NumberOfPages)

Cette requête utilise une fonction d'agrégation (MAX) dans la clause HAVING, mais elle n'indique pas quelle ligne spécifique doit être sélectionnée. Par conséquent, son comportement n'est pas strictement défini par la norme.

Implémentation MySQL

MySQL interprète cette requête comme s'il existait une clause GROUP BY implicite, en sélectionnant uniquement la ligne avec la valeur NumberOfPages maximale. Ce comportement n'est pas conforme à la norme.

Raison de la non-conformité à la norme

La norme exige que la clause HAVING opère sur des groupes de lignes définis par la clause GROUP BY. Son objectif est de filtrer les groupes en fonction de valeurs globales. L'utilisation de HAVING sans GROUP BY permettrait de filtrer sur des conditions arbitraires, conduisant potentiellement à des résultats inattendus.

Requête SQL standard valide

Une requête SQL standard valide utilisant HAVING sans GROUP BY serait :

SELECT 'T' AS result
FROM Book
HAVING MIN(NumberOfPages) < MAX(NumberOfPages);

Cette requête vérifie si la valeur minimale de NumberOfPages est inférieure à la valeur maximale, renvoyant une seule ligne avec le résultat 'T' si vrai et un ensemble vide si faux. Ce comportement est conforme à l'exigence de la norme selon laquelle HAVING s'applique aux fonctions d'agrégation opérant sur l'ensemble de la table.

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