肥仔问题杂记--MySql中COUNT(XXX OR NULL)

肥仔问题杂记–MySql中COUNT(XXX OR NULL)

经常看见有人在代码中写出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 就报错了->__->.
在这里插入图片描述

原文 http://blog.csdn.net/sfzman01/article/details/47145195

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值