zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    BZOJ2061 : Country
    BZOJ3591: 最长上升子序列
    BZOJ4356 : Ceoi2014 Wall
    BZOJ2159 : Crash 的文明世界
    BZOJ2149 : 拆迁队
    BZOJ2739 : 最远点
    BZOJ4068 : [Ctsc2015]app
    BZOJ4361 : isn
    BZOJ4404 : [Neerc2015]Binary vs Decimal
    BZOJ4402 : Claris的剑
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3313081.html
Copyright © 2011-2022 走看看