Selon la norme:
SELECT 1 FROM r HAVING 1=1
veux dire
SELECT 1 FROM r GROUP BY () HAVING 1=1
Citation ISO / IEC 9075-2: 2011 7.10 Règle de syntaxe 1 (partie de la définition de la clause HAVING):
Soit HCle <having clause>. Laissez - TEle <table expression>contenant immédiatement HC. Si TEne contient pas immédiatement un
<group by clause>, « GROUP BY ()» est implicite. Soit Tle descripteur de la table défini par <group by clause> GBCimmédiatement contenu dans TEet Rsoit le résultat de GBC.
Ok donc c'est assez clair.
Assertion: 1=1est une véritable condition de recherche. Je ne fournirai aucune citation à ce sujet.
Maintenant
SELECT 1 FROM r GROUP BY () HAVING 1=1
équivaut à
SELECT 1 FROM r GROUP BY ()
Citation ISO / IEC 9075-2: 2011 7.10 Règle générale 1:
Le <search condition>est évalué pour chaque groupe de R. Le résultat de <having clause>est un tableau groupé des groupes de R pour lesquels le résultat de
<search condition>est True.
Logique: Puisque la condition de recherche est toujours vraie, le résultat est R, qui est le résultat du groupe par expression.
Ce qui suit est un extrait des Règles générales de 7.9 (la définition du GROUPE PAR CLAUSE)
1) Si non <where clause>est spécifié, alors Tsoit le résultat de ce qui précède <from clause>; sinon, Tsoit le résultat de ce qui précède <where clause>.
2) Cas:
a) S'il n'y a pas de colonnes de regroupement, le résultat du <group by clause>est la table groupée constituée Tcomme son seul groupe.
Nous pouvons donc conclure que
FROM r GROUP BY ()
donne une table groupée, composée d'un groupe, avec zéro ligne (puisque R est vide).
Un extrait des règles générales de 7.12, qui définit une spécification de requête (alias une instruction SELECT):
1) Cas:
a) Si Tn'est pas une table groupée, alors [...]
b) Si Test une table groupée, alors
Cas:
i) Si Ta 0 (zéro) groupes, alors laissez TEMP être une table vide.
ii) Si Ta un ou plusieurs groupes, alors chacun <value expression>est appliqué à chaque groupe de Tproduire une table TEMPde Mlignes, où Mest le nombre de groupes dans T. La icolonne -th de TEMP contient les valeurs dérivées de l'évaluation du i-th <value expression>. [...]
2) Cas:
a) Si le <set quantifier> DISTINCTn'est pas spécifié, le résultat de l' <query specification>est TEMP.
Par conséquent, puisque la table a un groupe, elle doit avoir une ligne de résultat.
Donc
SELECT 1 FROM r HAVING 1=1
doit renvoyer un jeu de résultats d'une ligne.
QED
SELECT COUNT(*) FROM r;renvoie 1 ligne (avec0), tandis qu'ilSELECT COUNT(*) FROM r GROUP BY ();ne renvoie aucune ligne.