执行时,select count(*) from table_name
它返回行数。
怎么count(1)
办?1
在这里表示什么?这是否相同count(*)
(因为它在执行时给出相同的结果)?
Answers:
COUNT函数的参数是要为每一行求值的表达式。COUNT函数返回表达式计算结果为非空值的行数。(*是一个不计算的特殊表达式,它仅返回行数。)
该表达式还有两个附加修饰符:ALL和DISTINCT。这些确定重复项是否被丢弃。由于ALL是默认设置,因此您的示例与count(ALL 1)相同,这意味着将保留重复项。
由于表达式“ 1”的每一行求值为非空,并且由于您没有删除重复项,因此COUNT(1)始终应返回与COUNT(*)相同的数字。
这里的链接将帮助您回答问题。简而言之:
count(*)是编写它的正确方法,并且内部将count(1)优化为count(*)-因为
a)计算1不为null
的行比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)
将提供与will 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优化器显然确实曾经在其中存在错误,这导致计数受选择的列及其是否在索引中的影响,因此COUNT(1)约定应运而生。
在甲骨文,我相信这些具有完全相同的含义
您可以像这样测试:
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
。其他人则声称它们完全相同。
该链接声称2之间的速度差异是由于FULL TABLE SCAN与FAST FULL SCAN所致。