count(*)和count(1) 问题

101_halg 2005-08-08 10:30:34
请问select count(1) from emp和
select count(*) from emp
中的count(1) 和 count(*)有什么区别,效率上是不是有区别呀!
...全文
474 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
hrui99 2005-09-01
  • 打赏
  • 举报
回复
liuyi8903(好好学习)
我测试过,oracle 8.05 2K SERVER 结果相同.
yanjieqing 2005-08-31
  • 打赏
  • 举报
回复
一般来说
COUNT 1 要快点,1代表一个伪列,而*代表所有的列~~~来进行查询~~~

以上是骗骗的见解~~下面是我的认为`~~呵呵~~~

假如数据不是很多,不会看出来很大的区别~~~
假如数据很多,那就可以看出来了吧~~~
yanjieqing 2005-08-31
  • 打赏
  • 举报
回复
假如1代表一个字段,他反回的记录条数不包括空的行~~
但是看你们都是认为第一列,我真的觉得不理解了~~一般第一列都是主键,既然是主键就不会为空不会有重复的值是不是???
所以他们不会用很多大的区别~~~
而且你只要知道在什么情况下你需要用哪个实现你想要的功能不就OK了吗???
dabtd 2005-08-31
  • 打赏
  • 举报
回复
mark
liuyi8903 2005-08-10
  • 打赏
  • 举报
回复
你的oracle版本是多少呢?

我的是9.2.0.1
njhart2003 2005-08-10
  • 打赏
  • 举报
回复
报告版主liuyi8903(好好学习):
我按照你的试验步骤在我机子上跑了一遍,前后的结果是一样的!

环境:windows 2000 server + Oracle8.1.7

SQL> create table ARC_AQJLBUHX
2 (
3 BH VARCHAR2(24) not null,
4 DW VARCHAR2(24),
5 FZR VARCHAR2(24),
6 CJD VARCHAR2(24),
7 JH VARCHAR2(24),
8 JL VARCHAR2(24),
9 BFHXSJ DATE,
10 GBSJ DATE,
11 JDSJ DATE,
12 BFHXLB VARCHAR2(24),
13 BFHXQY VARCHAR2(24),
14 BUHXNR VARCHAR2(1000),
15 BZ VARCHAR2(100),
16 QK VARCHAR2(24),
17 BFHXYJ VARCHAR2(24),
18 BFHXYY VARCHAR2(24),
19 GK VARCHAR2(100),
20 BFHXLB1 VARCHAR2(24),
21 BFHXLB2 VARCHAR2(24),
22 BFHXLB3 VARCHAR2(24),
23 BFHXLB4 VARCHAR2(24),
24 BFHXLB5 VARCHAR2(24)
25 )
26 ;

表已创建。

SQL> insert into ARC_AQJLBUHX (BH, DW, FZR, CJD, JH, JL, BFHXSJ, GBSJ, JDSJ, BFHXLB, BFHXQY,
2 BUHXNR,BZ, QK, BFHXYJ, BFHXYY, GK,BFHXLB1, BFHXLB2, BFHXLB3, BFHXLB4, BFHXLB5)
3 values ('20050425142247716116', '01', null, '50592队', 'SQ3100', null,
4 to_date('25-04-2005', 'dd-mm-yyyy'), null, null, null,
5 null, '地', null, 'P04004D05090', null, null, null, null, null, null, null, null);

已创建 1 行。

SQL> commit;

SQL> SELECT NVL(B.QT, 0) AS QT, TOTAL
2 FROM (SELECT BFHXLB,
3 COUNT(1) AS TOTAL
4 FROM ARC_AQJLBUHX T
5 WHERE 1 = 1
6 GROUP BY BFHXLB) A,
7 (SELECT BFHXLB, COUNT(1) QT
8 FROM ARC_AQJLBUHX T
9 WHERE DW NOT IN
10 ('01', '02', '030', '19', '23', '24', '40', '20', '222000')
11 GROUP BY BFHXLB) B
12 WHERE A.BFHXLB = B.BFHXLB(+)
13 UNION
14 SELECT SUM(QT),
15 SUM(TOTAL)
16 FROM (SELECT BFHXLB,
17 COUNT(1) AS TOTAL
18 FROM ARC_AQJLBUHX T
19 WHERE 1 = 1
20 GROUP BY BFHXLB) A,
21 (SELECT BFHXLB, COUNT(1) QT
22 FROM ARC_AQJLBUHX T
23 WHERE DW NOT IN
24 ('01', '02', '030', '19', '23', '24', '40', '20', '222000')
25 GROUP BY BFHXLB) B
26 WHERE A.BFHXLB = B.BFHXLB(+)
27 ORDER BY TOTAL;

QT TOTAL
---------- ----------
0 1
1

已选择2行。

SQL> SELECT NVL(B.QT, 0) AS QT, TOTAL
2 FROM (SELECT BFHXLB,
3 COUNT(*) AS TOTAL
4 FROM ARC_AQJLBUHX T
5 WHERE 1 = 1
6 GROUP BY BFHXLB) A,
7 (SELECT BFHXLB, COUNT(*) QT
8 FROM ARC_AQJLBUHX T
9 WHERE DW NOT IN
10 ('01', '02', '030', '19', '23', '24', '40', '20', '222000')
11 GROUP BY BFHXLB) B
12 WHERE A.BFHXLB = B.BFHXLB(+)
13 UNION
14 SELECT SUM(QT),
15 SUM(TOTAL)
16 FROM (SELECT BFHXLB,
17 COUNT(*) AS TOTAL
18 FROM ARC_AQJLBUHX T
19 WHERE 1 = 1
20 GROUP BY BFHXLB) A,
21 (SELECT BFHXLB, COUNT(*) QT
22 FROM ARC_AQJLBUHX T
23 WHERE DW NOT IN
24 ('01', '02', '030', '19', '23', '24', '40', '20', '222000')
25 GROUP BY BFHXLB) B
26 WHERE A.BFHXLB = B.BFHXLB(+)
27 ORDER BY TOTAL;

QT TOTAL
---------- ----------
0 1
1

已选择2行。


提交完成。
skystar99047 2005-08-10
  • 打赏
  • 举报
回复
两者在效率上没有多少区别
select count(1) from table_name
形同
select count('adsf') from table_name
(可为任意数字或字符)
形同
select count(one) from(select 1 as one from table_name)
select count(one) from(select 100 as one from table_name)
select count(one) from(select 'asdf' as one from table_name)
heyixiang 2005-08-09
  • 打赏
  • 举报
回复
不如试试count(rowid),最快的应该就是这个了
JeromeLiu 2005-08-09
  • 打赏
  • 举报
回复
大家看看这片文章:
http://asktom.oracle.com/pls/ask/f?p=4950:8:::::F4950_P8_DISPLAYID:1156151916789
JeromeLiu 2005-08-09
  • 打赏
  • 举报
回复
count(1)就相当于count(第一列),如果该列有索引的话速度会快一些,得出的结果和count(*)是没区别的

--
这个不知道是哪里来的结论,这里的1就是个常量啊,你可以随便count('a'),count(100)都是一样的道理。
bersagliere005 2005-08-09
  • 打赏
  • 举报
回复
想问一下
查询语句结果后面的那个已用时间显示是通过什么语句实现的
谢谢
liuyi8903 2005-08-09
  • 打赏
  • 举报
回复
没看出来吗?你作个测试试一下。郁闷中。

就是这个:

QT TOTAL
---------- ----------
0 1
1 1
和这个
QT TOTAL
---------- ----------
0 1
1

的区别了。
paulfive 2005-08-09
  • 打赏
  • 举报
回复
这个问题很复杂,我看不出有什么区别??
liuyi8903 2005-08-09
  • 打赏
  • 举报
回复
不知道在你们的机器上运行结果是如何的。

反正我还有我的另外两个同事运行出来的结果都是这样的。

而count(*)的结果是正确的。
liuyi8903 2005-08-09
  • 打赏
  • 举报
回复
oracle9.2.0.1 for win
create table ARC_AQJLBUHX
(
BH VARCHAR2(24) not null,
DW VARCHAR2(24),
FZR VARCHAR2(24),
CJD VARCHAR2(24),
JH VARCHAR2(24),
JL VARCHAR2(24),
BFHXSJ DATE,
GBSJ DATE,
JDSJ DATE,
BFHXLB VARCHAR2(24),
BFHXQY VARCHAR2(24),
BUHXNR VARCHAR2(1000),
BZ VARCHAR2(100),
QK VARCHAR2(24),
BFHXYJ VARCHAR2(24),
BFHXYY VARCHAR2(24),
GK VARCHAR2(100),
BFHXLB1 VARCHAR2(24),
BFHXLB2 VARCHAR2(24),
BFHXLB3 VARCHAR2(24),
BFHXLB4 VARCHAR2(24),
BFHXLB5 VARCHAR2(24)
)
insert into ARC_AQJLBUHX (BH, DW, FZR, CJD, JH, JL, BFHXSJ, GBSJ, JDSJ, BFHXLB, BFHXQY, BUHXNR, BZ, QK, BFHXYJ, BFHXYY, GK,

BFHXLB1, BFHXLB2, BFHXLB3, BFHXLB4, BFHXLB5)
values ('20050425142247716116', '01', null, '50592队', 'SQ3100', null, to_date('25-04-2005', 'dd-mm-yyyy'), null, null, null,

null, '地', null, 'P04004D05090', null, null, null, null, null, null, null, null);
commit;



先来看用count(1)的统计结果.

SQL*PLUS>SELECT NVL(B.QT, 0) AS QT, TOTAL
2 FROM (SELECT BFHXLB,
3 COUNT(1) AS TOTAL
4 FROM ARC_AQJLBUHX T
5 WHERE 1 = 1
6 GROUP BY BFHXLB) A,
7 (SELECT BFHXLB, COUNT(1) QT
8 FROM ARC_AQJLBUHX T
9 WHERE DW NOT IN
10 ('01', '02', '030', '19', '23', '24', '40', '20', '222000')
11 GROUP BY BFHXLB) B
12 WHERE A.BFHXLB = B.BFHXLB(+)
13 UNION
14 SELECT SUM(QT),
15 SUM(TOTAL)
16 FROM (SELECT BFHXLB,
17 COUNT(1) AS TOTAL
18 FROM ARC_AQJLBUHX T
19 WHERE 1 = 1
20 GROUP BY BFHXLB) A,
21 (SELECT BFHXLB, COUNT(1) QT
22 FROM ARC_AQJLBUHX T
23 WHERE DW NOT IN
24 ('01', '02', '030', '19', '23', '24', '40', '20', '222000')
25 GROUP BY BFHXLB) B
26 WHERE A.BFHXLB = B.BFHXLB(+)
27 ORDER BY TOTAL;

QT TOTAL
---------- ----------
0 1
1 1

已用时间: 00: 00: 00.00
SQL*PLUS>

然后是count(*)的统计结果
SQL*PLUS>SELECT NVL(B.QT, 0) AS QT, TOTAL
2 FROM (SELECT BFHXLB,
3 COUNT(*) AS TOTAL
4 FROM ARC_AQJLBUHX T
5 WHERE 1 = 1
6 GROUP BY BFHXLB) A,
7 (SELECT BFHXLB, COUNT(*) QT
8 FROM ARC_AQJLBUHX T
9 WHERE DW NOT IN
10 ('01', '02', '030', '19', '23', '24', '40', '20', '222000')
11 GROUP BY BFHXLB) B
12 WHERE A.BFHXLB = B.BFHXLB(+)
13 UNION
14 SELECT SUM(QT),
15 SUM(TOTAL)
16 FROM (SELECT BFHXLB,
17 COUNT(*) AS TOTAL
18 FROM ARC_AQJLBUHX T
19 WHERE 1 = 1
20 GROUP BY BFHXLB) A,
21 (SELECT BFHXLB, COUNT(*) QT
22 FROM ARC_AQJLBUHX T
23 WHERE DW NOT IN
24 ('01', '02', '030', '19', '23', '24', '40', '20', '222000')
25 GROUP BY BFHXLB) B
26 WHERE A.BFHXLB = B.BFHXLB(+)
27 ORDER BY TOTAL;

QT TOTAL
---------- ----------
0 1
1

已用时间: 00: 00: 00.00
SQL*PLUS>

大家都可以自己试一下!
wupangzi 2005-08-08
  • 打赏
  • 举报
回复
应该是没有差别的!有也是很少的,解析语句时的时间!
njhart2003 2005-08-08
  • 打赏
  • 举报
回复
一楼对,
二楼错。
zxjnew 2005-08-08
  • 打赏
  • 举报
回复
如果第1列中有的行没有数据 那么统计出来的 count(*) 的少这些行
wupangzi 2005-08-08
  • 打赏
  • 举报
回复
没有遇到过!
希望大哥贴出来看看!
bzszp 2005-08-08
  • 打赏
  • 举报
回复
曾经测试过
没有区别。
加载更多回复(9)

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