【发布时间】:2016-09-23 23:50:45
【问题描述】:
当我们执行select count(*) from table_name 时,它会返回行数。
count(1) 是做什么的? 1 在这里表示什么?这是否与count(*) 相同(因为它在执行时给出相同的结果)?
【问题讨论】:
-
有趣的问题。我也对答案是否依赖于实现感兴趣(例如,查询结果在 SQL Server 中是否与在 Oracle 中相同)。
当我们执行select count(*) from table_name 时,它会返回行数。
count(1) 是做什么的? 1 在这里表示什么?这是否与count(*) 相同(因为它在执行时给出相同的结果)?
【问题讨论】:
COUNT 函数的参数是要为每一行计算的表达式。 COUNT 函数返回表达式计算为非空值的行数。 ( * 是一个不计算的特殊表达式,它只是返回行数。)
表达式还有两个额外的修饰符:ALL 和 DISTINCT。这些确定是否丢弃重复项。因为ALL是默认的,所以你的例子和count(ALL 1)一样,就是保留重复的。
由于表达式“1”对于每一行的计算结果都为非空,并且由于您没有删除重复项,因此 COUNT(1) 应始终返回与 COUNT(*) 相同的数字。
【讨论】:
这里是a link,这将有助于回答您的问题。简而言之:
count(*) 是正确的写法 它和 count(1) 被优化为 count(*) 内部——因为
a) 计算 1 不为空的行数 效率低于
b) 计算行数
【讨论】:
oracle中count(*)和count(1)的区别?
count(*) 表示它将计算所有记录,即每个单元格 但是
count(1) 表示它将添加一个值为 1 的伪列并返回所有记录的计数
【讨论】:
这和两者的区别类似
SELECT * FROM table_name and SELECT 1 FROM table_name.
如果你这样做了
SELECT 1 FROM table_name
它会给你表格中每一行的数字 1。所以是的,count(*) 和 count(1) 将提供与 count(8) 或 count(column_name) 相同的结果
【讨论】:
没有区别。
COUNT(1) 基本上只是为每行计算一个常量值 1 列。正如这里的其他用户所说,它与COUNT(0) 或COUNT(42) 相同。任何非NULL 值都足够了。
http://asktom.oracle.com/pls/asktom/f?p=100:11:2603224624843292::::P11_QUESTION_ID:1156151916789
Oracle 优化器确实曾经明显存在 bug,导致计数受您选择的列以及是否在索引中的影响,因此 COUNT(1) 约定应运而生。
【讨论】:
SELECT COUNT(1) from <table name>
应该和
做同样的事情SELECT COUNT(*) from <table name>
在某些数据库上它的性能可能优于 SELECT COUNT(*),但我认为这是数据库中的一个错误。
SELECT COUNT(col_name) from <table name>
但是有不同的含义,因为它只计算给定列的非空值的行。
【讨论】:
在 oracle 中,我相信这些具有完全相同的含义
【讨论】:
你可以这样测试:
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;
【讨论】:
根据您询问的对象,有些人报告说执行select count(1) from random_table; 比select count(*) from random_table 运行得更快。其他人声称他们完全一样。
link 声称两者之间的速度差异是由于 FULL TABLE SCAN 与 FAST FULL SCAN。
【讨论】: