sql语句count用法中的count代表什么意思

sql count(*) count(1)区别
sql count(*) count(1)区别
效果:两者的返回结果是一样的。 & &
意义:当count的参数是具体值时(如count(1),count('a')),
count的参数已没有实际意义了。
范围:在统计范围,count(*)和count(1) 一样,都包括对NULL的统计;
& & & & & &count(column) 是不包括NULL的统计。
速度:表沒有主键(Primary key),count(1)比count(*)快;
& & & & & &否则,主键作为count的参数时,count(主键)比count(1)和count(*)都快;
& & & & & &表只有一个字段,count(*),count(1)和count(主键)速度一样。4493人阅读
数据库(13)
今天有个需求,有2张表:
1、一个“搜索记录”表search,一个“搜索后下载记录”表down
2、映射关系:每一个下载记录对应一条搜索记录,
&&&&&&&&&&&&&&&&&&&&&&&&& 第个搜索记录对应一条下载记录,也可能没有下载记录
现在需要统计某个搜索词的搜索次数、下载次数 和 未下载次数
正常情况下需要统计3次:
SELECT COUNT(*) as 搜索次数 FROM search WHERE keyword='key';
SELECT COUNT(*) as 下载次数 FROM down WHERE keyword='key';
SELECT COUNT(*) as 未下载次数
& FROM search a LEFT JOIN down b ON a.keyword=b.keyword
&WHERE a.keyword='key' AND&b.keyword IS NULL;
通过查询MSDN和相关试验后,发现COUNT(字段名),对字段值为null的,不会计数,因此上面3个SQL可以合并为:
SELECT COUNT(1) as 搜索次数, COUNT(b.keyword) as 下载次数
& FROM search a LEFT JOIN down b ON a.keyword=b.keyword
&WHERE a.keyword='key' ;
这个SQL里的“搜索次数 -下载次数=未下载次数”
其它补充:通常情况下,都是用下列sql统计记录条数:
SELECT COUNT(1)
SELECT COUNT(*)
SELECT COUNT(主键)
也有用 SELECT COUNT(0)
上 述4种COUNT方法完全一致,因为主键不可能为null,另外以前的COUNT有差异的说法,在最新的数据库,这些差异都没有了,需要注意的就是少用 COUNT(字段名),因为它会排除NULL值,导致计数跟结果不一致,推荐用COUNT(1),简单明了,下面是测试结果示意:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:370653次
积分:4230
积分:4230
排名:第7134名
原创:96篇
评论:100条
(1)(1)(1)(1)(1)(1)(1)(3)(1)(1)(4)(3)(4)(1)(3)(2)(5)(1)(1)(2)(2)(1)(2)(2)(1)(2)(4)(1)(1)(1)(2)(3)(1)(1)(5)(7)(1)(1)(2)(3)(4)(2)(5)(6)(1)SQL COUNT 用法
在上一页有提到,COUNT 是函数之一。由于它的使用广泛,我们在这里特别提出来讨论。基本上,COUNT 让我们能够数出在表格中有多少笔资料被选出来。它的语法是:
SELECT COUNT("栏位名")
FROM "表格名";
举例来说,若我们要找出我们的示范表格中有几笔 store_name 栏不是空白的资料时,
Store_Information 表格
Los Angeles150005-Jan-1999
San Diego25007-Jan-1999
Los Angeles30008-Jan-1999
Boston70008-Jan-1999
我们就打入,
SELECT COUNT (Store_Name)
FROM Store_Information
WHERE Store_Name IS NOT NULL;
COUNT (Store_Name)
"IS NOT NULL" 是 "这个栏位不是空白" 的意思。
COUNT 和 DISTINCT 经常被合起来使用,目的是找出表格中有多少笔不同的资料 (至于这些资料实际上是什么并不重要)。举例来说,如果我们要找出我们的表格中有多少个不同的 store_name,我们就打入,
SELECT COUNT (DISTINCT Store_Name)
FROM Store_I
COUNT (DISTINCT Store_Name)
Copyright & 2017 &
& All Rights Reserved.1.关于count(1),count(*),和count(列名)的区别
  相信大家总是在工作中,或者是学习中对于count()的到底怎么用更快。一直有很大的疑问,有的人说count(*)更快,也有的人说count(列名)更快,那到底是谁更快,我将会在本文中详细介绍一下到底是count(1),count(*)和count(列明)的区别,和更适合的使用场景。   
  往常在工作中有人会说count(1)比count(*)会快,或者相反,首先这个结论肯定是错的,实际上count(1)和count(*)并没有区别。
  接下来,我们来对比一下count(*)和count(列)到底谁更快一些
  首先我们执行以下sql,来看一下执行效率(下面sql针对的是ORACLE数据库,大致逻辑为先删除t别,然后在根据dba_objects创建t表,在更新t表根据rownum)
