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

时间:2008-10-08 03:52:14

标签: sql database oracle

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

count(1)做什么? 1在这里表示什么?这是否与count(*)相同(因为它在执行时给出相同的结果)?

9 个答案:

答案 0 :(得分:95)

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

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

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

答案 1 :(得分:26)

以下a link有助于回答您的问题。简而言之:

  

count(*)是正确的写入方式   它和count(1)被优化为   内部计数(*) - 自

     

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

答案 2 :(得分:17)

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

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

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

答案 3 :(得分:8)

这类似于

之间的区别
SELECT * FROM table_name and SELECT 1 FROM table_name.  

如果你这样做

SELECT 1 FROM table_name

它将为您提供表格中每行的数字1。所以是count(*)count(1)将提供与count(8)count(column_name)

相同的结果

答案 4 :(得分:6)

没有区别。

COUNT(1)基本上只计算每行的常量值1列。正如此处的其他用户所说,它与COUNT(0)COUNT(42)相同。任何非NULL值都足够了。

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

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

答案 5 :(得分:5)

SELECT COUNT(1) from <table name>

应该与

完全相同
SELECT COUNT(*)  from <table name>

可能已经或者仍然有某些原因导致它在某些数据库上的性能优于SELECT COUNT(*),但我会认为数据库中存在错误。

SELECT COUNT(col_name) from <table name>
然而,

具有不同的含义,因为它只计算给定列的非空值的行。

答案 6 :(得分:2)

在oracle中,我相信这些具有完全相同的含义

答案 7 :(得分:2)

你可以这样测试:

create table test1(
 id number,
 name varchar2(20)
);

insert into test1 values (1,'abc');
insert into test1 values (1,'abc');

select * from test1;
select count(*) from test1;
select count(1) from test1;
select count(ALL 1) from test1;
select count(DISTINCT 1) from test1;

答案 8 :(得分:0)

根据您的要求,有些人报告执行select count(1) from random_table;的速度比select count(*) from random_table快。其他人声称他们完全一样。

link声称2之间的速度差异是由于全表扫描与快速全扫描所致。