按照标准:
SELECT 1 FROM r HAVING 1=1
手段
SELECT 1 FROM r GROUP BY () HAVING 1=1
引用ISO / IEC 9075-2:2011 7.10语法规则1(HAVING子句的定义的一部分):
让它HC成为<having clause>。让TE是<table expression>直接包含HC。如果TE不立即包含
<group by clause>,则“ GROUP BY ()”是隐含的。我们T是由定义的表的描述符<group by clause> GBC直接包含在TE让R是的结果GBC。
好的,这很清楚。
断言:1=1是真实的搜索条件。我不会为此提供任何引用。
现在
SELECT 1 FROM r GROUP BY () HAVING 1=1
等价于
SELECT 1 FROM r GROUP BY ()
引用ISO / IEC 9075-2:2011 7.10一般规则1:
在<search condition>对各组的评价R。的结果<having clause>是R的那些组的分组表,其结果
<search condition>为True。
逻辑:由于搜索条件始终为true,因此结果为R,这是按表达式分组的结果。
以下摘录自7.9一般规则(GROUP BY CLAUSE的定义)
1)如果未<where clause>指定,则T设为前面的结果<from clause>;否则,T设为的结果<where clause>。
2)案例:
a)如果没有分组列,则的结果<group by clause>就是T作为唯一分组组成的分组表。
因此我们可以得出结论
FROM r GROUP BY ()
生成一个分组的表,该表由一组组成,具有零行(因为R为空)。
摘录自7.12的通用规则,其中定义了查询规范(又称为SELECT语句):
1)案例:
a)如果T不是分组表,则[...]
b)如果T是分组表,则
案件:
i)如果T有0(零)个组,则让TEMP为空表。
ⅱ)如果T有一个或多个基团,则每个<value expression>被施加到每个组的T产生的表TEMP的M行,其中M是在基团的数目T。iTEMP 的-th列包含通过i-th 求值得出的值<value expression>。[...]
2)案例:
a)如果<set quantifier> DISTINCT未指定,则结果<query specification>为TEMP。
因此,由于该表具有一组,因此它必须具有一个结果行。
从而
SELECT 1 FROM r HAVING 1=1
应该返回1行结果集。
优质教育
SELECT COUNT(*) FROM r;返回1行(带有0),而不SELECT COUNT(*) FROM r GROUP BY ();返回任何行。