在任何数据库表上"从table_name中选择count(1)"是什么意思?

Nrj*_*Nrj 85 sql database oracle

当我们执行select count(*) from table_name它时返回行数.

怎么count(1)办?1这里有什么意义?这是否相同count(*)(因为它在执行时给出了相同的结果)?

Jef*_*dge 99

COUNT函数的参数是要为每一行计算的表达式.COUNT函数返回表达式求值为非空值的行数.(*是一个未计算的特殊表达式,它只返回行数.)

表达式还有两个额外的修饰符:ALL和DISTINCT.这些确定是否丢弃重复项.由于ALL是默认值,因此您的示例与count(ALL 1)相同,这意味着保留重复项.

由于表达式"1"对于每一行计算为非null,并且由于您没有删除重复项,因此COUNT(1)应始终返回与COUNT(*)相同的数字.

  • @datps - 实际上有无限数量的表达式可以给出相同的结果。COUNT('Hello, world!') 应该同样有效。(我还没有尝试过。)所以问题是,当已经有无数种方法可以做同样的事情时,为什么要创建一个特殊的表达式(*)呢?我不能代表 SQL 的创建者(他们有很多罪孽需要赎罪:)),但这可能是为了让人们不必任意选择非空表达式。这会混淆查询作者的意图。“为什么写1而不是2?这一定有什么意义!” (2认同)

Edd*_*wad 26

这是一个有助于回答您问题的链接.简而言之:

count(*)是写入它的正确方法,count(1)被优化为内部计数(*) - 因为

a)计算1不为空
的行比b)计算行的效率低


小智 17

oracle中count(*)和count(1)之间的区别?

count(*)表示它将计算所有记录,即每个单元格

count(1)表示它将添加一个值为1的伪列,并返回所有记录的计数


Chr*_*Dog 8

这类似于之间的区别

SELECT * FROM table_name and SELECT 1 FROM table_name.  
Run Code Online (Sandbox Code Playgroud)

如果你这样做

SELECT 1 FROM table_name
Run Code Online (Sandbox Code Playgroud)

它将为您提供表中每行的数字1.所以是的count(*),count(1)并将提供与将count(8)或相同的结果count(column_name)

  • count(column_name)不完全相同 - 它不计算该列中带空值的行.有关详细信息,请参见此处:http://stackoverflow.com/questions/169784 (3认同)

Cad*_*oux 6

没有区别.

COUNT(1)基本上只计算每行的常量值1列.正如其他用户所说的那样,它和COUNT(0)or一样COUNT(42).任何非NULL价值都足够了.

http://asktom.oracle.com/pls/asktom/f?p=100:11:2603224624843292::::P11_QUESTION_ID:1156151916789

Oracle优化器显然使用了它中的错误,这导致计数受到您选择的列以及它是否在索引中的影响,因此COUNT(1)约定应运而生.


Thi*_*ilo 5

SELECT COUNT(1) from <table name>
Run Code Online (Sandbox Code Playgroud)

应该做与

SELECT COUNT(*)  from <table name>
Run Code Online (Sandbox Code Playgroud)

它可能会或仍然有一些原因会使其比SELECT COUNT(*)某些数据库更好,但是我认为这是数据库中的错误。

SELECT COUNT(col_name) from <table name>
Run Code Online (Sandbox Code Playgroud)

但是具有不同的含义,因为对于给定的列,它仅对具有非null值的行进行计数。