Por el estándar:
SELECT 1 FROM r HAVING 1=1
medio
SELECT 1 FROM r GROUP BY () HAVING 1=1
Cita ISO / IEC 9075-2: 2011 7.10 Regla de sintaxis 1 (Parte de la definición de la cláusula HAVING):
Deja HC
ser el <having clause>
. Deja que TE
sea lo <table expression>
que contiene de inmediato HC
. Si TE
no contiene inmediatamente a
<group by clause>
, entonces " GROUP BY ()
" está implícito. Sea T
el descriptor de la tabla definida por el <group by clause>
GBC
contenido inmediato TE
y R
sea el resultado de GBC
.
Ok, eso está bastante claro.
Afirmación: 1=1
es verdadera condición de búsqueda. No proporcionaré ninguna cita para esto.
Ahora
SELECT 1 FROM r GROUP BY () HAVING 1=1
es equivalente a
SELECT 1 FROM r GROUP BY ()
Cita ISO / IEC 9075-2: 2011 7.10 Regla general 1:
El <search condition>
se evalúa para cada grupo de R
. El resultado de la <having clause>
es una tabla agrupada de aquellos grupos de R para los cuales el resultado de la
<search condition>
es True.
Lógica: dado que la condición de búsqueda siempre es verdadera, el resultado es R
, que es el resultado del grupo por expresión.
Lo siguiente es un extracto de las Reglas Generales de 7.9 (la definición del GRUPO POR CLÁUSULA)
1) Si no <where clause>
se especifica no, entonces T
sea el resultado de lo anterior <from clause>
; de lo contrario, T
sea el resultado de lo anterior <where clause>
.
2) Caso:
a) Si no hay columnas de agrupación, el resultado de la <group by clause>
tabla agrupada consiste T
en su único grupo.
Así podemos concluir que
FROM r GROUP BY ()
da como resultado una tabla agrupada, que consta de un grupo, con cero filas (ya que R está vacío).
Un extracto de las Reglas generales de 7.12, que define una Especificación de consulta (también conocida como una instrucción SELECT):
1) Caso:
a) Si T
no es una tabla agrupada, entonces [...]
b) Si T
es una tabla agrupada, entonces
Caso:
i) Si T
tiene 0 (cero) grupos, entonces deje que TEMP sea una tabla vacía.
ii) Si T
tiene uno o más grupos, cada uno <value expression>
se aplica a cada grupo para obtener T
una tabla TEMP
de M
filas, donde M
está el número de grupos T
. La i
columna -th de TEMP contiene los valores derivados de la evaluación de i
-th <value expression>
. [...]
2) Caso:
a) Si <set quantifier>
DISTINCT
no se especifica, entonces el resultado de la <query specification>
es TEMP
.
Por lo tanto, dado que la tabla tiene un grupo, debe tener una fila de resultados.
Así
SELECT 1 FROM r HAVING 1=1
debería devolver un conjunto de resultados de 1 fila.
QED
SELECT COUNT(*) FROM r;
devuelve 1 fila (con0
), mientras queSELECT COUNT(*) FROM r GROUP BY ();
no devuelve ninguna fila.