Chinaunix首页 | 论坛 | 博客
  • 博客访问: 128587
  • 博文数量: 10
  • 博客积分: 2090
  • 博客等级: 大尉
  • 技术积分: 400
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-24 10:16
文章分类
文章存档

2011年(4)

2010年(2)

2008年(4)

我的朋友

分类: Mysql/postgreSQL

2011-07-30 18:03:22

SQL 语句的COUNT有两种用途
1. 用来计算行数——Count(*)
2. 用来计算某个值的数量——COUNT(col1)
Count(*) 永远返回的都是结果集中的行数,而COUNT(col1)只返回col1值非空的记录数,如果col1值全部非空,
Count(*)和COUNT(col1)的结果是相同的。

Count的用法很简单,可在实际开发过程中还是能找到使用不那么精确的地方
很多时候我们会利用Count(*)来检查是否存在满足条件的数据,例如删除一个用户角色的时候,会通过
/****************************************************************************************************/
select count(*) from tbl_user_role user_role where user_role.role_id=#roldId#
/****************************************************************************************************/
来判断是否用户角色是否因被某个用户引用而不能删除。其实,我们的业务只要求确认是否有满足的条件的记录存在,而根本不关心满足记录的数量。select count(*)在这个例子中的用法会导致不必要的磁盘扫描和记录检索。正确的写法应该是
/*************************************Mysql***************************************************************************/
select exists (select * from tbl_user_role user_role where user_role.role_id=10 limit 1) 
/*************************************Mysql***************************************************************************/

/*************************************Oracle***************************************************************************/
select count(*) from dual where exists (select * from tbl_user_role user_role where user_role.role_id=10 and rownum=1) 
/*************************************Oracle***************************************************************************/

写法可能有多种,原理很简单,就是只找到符合记录的第一条就终止查询。
阅读(1825) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~