Sql Server中COUNT(字段名)跟COUNT(*)的特殊不同点

今天有个需求,有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),简单明了,下面是测试结果示意:


首发:http://beinet.cn

原文地址:https://www.cnblogs.com/keanuyaoo/p/3313081.html