经常看见有人在代码中写出SELECT COUNT(XXX OR NULL) FROM XXX, 这样的sql语句. 撇开性能不谈, 咱先来看看, 这个所谓的COUNT(XXX OR NULL)到底是个什么鬼.

假设我们有一张名为employee的员工表, 该表共有两个字段, id和gender(性别). 其中我们约定, 当gender=1时表示该员工性别为男, gender=2时该员工性别为女(在数据库设计中建议大家多使用约定而不要使用枚举类型). 此时, 我们业务需要统计男员工的数量, 一般人都会写出这样的SQL语句来达到目的: SELECT COUNT(*) FROM employee WHERE gender = 1. 当然也有一些”大牛”喜欢用这样的SQL语句: SELECT COUNT(gender = 1 OR NULL) FROM employee. 首先, 要肯定的一点是, 这两种处理方式都可以达到统计男员工的目的. 但是关于后一种表达很多人就搞不明白了, 为什么不是SELECT COUNT(gender = 1) FROM employee, 而是要多加个OR NULL呢? 如果你在数据库里实际测试一下就会发现, SELECT COUNT(gender = 1) FROM employee返回的总是员工的总人数而不是男员工的人数.

其实, COUNT这个函数其中传入的参数只要不是null, 都会造成最终结果+1. 很多人都误以为, count是用来统计行数的, 这种说法只说对了一半. count有两个作用一个是统计行数不错(e. g count(*)的用法) , 还有一个就是统计列值. 在统计列值时要求列值是非空的(不统计null). 如果在count()的括号里指定了列值或列值的表达式, 则统计的是这个表达式有值的结果数. 所以, , 现在就能看出为什么SELECT COUNT(gender = 1) FROM employee是错误的了吧? 因为无论gender的值是1还是2, gender = 1这个表达式总有值, 1= 1是1, 2 = 1是0, 在怎么也不肯能是null吧! 所以以上语句总返回员工的总人数, 而不是你想要的男员工的数量.

可能到这里还没有能完全解决你的疑惑, 因为你现在只知道为啥gender = 1不可以达到目的, 却可能还是搞不明白为什么gender = 1 OR NULL就可以达到目的, 对吧? 我想大部分有疑惑的人可能并没有理解 gender = 1 OR NULL 这个表达式的意思, 如果我把它改写下你或许就明白了: (gender = 1) OR NULL, 而很多人其实误以为是这样的gender = 1 OR gender IS NULL. 亲, 这可是两个完全不同的表达式啊!!!! 第二个表达式不用我多说了, 当gender为1时, 整个表达式为1, 当gender为2时, 整个表达式为0. 第一个表达式其实也很容易看啊, 当gender为1时, gender = 1 OR NULL —–> 1=1 OR NULL —-> 1 OR NULL —-> 1, 当gender为2时, gender = 1 OR NULL —–> 2 = 1 OR NULL —-> 0 OR NULL —-> NULL. 可能做后台(尤其是用java的…)的同学, 就纳闷了为什么0或null就是null呢? 其实你要是了解过一点JavaScript这种弱类型的语言就不奇怪了null也是可以做逻辑运算的, 不像java里null || false 就报错了->__->.

操作数一

操作

操作数二

结果

0

OR

null

null

1

OR

null

1

null

OR

null

null

0

AND

null

0

1

AND

null

null

null

AND

null

null

如果不确定可以通过SQL语句select (0 or null) from dual试一下就行.

咱们再来看看COUNT(XXX OR NULL)性能方面的问题. 就刚刚那个例子, 咱们就只讨论已经在gender上建立过btree索引了哈, 没有索引情况下, 当然是扫全表啦(innodb没改过源码情况下, 强迫症多啰嗦一下). 现在explain一下该语句 explain SELECT COUNT(gender = 1 OR NULL) FROM employee.

id

select_type

table

type

1

SIMPLE

employee

index

从type不难看出, 扫了一遍索引, 性能相当差. rows字段应该就是你数据总记录条数(这里因每个库数据量不同, rows也会不同, 这里不贴出来做参考了, 应该就是等于数据库条目总量).

再来看看 SELECT COUNT(*) FROM employee WHERE gender = 1这个普通的sql语句,

id

select_type

table

type

1

SIMPLE

employee

ref

type是ref, 不用我多说了吧~, 性能完爆第一条啊, 用膝盖想想就知道, 第二种SQL语句遍历的条目少啊, 因为mysql会先通过where后面的条件利用索引找到符合的条目, 再传入count函数操作, 而不是直接遍历整个索引再去代入count中的表达式, 这应该很容易想通的把~.

但是我们应该全盘否定COUNT(XXX OR NULL)这样的写法么? 不是的, 比如现在我有这样的一个需求, 既要统计男员工的数量也要统计女员工的数量, 怎么办呢? 最简单的办法当然是查询两边数据库啦, 不过我们哪会用这么low 的办法呢. 当然是写在一条SQL语句里, 让数据库一次就统计完成, 性能就不会损耗在多次数据库连接上了.

SELECT COUNT(gender = 1 OR NULL) AS male, COUNT(gender = 2 OR NULL) AS female FROM employee

当然这也不是绝对快的, 如果你用的数据库存储引擎是MyISAM, 类似select count(*) from XXX 的SQL语句其实是一步到位的(前提是没有where语句), 这是某些存储引擎特性. 所以有时候查两次数据库会比一次完成的SQL语句还要快哦! 还有一点需要点一下, 当你的业务中真涉及到类似的需求, 建议每次都写上where 语句限定遍历的条目, 比如这里最好写成

