DB2中的count(1)与sum(1)

今天在某群中看到有同学问DB2中的count(1)和sum(1)是什么意思。

习惯了使用count(*)或sum(ColName),很少这样直接写数字。不假思索之下觉得好像是对第1个字段求count或sum吧,但有些吃不准。搜了一通也不知所然。

测试一下吧

//环境:DB2 8.2 FP7(DB2/NT 8.2.7)

//测试数据
create table test (c1 date, c2 varchar(60))
insert into test (c1, c2) values (currentdate, ‘小虎’)
insert into test (c1, c2) values (currentdate, '阿花')
insert into test (c1, c2) values (currentdate, '小F')

select count(*), count(1) from test
// 3 3
select count(*), count(2) from test
// 3 3
select count(*), count(10) from test
// 3 3
select count(*), count(‘hello’) from test
// 3 3

select count(*), sum(1) from test
// 3 3
select count(*), sum(2) from test
// 3 6
select count(*), sum(10) from test
// 3 30
select count(*), sum(‘hello’) from test
// 报错:),SQL0440N 未找到类型为"FUNCTION" 命名为 "SUM" 且具有兼容自变量的已授权例程。SQLSTATE=42884

结论

count(1)中的1是一个常量,如果你喜欢,也可以用count(2),count('hello') 。

sum求和也一样,但和count计数不同,sum参数只能是数值。数值常量情况下,结果相当于count(1)乘上数值,即:

sum(1)=count(1)=count(*)

sum(2)=coun(1)*2


结论之外

1、以上测试在MS-SQL 2000中结果一样。但不排除在其它DBMS产品或其它DB2、MS-SQL版本有不同的实现,比如有群友提到在Teradata中1就是表示第1个字段(手边没有环境,未验证)。

2、count(1)与count(*)的结果一样,但实现过程、执行效率有没有区别?

时间关系没有专门做测试,有人在MS-SQL(SQL Server2005 SP2)上做过测试比较,结论有:count(*)和count(1)的执行效率是完全一样;count(*)的执行效率比count(col)高,因此可以用count(*)的时候就不要去用count(col);count(col)的执行效率比count(distinctcol)高,不过这个结论的意义不大,这两种方法使用场合不同;如果是对特定的列做count的话建立这个列的非聚集索引能对count有很大的帮助;如果经常count(*)的话则可以找一个最小的col建立非聚集索引以避免全表扫描而影响整体性能。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值