千家信息网

MySql 中聚合函数增加条件表达式的方法

发表于:2025-02-10 作者:千家信息网编辑
千家信息网最后更新 2025年02月10日,Mysql 与聚合函数在一起时候where条件和having条件的过滤时机where 在聚合之前过滤当一个查询包含了聚合函数及where条件,像这样的情况select max(cid) from t
千家信息网最后更新 2025年02月10日MySql 中聚合函数增加条件表达式的方法

Mysql 与聚合函数在一起时候where条件和having条件的过滤时机

where 在聚合之前过滤

当一个查询包含了聚合函数及where条件,像这样的情况
select max(cid) from t where t.id<999
这时候会先进行过滤,然后再聚合。先过滤出ID《999的记录,再查找最大的cid返回。

having 在聚合之后过滤

having在分组的时候会使用,对分组结果进行过滤,通常里面包含聚合函数。

SELECT ip,MAX(id) FROM appGROUP BY ipHAVING MAX(id)>=5 

先分组,再聚合,然后过滤聚合结果大于等于5的结果集

二者的区别:

where是先执行,然后再执行聚合函数。having是在聚合函数执行完之后再执行。

下面是补充

有个需求,某张表,有个状态字段(1:成功,2:失败,类似这样的),现要用日期分组统计不同状态下的数量

先写了个子查询

select aa.logDate,aa.totalLogs  ,(select count(1) from dxp.dxp_handlermodel where aa.logDate=DATE_FORMAT( startTime, '%Y-%m-%d') and executeStatus=1) pendingLogs ,(select count(1) from dxp.dxp_handlermodel where aa.logDate=DATE_FORMAT( startTime, '%Y-%m-%d') and executeStatus=2) successLogs ,(select count(1) from dxp.dxp_handlermodel where aa.logDate=DATE_FORMAT( startTime, '%Y-%m-%d') and executeStatus=3) errorLogs ,(select count(1) from dxp.dxp_handlermodel where aa.logDate=DATE_FORMAT( startTime, '%Y-%m-%d') and executeStatus=4) callbackErrorLogsfrom( select DATE_FORMAT( a.startTime, '%Y-%m-%d') logDate, count(1) totalLogs from dxp.dxp_handlermodel a  group by DATE_FORMAT( a.startTime, '%Y-%m-%d') ) aa

执行相当慢,想到count中能不能加条件,找了一下,如下:

selectDATE_FORMAT( startTime, '%Y-%m-%d') logDate, count(1) totalLogs, count(if(executeStatus=1,true,null)) pendingLogs, count(if(executeStatus=2,true,null)) successLogs, count(if(executeStatus=3,true,null)) errorLogs, count(if(executeStatus=4,true,null)) callbackErrorLogsfrom dxp.dxp_handlermodelgroup by DATE_FORMAT( startTime, '%Y-%m-%d')

简明易懂,且执行效率非常高

其它的聚合函数也可以用,如SUM等其他聚合函数

实战示例:

select count(if(create_date < '2017-01-01' and host_profile_id = '9294d2bf-f457-4fe5-9a36-e5f832310dc2',true,null)) from profile_visit_log -- 等同于 select count(if(create_date < '2017-01-01',true,null)) count from profile_visit_log where host_profile_id = '9294d2bf-f457-4fe5-9a36-e5f832310dc2'

好了这篇文章就介绍到这,希望大家以后多多支持。

函数 条件 分组 结果 时候 状态 查询 不同 最大 简明 成功 个子 字段 实战 情况 效率 数量 日期 时机 易懂 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 昆明网络安全教育讲座 接口机能提高网络安全吗 英雄联盟哪个服务器价格低 微信程序有多少台服务器 农业农村局网络安全应急响应小组 考研考数据库与数据挖掘 云厂商数据库数据丢失 全国网络安全公司实力排名 栖霞区常规软件开发专业服务 网络技术实训成果 web服务器监听端口实习 数据库增加数据步骤 软件开发需要材料费吗 腾讯会议用什么网络技术 数据库管理系统中数据存储在哪里 虚拟仪器软件开发平台有哪些 时间序列数据库是什么 adb手机清空数据库 饥荒 正在启动服务器 显示数据库创建的目录位置 我的世界国际版定位服务器进不去 朝阳区咨询软件开发大概费用 英雄联盟服务器谁负责 管理网络安全性在哪设置 宝山区原则网络技术服务市价 软件开发归档 贵州省国产大数据库 网络安全高级工程师怎么考 湛江pc软件开发定制 信息技术处理员考试数据库题
0