1 drop table
2 create table t as select * from dba_
3 --alter table T modify object_
4 update t set object_id =
5 set timing on
6 set linesize 1000
7 set autotrace on --开启跟踪
9 select count(*) from
<span style="color: # /
<span style="color: # select count(object_id) from
<span style="color: # /
  然后咱们分别看一下“select count(*) from t”和“select count(object_id) from t”语句的执行计划。(执行计划是指sql的一个执行顺序和耗费的资源,耗费的资源越少越快,如果在plsql中,使用F8可以查看sql的执行计划)
  通过我们执行sql的实验来说,count(*)和count(列)消耗的资源是一样的,说面他们是一样快的,但是真的是这样么。那么咱们接着以下的实验。
  这次咱们给object_id这一列加一个索引试一下。我们执行一下索引sql
<span style="color: # create index idx_object_id on t(object_id);
<span style="color: # select count(*) from
<span style="color: # /
<span style="color: #
<span style="color: #
<span style="color: # select count(object_id) from
<span style="color: # /
  然后我们在分别看一下两条sql的执行计划
  通过我们建完索引后。突然发现count(列)变快了好多,但是count(*)还是和以前一样的。这说明了count(列)可以用到索引,而count(*)不行,但是真的这样么,咱们在往下看。
  接下来我们给object_id这个字段加上不可为空条件。我们执行以下sql
<span style="color: # create index idx_object_id on t(object_id);
<span style="color: # select count(*) from
<span style="color: # /
<span style="color: #
<span style="color: #
<span style="color: # select count(object_id) from
<span style="color: # /
  接下来我们在来看一下count(*)的执行计划
  现在count(*)和count(列)一样快了,由此我们得出了这个结论:count(列)和count(*)其实一样快,如果索引列是非空的,count(*)可用到索引,此时一样快。
  总结:但是真的结论是这样的么。其实不然。其实在数据库中count(*)和count(列)根本就是不等价的,count(*)是针对于全表的,而count(列)是针对于某一列的,如果此列值为空的话,count(列)是不会统计这一行的。所以两者根本没有可比性,性能比较首先要考虑写法等价,这两个语句根本就不等价。也就失去了去比较的意义!!!
2.关于表中字段顺序的问题
  首先我们建一张有25个字段的表并加入数据在进行count(*)和count(列)比较。由于建表语句和插入语句和上面雷同。就不贴出代码了。
&&&&&& 然后我们分别执行count(*)和count每一列的操作来看一下到底谁更快一些,由于执行计划太多,就不一一贴图了。我整理了一个excel来给大家看一下执行的结果
  经过实验我们看出,count(列)越往后。我们的执行效率越慢。所以,我们得出以下结论:
&&&  && 1.列的偏移量决定性能,列越靠后,访问的开销越大。
    & 2.由于count(*)的算法与列偏移量无关,所以count(*)最快。
  总结:所以我们在开发设计中。越常用的列,要放在靠前的位置。而cout(*)和count(列)是两个不等价的用法,所以无法比较哪个性能更好,在实际的sql优化场景中要根据当时的业务场景再去考虑是使用count(*)还是count(列)(其中的区别上文有提到)。
阅读(...) 评论()

我要回帖

更多关于 sql语句count 的文章

 

随机推荐