• MySQL的count函数注意点


    有一张t3表,表结构和数据如下:

     1 mysql> select * from t3;
     2 
     3 +------+------+------+------+
     4 
     5 | id | num1 | num2 | type |
     6 
     7 +------+------+------+------+
     8 
     9 | 1 | 123 | 231 | A |
    10 
    11 | 2 | 35 | 13 | A |
    12 
    13 | 3 | 44 | NULL | A |
    14 
    15 | 5 | 89 | 24 | B |
    16 
    17 | 9 | NULL | 31 | B |
    18 
    19 | 10 | 21 | 3 | C |
    20 
    21 | NULL | NULL | NULL | NULL |
    22 
    23 +------+------+------+------+

    1、count(*)和count(1)

      这种用法下,就是根据查询语句的条件统计行数,统计出有多少行就返回相应的行数值。例如:

     1 mysql> select count(1) from t3;
     2 
     3 +----------+
     4 
     5 | count(1) |
     6 
     7 +----------+
     8 
     9 | 7 |
    10 
    11 +----------+
    12 
    13 1 row in set (0.00 sec)
    14 
    15  
    16 
    17 mysql> select count(1) from t3 where num1 is null;
    18 
    19 +----------+
    20 
    21 | count(1) |
    22 
    23 +----------+
    24 
    25 | 2 |
    26 
    27 +----------+

    2、count(col)

      col代表具体的某一列。如果是这种统计方式,那么并不是统计有多少行就返回行数值,而是返回其中非NULL行的行数。例如:

     1 mysql> select count(num1) from t3;
     2 
     3 +-------------+
     4 
     5 | count(num1) |
     6 
     7 +-------------+
     8 
     9 | 5 |
    10 
    11 +-------------+

    3、count(expr)

      expr代表表达式。如果现在要求统计t3表中num1列大于num2列的有多少行,那么下面的查询是错误的:

     1 mysql> select count(num1>num2) from t3;
     2 
     3 +------------------+
     4 
     5 | count(num1>num2) |
     6 
     7 +------------------+
     8 
     9 | 4 |
    10 
    11 +------------------+

      实际上,num1大于num2的只有3行(对于值为NULL的不考虑),但是返回的却是4。实际上这里的“num1>num2”条件并没有起到过滤作用,这需要按下面的两种查询:

     1 mysql> select count(num1>num2 or null) count from t3;
     2 
     3 +-------+
     4 
     5 | count |
     6 
     7 +-------+
     8 
     9 | 3 |
    10 
    11 +-------+
    12 
    13 1 row in set (0.00 sec)
    14 
    15  
    16 
    17 mysql> select count(case when num1>num2 then 1 end) from t3;
    18 
    19 +---------------------------------------+
    20 
    21 | count(case when num1>num2 then 1 end) |
    22 
    23 +---------------------------------------+
    24 
    25 | 3 |
    26 
    27 +---------------------------------------+

      也就是说,你想坚持用“num1>num2”做过滤条件,那么必须在后面加上or null才行,或者就是采用case when语句的方式实现过滤。

      所以这里有点奇怪,直接用count(num1>num2)根本得不到正确结果,目前也不知道为什么就是不行,估计和count()的实现原理有关。

     

     

    总结:

      count(1)和count(*)是最简单基本的用法,就是统计待处理的结果集有多少数据行,也包括空行。

      除了count(1)和count(*)之外的其它任何用法,count()函数在进行统计时都不会考虑NULL

      count(expr)中的expr可以是col1<col2、col>number还可以是子查询和case when语句等等;

      count(expr)中的expr除了是case when语句,其余的都要加or null才能统计出正确的值,即便是子查询也要加or null。

     

    测试于MySQL5.7.14,其实以上都是MySQL的语法基础,但是很长时间没有涉及到,所以一些细节方面的东西都没有记住,多走些弯路。。。。

  • 相关阅读:
    《STL源码剖析》-- 序列式容器
    IPV6 组播学习理解
    C 语言指针 引用学习
    C++ list 源码学习
    汇编基础学习---浮点运算
    C++ 运算符重载
    C++ 迭代器学习
    Play框架连接Mysql遇到的一些问题
    Jython中文乱码问题
    多线程之生产者消费者模式
  • 原文地址:https://www.cnblogs.com/jiang-jt/p/9519663.html
Copyright © 2020-2023  润新知