De acordo com o padrão:
SELECT 1 FROM r HAVING 1=1
significa
SELECT 1 FROM r GROUP BY () HAVING 1=1
Citação ISO / IEC 9075-2: 2011 7.10 Regra de sintaxe 1 (parte da definição da cláusula HAVING):
Let HC
Ser o <having clause>
. Let TE
Ser o <table expression>
que contém imediatamente HC
. Se TE
não contiver imediatamente um
<group by clause>
, então " GROUP BY ()
" estará implícito. Let T
Seja o descritor da tabela definida pelo <group by clause>
GBC
imediatamente contido TE
e R
seja o resultado de GBC
.
Ok, então isso é bem claro.
Afirmação: 1=1
é verdadeira condição de pesquisa. Não fornecerei nenhuma citação para isso.
Agora
SELECT 1 FROM r GROUP BY () HAVING 1=1
é equivalente a
SELECT 1 FROM r GROUP BY ()
Citação ISO / IEC 9075-2: 2011 7.10 Regra Geral 1:
O <search condition>
é avaliado para cada grupo de R
. O resultado de <having clause>
é uma tabela agrupada dos grupos de R para os quais o resultado de
<search condition>
é True.
Lógica: como a condição de pesquisa é sempre verdadeira, o resultado é R
, que é o resultado do grupo por expressão.
A seguir, um trecho das Regras Gerais de 7.9 (a definição do GRUPO POR CLÁUSULA)
1) Se não <where clause>
for especificado, T
seja o resultado do anterior <from clause>
; caso contrário, T
seja o resultado do anterior <where clause>
.
2) Caso:
a) Se não houver colunas de agrupamento, o resultado da <group by clause>
é a tabela agrupada que consiste T
em seu único grupo.
Assim, podemos concluir que
FROM r GROUP BY ()
resulta em uma tabela agrupada, composta por um grupo, com zero linhas (já que R está vazio).
Um trecho das Regras Gerais da 7.12, que define uma Especificação de Consulta (também conhecida como instrução SELECT):
1) Caso:
a) Se T
não for uma tabela agrupada, então [...]
b) Se T
for uma tabela agrupada, então
Caso:
i) Se T
tiver 0 (zero) grupos, deixe TEMP ser uma tabela vazia.
ii) Se T
tiver um ou mais grupos, cada um <value expression>
será aplicado a cada grupo que T
produz uma tabela TEMP
de M
linhas, onde M
está o número de grupos em T
. A i
coluna -th do TEMP contém os valores derivados pela avaliação da i
-th <value expression>
. [...]
2) Caso:
a) Se <set quantifier>
DISTINCT
não for especificado, o resultado <query specification>
será TEMP
.
Portanto, como a tabela possui um grupo, ela deve ter uma linha de resultado.
portanto
SELECT 1 FROM r HAVING 1=1
deve retornar um conjunto de resultados de 1 linha.
QED
SELECT COUNT(*) FROM r;
retorna 1 linha (com0
), enquantoSELECT COUNT(*) FROM r GROUP BY ();
não retorna nenhuma linha.