可能有点偏离主题,希望您可能能够帮助我解决一些争论。
故事是,我正在使用一个第三方应用程序,该应用程序在内置SQL查询引擎中拥有。此应用程序的开发人员100%确信他们的SQL实施符合所有标准。我相信事实并非如此。
考虑以下查询:
Select Count(*)
From TableName
Where id = 1000
如果有一个ID为1000的记录,我的结果集中会得到1条记录。
但是,如果没有ID为1000的记录,我的结果集中将获得0条记录。我相信我应该获得0值的1条记录,但是第三方开发人员说这是正确的。
我已经向他指出了这一点(他选择不理会) https://www.w3resource.com/sql/aggregate-functions/count-function.php
说实话,我不确定它到底有多“正式”。
我是对还是错?
当然,我意识到,第三方开发者完全有能力忽略这一点
答案 0 :(得分:4)
在评估正确或符合标准的声明时,我们必须去找合适的机构,在这种情况下,SQL-92规范(这是最简单,应用最广泛的SQL规范,因为以后的规范不会废除SQL- 92)。在寻找权威来源时,请避免使用网站上出现过淡化,对初学者友好或“真实世界”版本的规范(这样,您的第三方开发者会因为忽略w3resource.com
或{{1 }})。
The SQL-92 specification在6.5节中定义了w3schools.com
。 COUNT(*)
(今天,这些通常经常被称为“组聚合函数”)。它定义了6.5 <set function specification>
,AVG
,MAX
,MIN
和SUM
。我们关注COUNT
,它的定义如下(强调我的意思):
COUNT(*)
的自变量和COUNT(*)
的自变量源是第7.8节“”和第7.9节“ {{1}”中指定的表或一组分组表}”。让
<general set function>
作为<query specification>
的参数或参数源。如果指定了
T
,则则结果为<set function specification>
的基数。
在您的情况下:
COUNT(*)
部分,即T
。FROM tableName WHERE id = 1000
返回零结果时,该结果的基数为零T
。T
将返回0
的值(也不是COUNT(*)
,即0
从不等于NULL
btw),所以您是正确的:您必须精确地有1个结果行,而不是零行。所以他错了。编辑:(来自戈登)
我通常不这样做,但是表达这种情况的简单方法是,没有COUNT(*)
始终的聚合查询返回一个。这就是标准所指定的。