mysql中if函数的正确使用姿势
——为了今天要写的内容,运行了将近7个小时的程序,在数据库中存储了1千万条数据。——
今天要说的是mysql数据库的IF()函数的一个实例。
具体场景如下,
先看看表结构:
CREATE TABLE `message` (
`id` varchar(30) NOT NULL,
`title` varchar(30) DEFAULT NULL,
`content` text,
`send_time` datetime DEFAULT NULL,
`type` int(1) DEFAULT NULL COMMENT '1:系统通知,2:投诉建议',
`status` int(1) DEFAULT NULL COMMENT '0:待发送,1:成功,2:失败',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
具体要求是:分别统计系统通知和投诉建议两种消息的总条数、成功条数和失败条数。
遇到这样的问题,我们一般的思路就是用type分组,分别查询系统通知和投诉建议的总条数,然后用两个子查询来统计成功条数和失败条数。sql如下:
SELECT
COUNT(1) total,
m.type,
(SELECT
COUNT(1)
FROM message ms
WHERE ms.status = 1
AND m.type = ms.type) successtotal,
(SELECT
COUNT(1)
FROM message mf
WHERE mf.status = 1
AND m.type = mf.type) failtotal
FROM message m
GROUP BY m.type
我们看看运行时间,统计1千万条数据大概需要6分18秒。
那么有没有更简单,更快的统计方式呢,当然是有的,就是我们今天主要讲的if()函数。
基本语法
IF(expr1,expr2,expr3),如果expr1的值为true,则返回expr2的值,如果expr1的值为false,则返回expr3的值。就是一个简单的三目表达式。
如何做
说说思路,假如我们统计成功条数,我们可以这样写if(status=1,1,0),这样如果status==1,则返回1,否则返回0。然后我们通过SUM()函数将成功条数相加即可。
实现方式
sql语句如下:
SELECT
COUNT(1) total,
m.type,
SUM(IF(m.status = 1,1,0)) successtotal,
SUM(IF(m.status != 1,1,0)) failtotal
FROM message m
GROUP BY m.type;
看着是不是比上面的子查询简洁多了,我们来看看运行时间,只有1分30秒。是不是快多了。
那么,今天你学会了吗?
如果文章对您有帮助,请记得点赞关注哟~
欢迎大家关注我的公众号<情系IT>,每日技术推送文章供大家学习参考。
mysql中if函数的正确使用姿势的更多相关文章
- NET MVC全局异常处理(一) 【转载】网站遭遇DDoS攻击怎么办 使用 HttpRequester 更方便的发起 HTTP 请求 C#文件流。 Url的Base64编码以及解码 C#计算字符串长度,汉字算两个字符 2019周笔记(2.18-2.23) Mysql语句中当前时间不能直接使用C#中的Date.Now传输 Mysql中Count函数的正确使用
NET MVC全局异常处理(一) 目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关 ...
- Mysql中Count函数的正确使用
备注: 直接使用Count(*)或Count(1)这些大家基本都会,主要是Count函数还可以加满足表达式的统计:express 关于Count函数表达式的用法,目前个人只知道2种: a:使用:Cou ...
- mysql中now()函数的使用,还有oracle的sysdate,可能埋下的坑
mysql中now()函数的使用,还有oracle的sysdate 在需求中如果系统中药添加当前操作的时间那么很简单的一个操作在写sql的时候直接在这个字段对应的位置写上now()函数就可以了,这样就 ...
- MySQL中concat函数(连接字符串)
MySQL中concat函数使用方法:CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意:如果所有参数均为非二进制字符串 ...
- Mysql中的函数
什么是函数 mysql中的函数与存储过程类似,都是一组SQL集: 与存储过程的区别 函数可以return值,存储过程不能直接return,但是有输出参数可以输出多个返回值: 函数可以嵌入到sql语句中 ...
- MySQL中concat函数
MySQL中concat函数使用方法:CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意:如果所有参数均为非二进制字符串 ...
- mysql中INSTR函数的用法
mysql中INSTR函数的用法 INSTR(字段名, 字符串) 这个函数返回字符串在某一个字段的内容中的位置, 没有找到字符串返回0,否则返回位置(从1开始) SELECT * FROM tblTo ...
- MySQL中group_concat函数-和group by配合使用
MySQL中group_concat函数 完整的语法如下: group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔 ...
- MySQL中时间函数NOW()和SYSDATE()的区别
mysql中日期函数还是比较常用的.主要有NOW()和SYSDATE()两种,虽然都表示当前时间,但使用上有一点点区别. NOW()取的是语句开始执行的时间,SYSDATE()取的是动态的实时时间. ...
随机推荐
- 基于Docker搭建大数据集群(一)Docker环境部署
本篇文章是基于Docker搭建大数据集群系列的开篇之作 主要内容 docker搭建 docker部署CentOS 容器免密钥通信 容器保存成镜像 docker镜像发布 环境 Linux 7.6 一.D ...
- 读《深入理解Elasticsearch》点滴-Elastic HQ监控工具
1.多节点监控 2.类似war功能部署,tomcat即可使用 3.免费 4.ElasticHQ supports all major version of Elasticsearch from ver ...
- 使用Java元注解和反射实现简单MVC框架
Springmvc的核心是DispatcherServlet来进行各种请求的拦截,进而进行后续的各种转发处理.流程图如下: 说明:客户端发出一个http请求给web服务器,web服务器对http请求进 ...
- springboot 集成Redis一主二从三哨兵
1.Centos7 Redis一主二从三哨兵配置 Redis一主二从三哨兵环境搭建 2.接入过程 与集成redis单机不同的是jedis相关的配置做了修改,JedisPool换成了JedisSenti ...
- .Net Core自动化部署系列(二):使用Jenkins打造镜像发布流水线
一.简介 之前写过一篇关于Jenkins搭配GitLab实现.net core项目自动发布到IIS的博文,比较简单哈,只是个Demo.本篇我们将会使用Jenkins搭配GitLab实现镜像的自动打包和 ...
- 在github上部署第二个repository
想在github上保存一些平时写的测试程序,所以就建立了一个repository:https://github.com/commshare/testProgram 建立好之后,怎么把本地的代码上传呢. ...
- MongoDB安装过程中出现service MongoDB failed to start,verify that you have sufficient privileges to start...
win10系统下,安装MongoDB 64位, service MongoDB failed to start,verify that you have sufficient privileges t ...
- navicat安装及其简单使用
一.安装 下载地址:https://pan.baidu.com/s/1bpo5mqj 下载完之后,直接解压出来就能用,看一下解压之后的目录: 双击打开下面这个文件(可以把它添加一个桌面快捷方式,或者添 ...
- 文件操作——RandomAccessFile
文件操作——RandomAccessFile 构建RandomAccessFileJava提供了一个可以对文件随机访问的操作,访问包括读和写操作.该类名为RandomAccessFile.该类的读 ...
- document.body.scrollTop等常见易混淆属性整理
网页可见区域宽: document.body.clientWidth; 网页可见区域宽: document.body.offsetWidth (包括边线的宽); 网页可见区域高: do ...