mysql count in_MySQL的count函数注意点

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

1 mysql> select * fromt3;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) fromt3;2

3 +----------+

4

5 | count(1) |

6

7 +----------+

8

9 | 7 |

10

11 +----------+

12

13 1 row in set (0.00sec)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) fromt3;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) fromt3;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 fromt3;2

3 +-------+

4

5 | count |

6

7 +-------+

8

9 | 3 |

10

11 +-------+

12

13 1 row in set (0.00sec)14

15

16

17 mysql> select count(case when num1>num2 then 1 end) fromt3;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可以是col1number还可以是子查询和case when语句等等;

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值