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 HC
le <having clause>
. Laissez - TE
le <table expression>
contenant immédiatement HC
. Si TE
ne contient pas immédiatement un
<group by clause>
, « GROUP BY ()
» est implicite. Soit T
le descripteur de la table défini par <group by clause>
GBC
immédiatement contenu dans TE
et R
soit le résultat de GBC
.
Ok donc c'est assez clair.
Assertion: 1=1
est 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 T
soit le résultat de ce qui précède <from clause>
; sinon, T
soit 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 T
comme 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 T
n'est pas une table groupée, alors [...]
b) Si T
est une table groupée, alors
Cas:
i) Si T
a 0 (zéro) groupes, alors laissez TEMP être une table vide.
ii) Si T
a un ou plusieurs groupes, alors chacun <value expression>
est appliqué à chaque groupe de T
produire une table TEMP
de M
lignes, où M
est le nombre de groupes dans T
. La i
colonne -th de TEMP contient les valeurs dérivées de l'évaluation du i
-th <value expression>
. [...]
2) Cas:
a) Si le <set quantifier>
DISTINCT
n'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.