SQL计数说明

时间:2018-10-15 22:50:25

标签: sql count

可能有点偏离主题,希望您可能能够帮助我解决一些争论。

故事是,我正在使用一个第三方应用程序,该应用程序在内置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

说实话,我不确定它到底有多“正式”。

我是对还是错?

当然,我意识到,第三方开发者完全有能力忽略这一点

1 个答案:

答案 0 :(得分:4)

在评估正确或符合标准的声明时,我们必须去找合适的机构,在这种情况下,SQL-92规范(这是最简单,应用最广泛的SQL规范,因为以后的规范不会废除SQL- 92)。在寻找权威来源时,请避免使用网站上出现过淡化,对初学者友好或“真实世界”版本的规范(这样,您的第三方开发者会因为忽略w3resource.com或{{1 }})。

The SQL-92 specification在6.5节中定义了w3schools.comCOUNT(*)(今天,这些通常经常被称为“组聚合函数”)。它定义了6.5 <set function specification>AVGMAXMINSUM。我们关注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(*) 始终的聚合查询返回一个。这就是标准所指定的。