在任何数据库表中,“ select count (1) from table_name”是什么意思?

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

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

214614 次浏览

in oracle i believe these have exactly the same meaning

这与

SELECT * FROM table_name and SELECT 1 FROM table_name.

If you do

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)约定应运而生。

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

表达式还有两个其他修饰符: ALL 和 DISTINCT。它们决定是否丢弃重复项。因为 ALL 是默认值,所以您的示例与 count (ALL 1)相同,这意味着保留重复项。

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

SELECT COUNT(1) from <table name>

should do the exact same thing as

SELECT COUNT(*)  from <table name>

There may have been or still be some reasons why it would perform better than SELECT COUNT(*)on some database, but I would consider that a bug in the DB.

SELECT COUNT(col_name) from <table name>

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

下面是 a link,可以帮助你回答问题。简而言之:

Count (*)是正确的写法 它和计数(1)被优化为 Count (*)内部-因为

A)计算其中1不为空的行数 效率不如
B)数行数

根据您询问的对象,有些人报告说执行 select count(1) from random_table;select count(*) from random_table运行得更快。其他人声称它们是完全一样的。

这个 链接声称两者之间的速度差异是由于全表扫描和快速全表扫描。

Oracle 中 count (*)和 count (1)的区别?

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

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

你可以这样测试:

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;