COUNT(*)与COUNT(某个字段)的区别,及count(null)和count(distinct 某字段)的用法

14 篇文章 0 订阅
 由于Oracle在count()的时候,并不计算null(空值)部分,所以和空值结合起来进行统计的时候还是有一些意思。
       count这个函数应用的太频繁,有必要深究一番。      
       测试表格及其数据:
        SQL> desc student;
        Name Type         Nullable Default Comments 
        ---- ------------ -------- ------- -------- 
        SID  INTEGER      Y                         
        NAME VARCHAR2(10) Y                         
        
        SQL> select * from student;
        
                                            SID NAME
        --------------------------------------- ----------
                                              1 lzf
                                              2 wth
        
        SQL> desc subject
        Name    Type         Nullable Default Comments 
        ------- ------------ -------- ------- -------- 
        SID     INTEGER      Y                         
        SUBNAME VARCHAR2(20) Y                         
        
        SQL> select * from subject;
        
                                            SID SUBNAME
        --------------------------------------- --------------------
                                              1 chinese
                                              1 
                                              1 
                                              2 chinese
                                              2 math
        
        1)  count(*)  和count(?)
       *表示的是计算记录数目,?表示的是计算具体某个字段的数目( 但不包含空值 ).
       --计算 每个学生有关的记录数的多少 (*表示记录数)
          SQL> Select a.sid,a.Name,Count(*)
          2     From student a,subject b
          3     Where b.sid=a.sid
          4     Group By a.sid,a.Name
          5  /
        
                                            SID NAME         COUNT(*)
        --------------------------------------- ---------- ----------
                                              1 lzf                 3
                                              2 wth                 2
        2)count和null(空值)
        count(?) ,即计算某个字段的时候,并不计算空值。
          --计算 每个学生的学科数目 ,这里用到count(?)。
          SQL> Select a.sid,a.Name,Count(b.subname)
          2     From student a,subject b
          3     Where b.sid=a.sid
          4     Group By a.sid,a.Name
          5  /
        
                                            SID NAME       COUNT(B.SUBNAME)
        --------------------------------------- ---------- ----------------
                                              1 lzf                       1
                                              2 wth                     2
        可以看到,使用count(?)的时候,空值并不计算。
        因为空值并不计算,所以有的时候,可以把不需要计算的内容设置为空值以避免计算
        例如select a.sid,count(case when b.subname='englishi' then null else b.subname end) from xxxx.

        
         3)count和distinct  
        很多时候,不希望重复计算重复出现的信息。
         SQL> select * from score;
        
                                            SID SUBNAME                      CJ
        --------------------------------------- -------------------- ----------
                                              1 chinese                     100
                                              1 chinese                      80
                                              1 chinese                      60
                                              1 chinese                      70
                                              2 math                         70
                                              2 math                         80
                                              2 math                        100
                                              2 english                      67
        
        8 rows selected
        
        SQL> select  sid,sum(cj),count(distinct subname) from score group by sid;
        
                                            SID    SUM(CJ)  COUNT(DISTINCT  SUBNAME)
        --------------------------------------- ---------- ----------------------
                                              1        310                      1
                                              2        317                      2    
       上面这个例子用于 统计每个学生的总成绩,以及科目的数目 。 可以看出来distinct和count,sum之类的很好的地结合在一起了。 
        之所以能很好结合在一起,是因为执行计划值这样的:
        a)扫描每条满足条件的记录.
        b)对结果排序.
        c)的在排序结果上可以通知做sum,distinct操作
        d)最后才是做count(distinct)操作. 因为count是最外层的,所以并不影响结果.

         4) coun(*) 和count(1)或者是count(常量)
        此三者是等价的(或者是一样结果的),都是表示计算记录的数目。不存在谁比谁快的问题。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值