SELECT COUNT(gender = 1 OR NULL) AS male, COUNT(gender = 2 OR NULL) AS female FROM employee WHEHE gender IN (1,2)

当然在这里这个where语句就是画蛇添足了, 因为世界上除了男人就是女人(强迫症再多说一句, 还有性染色体为XXY的人…), 哪还有第三种性别啊?

不过还是建议养成习惯把它写上.

题外吐槽: 不知道为什么身边总有那些伪”大牛”总是写一些看似高深莫测, 实则其烂无比的代码, 网上看来的伎俩一知半解, 生搬硬套的使用在自己的项目中, 真真是贻笑大方!

mysql count函数 null_MySql中COUNT(XXX OR NULL)相关推荐

  1. python的count函数_python中count函数的用法详解

    python中count函数的用法 count()函数 描述:统计字符串里某个字符出现的次数,可以选择字符串索引的起始位置和结束位置. 语法:str.count("char", s ...

  2. matlab中的count函数,Excel 中COUNT函数的使用详解,详情介绍

    COUNT在英文上是"统计"的意思,在数学上是"计数"的意思.下面,我们来看看Excel中COUNT函数怎么用吧. 操作方法 01 随便输入数字 在Excel中 ...

  3. mysql not in null_MySQL中NOTIN语句对NULL值的处理

    顺便提一下MySQL中正则表达式匹配的简单使用:SELECT COUNT(alarmID)FROM AlarmWHERE (CVE NOT RLIKE mysql> SELECT COUNT(n ...

  4. mysql pmt函数,Mybatis中Oracle和Mysql的Count字段问题

    Mybatis中Oracle和Mysql的Count字段问题 我们在进行项目开发时经常会碰到查询总数的问题,所以我们直接是用select count(1) from table来进行查询.那么在Myb ...

  5. MySQL COUNT函数优化及count(1)/count(*)/count(列名)的区别

    count函数优化 使用近似值: 在某些应用场景中,不需要完全精确的值,可以参考使用近似值来代替,比如可以使用explain来获取近似的值.其实在很多OLAP的应用中,需要计算某一个列值的基数,有一个 ...

  6. python函数count_python中count函数知识点浅析

    python中,count函数的作用是进行python中的数量计算.count函数用于统计字符串.列表或元祖中某个字符出现的次数,是一个很好用的统计函数.具体介绍请看本文. 1.count函数 统计列 ...

  7. count函数_计数函数Count、Counta、Countblank、Countif、Countifs技巧解读

    计数,也是实际工作中经常遇到的问题,那么,如果有效快捷的进行计数操作?于此同时,我们必须掌握那些函数公式--本节将逐一展开讨论. 一.Counta函数:统计非空单元格的个数.语法:=Counta(值或 ...

  8. Oracle count函数原理,oracle count函数

    用来返回查询的行数. 当指定distinct时,不能接order_by_clause: 如果指定表达式,count返回表达式不为空的值: 当指定*号时,它返回所有行,含重复行和空值.count从不返回 ...

  9. c语言count函数的作用,count通达信什么意思,count是啥意思

    Q1:count是啥意思 count [kaunt] vt. 1. 数,点数: She was counting her money. 她正在数她的钱. 2. 计算,算出: They are coun ...

  10. python count函数代码_python count函数用法详解_后端开发

    fgetc函数的作用详解_后端开发 fgetc函数的作用是从指定文件读入一个字符,要求文件的打开方式必须是以读或读写的方式或者追加的方 式,只写方式是不能读的. 在python中可以使用"c ...

最新文章

  1. DD3D:基于预训练的单目3D目标检测
  2. 1020. Tree Traversals (25)
  3. HDU 4418 高斯消元法求概率DP
  4. angularjsl路由_AngularJS路由和模板
  5. linux kill命令详解
  6. leetcode1039. 多边形三角剖分的最低得分(动态规划)
  7. 取英文名字的几个规则
  8. linux rsh(remote shell) 命令详解
  9. No package ‘libmatekbd‘ found
  10. 【Java web 项目】医院药品管理系统
  11. HRCAD2008 无法加载问题
  12. 2020年第4季度OKR个人总结
  13. 差分数组(简单易懂)
  14. error An unexpected error occurred: “https://registry.npmjs.org/axios
  15. 大数据繁荣生态圈组件之实时大数据Druid小传(三)Druid入门实操
  16. 2019苹果全球开发者大会:起售价5999美元,史上最强大Mac电脑发布
  17. 24种中文一流核心期刊
  18. 电涡流传感器线性灵敏度
  19. 方韦——鸦滩的小方韦
  20. HTG评论Amped无线TAP-EX Wi-Fi扩展器:2.4Ghz频段的强大功能

热门文章

  1. 45个小众而实用的NLP开源字典和工具
  2. 8月第2周基金排行榜 | TokenInsight
  3. 路由器管理页面html,路由器的管理登陆页面【入口地址】
  4. 关于Gstreamer出现“Could not send sticky events”的机制探究
  5. RSA算法详解与练习
  6. 【基础知识】Dom基础
  7. org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned f
  8. python mongdb 和 mysql简单使用
  9. java话费充值_手机话费充值-java示例
  10. 用迅雷打开php文件,迅雷下的php文件怎么打开啊?