按照标准:
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
。i
TEMP 的-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 ();
返回任何行。