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 HCSer o <having clause>. Let TESer o <table expression>que contém imediatamente HC. Se TEnão contiver imediatamente um
<group by clause>, então " GROUP BY ()" estará implícito. Let TSeja o descritor da tabela definida pelo <group by clause> GBCimediatamente contido TEe Rseja 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, Tseja o resultado do anterior <from clause>; caso contrário, Tseja 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 Tem 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 Tnão for uma tabela agrupada, então [...]
b) Se Tfor uma tabela agrupada, então
Caso:
i) Se Ttiver 0 (zero) grupos, deixe TEMP ser uma tabela vazia.
ii) Se Ttiver um ou mais grupos, cada um <value expression>será aplicado a cada grupo que Tproduz uma tabela TEMPde Mlinhas, onde Mestá o número de grupos em T. A icoluna -th do TEMP contém os valores derivados pela avaliação da i-th <value expression>. [...]
2) Caso:
a) Se <set quantifier> DISTINCTnã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.