mysql count函数 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 就报错了->__->.
操作数一
操作
操作数二
结果
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)相关推荐
- python的count函数_python中count函数的用法详解
python中count函数的用法 count()函数 描述:统计字符串里某个字符出现的次数,可以选择字符串索引的起始位置和结束位置. 语法:str.count("char", s ...
- matlab中的count函数,Excel 中COUNT函数的使用详解,详情介绍
COUNT在英文上是"统计"的意思,在数学上是"计数"的意思.下面,我们来看看Excel中COUNT函数怎么用吧. 操作方法 01 随便输入数字 在Excel中 ...
- mysql not in null_MySQL中NOTIN语句对NULL值的处理
顺便提一下MySQL中正则表达式匹配的简单使用:SELECT COUNT(alarmID)FROM AlarmWHERE (CVE NOT RLIKE mysql> SELECT COUNT(n ...
- mysql pmt函数,Mybatis中Oracle和Mysql的Count字段问题
Mybatis中Oracle和Mysql的Count字段问题 我们在进行项目开发时经常会碰到查询总数的问题,所以我们直接是用select count(1) from table来进行查询.那么在Myb ...
- MySQL COUNT函数优化及count(1)/count(*)/count(列名)的区别
count函数优化 使用近似值: 在某些应用场景中,不需要完全精确的值,可以参考使用近似值来代替,比如可以使用explain来获取近似的值.其实在很多OLAP的应用中,需要计算某一个列值的基数,有一个 ...
- python函数count_python中count函数知识点浅析
python中,count函数的作用是进行python中的数量计算.count函数用于统计字符串.列表或元祖中某个字符出现的次数,是一个很好用的统计函数.具体介绍请看本文. 1.count函数 统计列 ...
- count函数_计数函数Count、Counta、Countblank、Countif、Countifs技巧解读
计数,也是实际工作中经常遇到的问题,那么,如果有效快捷的进行计数操作?于此同时,我们必须掌握那些函数公式--本节将逐一展开讨论. 一.Counta函数:统计非空单元格的个数.语法:=Counta(值或 ...
- Oracle count函数原理,oracle count函数
用来返回查询的行数. 当指定distinct时,不能接order_by_clause: 如果指定表达式,count返回表达式不为空的值: 当指定*号时,它返回所有行,含重复行和空值.count从不返回 ...
- c语言count函数的作用,count通达信什么意思,count是啥意思
Q1:count是啥意思 count [kaunt] vt. 1. 数,点数: She was counting her money. 她正在数她的钱. 2. 计算,算出: They are coun ...
- python count函数代码_python count函数用法详解_后端开发
fgetc函数的作用详解_后端开发 fgetc函数的作用是从指定文件读入一个字符,要求文件的打开方式必须是以读或读写的方式或者追加的方 式,只写方式是不能读的. 在python中可以使用"c ...
最新文章
- DD3D:基于预训练的单目3D目标检测
- 1020. Tree Traversals (25)
- HDU 4418 高斯消元法求概率DP
- angularjsl路由_AngularJS路由和模板
- linux kill命令详解
- leetcode1039. 多边形三角剖分的最低得分(动态规划)
- 取英文名字的几个规则
- linux rsh(remote shell) 命令详解
- No package ‘libmatekbd‘ found
- 【Java web 项目】医院药品管理系统
- HRCAD2008 无法加载问题
- 2020年第4季度OKR个人总结
- 差分数组(简单易懂)
- error An unexpected error occurred: “https://registry.npmjs.org/axios
- 大数据繁荣生态圈组件之实时大数据Druid小传(三)Druid入门实操
- 2019苹果全球开发者大会:起售价5999美元,史上最强大Mac电脑发布
- 24种中文一流核心期刊
- 电涡流传感器线性灵敏度
- 方韦——鸦滩的小方韦
- HTG评论Amped无线TAP-EX Wi-Fi扩展器:2.4Ghz频段的强大功能
热门文章
- 45个小众而实用的NLP开源字典和工具
- 8月第2周基金排行榜 | TokenInsight
- 路由器管理页面html,路由器的管理登陆页面【入口地址】
- 关于Gstreamer出现“Could not send sticky events”的机制探究
- RSA算法详解与练习
- 【基础知识】Dom基础
- org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned f
- python mongdb 和 mysql简单使用
- java话费充值_手机话费充值-java示例
- 用迅雷打开php文件,迅雷下的php文件怎么打开啊?