mysql其他查询:统计函数,case-when-then,多表差集查询
参考:
http://c.biancheng.net/mysql/function/(编程网:MySQL函数大全)
https://www.cnblogs.com/lazyInsects/p/8006388.html(mysql统计数据)
https://www.cnblogs.com/poloyy/p/12890763.html(常用函数汇总)
时间查询
#查询2小时前的数据 select * from tableName WHERE create_time < DATE_SUB(NOW(), INTERVAL 2 HOUR) #7天前 SELECT count(id) FROM rd_track_info WHERE DATE(create_time) < DATE_SUB(CURDATE(), INTERVAL 7 DAY);
统计数据
/*按天统计*/ SELECT count(id) countNum, DATE(create_time) createTime FROM rd_track_info GROUP BY DATE(create_time) ORDER BY DATE(create_time) DESC; /*按周统计*/ SELECT count(id) countNum, WEEK(create_time) createTime FROM rd_track_info GROUP BY WEEK(create_time) ORDER BY WEEK(create_time) DESC; /*按月统计*/ SELECT count(id) countNum, MONTH(create_time) createTime FROM rd_track_info GROUP BY MONTH(create_time) ORDER BY MONTH(create_time) DESC; /*按季度统计*/ SELECT count(id) countNum, QUARTER(create_time) createTime FROM rd_track_info GROUP BY QUARTER(create_time) ORDER BY QUARTER(create_time) DESC; /*按年统计*/ SELECT count(id) countNum, YEAR(create_time) createTime FROM rd_track_info GROUP BY YEAR(create_time) ORDER BY YEAR(create_time) DESC;
case-when-then:可以整理结果字段
基本用法
#简单case函数 case sex when '1' then '男' when '2' then '女’ else '其他' end #或 case when sex = '1' then '男' when sex = '2' then '女' else '其他' end #和if else逻辑类似,命中后其他分支不会继续 #实际用法 select u.id,u.name,u.sex, (case u.sex when 1 then '男' when 2 then '女' else '空的' end )性别 from users u;
结合聚合函数
select sum(case u.sex when 1 then 1 else 0 end)男性, sum(case u.sex when 2 then 1 else 0 end)女性, sum(case when u.sex <>1 and u.sex<>2 then 1 else 0 end)性别为空 from users u; select count(case when u.sex=1 then 1 end)男性, count(case when u.sex=2 then 1 end)女, count(case when u.sex <>1 and u.sex<>2 then 1 end)性别为空 from users u;
某值在表A中不在表B中的查询
A、B两表,找出ID字段中,存在A表,但是不存在B表的数据。A表总共13w数据,去重后大约3W条数据,B表有2W条数据,且B表的ID字段有索引。
方法一:子查询_无相关性
使用 not in ,容易理解,效率低 ~执行时间为:1.395秒~
select distinct A.ID from A where A.ID not in (select ID from B)
方法二:连接
使用 left join...on... , "B.ID isnull" 表示左连接之后在B.ID 字段为 null的记录 ~执行时间:0.739秒~
select A.ID from A left join B on A.ID=B.ID where B.ID is null
方法三:子查询_有相关性
逻辑相对复杂,但是速度最快 ~执行时间: 0.570秒~
select * from A where (select count(1) as num from B where A.ID = B.ID) = 0
分类:
mysql
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?