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


92

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

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


1
有趣的问题。我还对答案是否与实现有关(例如,SQL Server中的查询结果是否与Oracle中的查询结果相同)感兴趣。
乔恩·施耐德

Answers:


106

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

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

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


请记住从表1中选择DISTINCT coloumn1!=从表1中选择count(DISTINCT coloumn1);
Kanagavelu Sugumar

另外count(1)这里1并非不,它是一个表达式。例如)从表1中选择1;该表将无行打印1次。
Kanagavelu Sugumar

从表1中选择count(DISTINCT / ALL columnName);将返回列(columnName)的所有/不同NOT NULL值中的任何一个。
卡纳加维卢·苏古玛

从表1中选择DISTINCT column1;将在列(column1)中包含一个NULL值。从表1中选择count(DISTINCT coloumn1);甚至不会包含一个NULL行。
卡纳加威卢·苏古玛

1
@datps-实际上有无限数量的表达式给出相同的结果。COUNT('Hello,world!')应该也能正常工作。(我还没有尝试过。)所以问题是,当已经有无数种处理同一件事的方式时,为什么要创建一个特殊表达式(*)?我不能代表SQL的创建者(他们有很多罪过要弥补:)),但是大概是这样,人们就不必随意选择非null表达式了。那会弄混查询作者的意图。“为什么他们写1而不是2?这一定意味着什么!”
Jeffrey L Whitledge,

26

这里的链接将帮助您回答问题。简而言之:

count(*)是编写它的正确方法,并且内部将count(1)优化为count(*)-因为

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


17

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

count(*)表示它将对所有记录进行计数,即每个单元格但

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


9

这类似于两者之间的区别

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)


3
count(column_name)不太一样-它不计算该列中具有null的行。详情请看这里:stackoverflow.com/questions/169784
Blorgbeard发布时间为

嗯,实际上是针对SQL Server的。我认为Oracle可能会有所不同。
Blorgbeard将于

根据标准SQL,Count绝不能使用NULL值,在这方面ORacle和SQL Server应该具有相同的行为。
托尔斯滕

“类似于SELECT * FROM table_name和SELECT 1 FROM table_name之间的区别。” - 并不是的。SELECT *和SELECT 1不同。SELECT(*)和SELECT(1)给出相同的结果。
大卫·奥尔德里奇


5
SELECT COUNT(1) from <table name>

应该做与

SELECT COUNT(*)  from <table name>

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

SELECT COUNT(col_name) from <table name>

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


3

在甲骨文,我相信这些具有完全相同的含义


1代表第一栏吗?
dacracot

1
否,1表示常数1。当您说ORDER BY 1时,它表示第一列。
锡洛

那就是我前一段时间想知道的,但是您可以指定任何大于列数的数字,结果仍然相同。因此,它绝对不是列号。
Nrj

@dacracot:也许可以,但我不相信。据我了解,oracle只是在后台重写了count(1)成为count(*)
Jarod Elliott

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;

0

根据您询问的人,有些人报告执行select count(1) from random_table;速度比快select count(*) from random_table。其他人则声称它们完全相同。

链接声称2之间的速度差异是由于FULL TABLE SCAN与FAST FULL SCAN所致。


您误解了链接。LS指出COUNT(COLUMN)可以与COUNT(*)相同并且比COUNT(*)更快,但前提是没有索引NOT NOT NULL列但索引COLUMN并且实际上没有null值。更多的技巧问题。
David Aldridge

1
我试图使用该链接来记录声称在某些情况下COUNT(1)可能比COUNT(*)更快的说法。一些较早的答案已经表明,两者之间没有区别,我提供了一个可能的反例。
约翰·扎查里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.