当前位置: 首页 > news >正文

sql函数总结(成绩在于平时,成功在于积累)最终版

1、有时间了总结一下,下面每个函数的应用,每个函数的应用可以举一反三。

1.1、datediff(只支持天)与timestampdiff(支持任何单位)
1.2、curdate,curtime,date(提取年月日),time(提取时分秒)

核心要点(一句话总结每个函数)

  1. CURDATE():无参,拿当前日期
  2. CURTIME():无参,拿当前时间
  3. DATE(值):带参,提日期
  4. TIME(值):带参,提时间

date_sub(时间,interval1 day)--实现一个连续登录的sql-与豆包讨论,date_add。()

同理:
1.3、subdate与adddate
1.4、str_to_date 与 date_formate

总结

  1. DATE_SUB通用且推荐的写法,语义清晰、全场景支持,适合所有开发场景;
  2. SUBDATE仅作为DATE_SUB的简写存在,仅在 “减天数” 的极简场景下有一点点便捷性,通用性远不如DATE_SUB
  3. 实际开发中优先用DATE_SUB,避免用SUBDATE(尤其是极简写法),提升代码可读性和可维护性。

--- ==================================

2、in 与 not in的用法

2.1、select * from ry1 where grade in (SELECT usint FROM `ry1`);

2.1、用exists去实现:select * from ry1 rs where EXISTS (SELECT * FROM `ry1` r where r.usint = rs.grade );

-- 用not in 的时候一定要把子查询里面的数据做判断,把字段值是null剔除。不然查询结果为空
2.2、select * from ry1 where grade not in (SELECT usint FROM `ry1` where usint is not null)

2.2、用not exists去实现:select * from ry1 rs where not EXISTS (SELECT * FROM `ry1` r where r.usint = rs.grade );

场景选择建议

  1. 子查询结果集较大,且内外层表有明确关联条件时,优先使用EXISTS(性能更优)。
  2. 子查询结果集较小,且无明确关联条件时,可使用IN(语法更简洁)。
  3. 如需判断 “不存在”,优先使用NOT EXISTS,而非NOT INNOT IN对 NULL 敏感,易出问题)。

------------------------------------------------------------------------------------------------------20260306

用户连续登录的问题:

-- 创建用户登录表(含注释,便于理解) CREATE TABLE IF NOT EXISTS user_login ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', user_id INT NOT NULL COMMENT '用户ID', login_time DATETIME NOT NULL COMMENT '登录时间', -- 可选:添加唯一索引,避免同一用户同一秒重复记录(根据业务需求决定) UNIQUE KEY idx_user_time (user_id, login_time) ) COMMENT = '用户登录记录表';
-- 清空表(测试用,正式环境注释掉) TRUNCATE TABLE user_login; -- 插入测试数据 INSERT INTO user_login (user_id, login_time) VALUES -- 用户1:连续登录5天(2026-03-01 至 2026-03-05) (1, '2026-03-04 10:01:00'), (1, '2026-03-05 19:33:22'), -- 用户2:间断登录(3.01-3.02连续,3.04-3.05连续,中间3.03未登录) (2, '2026-03-01 07:55:00'), (2, '2026-03-02 11:20:30'), (2, '2026-03-04 15:18:40'), (2, '2026-03-05 20:00:00'), -- 用户3:仅登录1次 (3, '2026-03-03 12:00:00'), -- 用户4:连续登录2天,之后隔1天又登录1天 (4, '2026-03-01 08:00:00'), (4, '2026-03-02 08:00:00'), (4, '2026-03-04 08:00:00'), -- 用户5:同一天多次登录(仅算1天连续) (5, '2026-03-01 09:00:00'), (5, '2026-03-01 14:00:00'), (5, '2026-03-02 10:00:00');

解答:

select ub.user_id,min(ub.login_time),max(ub.login_time),ub.c_num from( select *, DATE_SUB(u.d_t,INTERVAL u.rn day) d_s, count(*) over(PARTITION by u.user_id,DATE_SUB(u.d_t,INTERVAL u.rn day)) c_num from( select *,date(login_time) d_t, row_number() over(PARTITION by user_id order by login_time) rn from user_login)u)ub where ub.c_num =( select max(uw.c_num) from( select u.user_id, DATE_SUB(u.d_t,INTERVAL u.rn day) d_s, count(*) over(PARTITION by u.user_id,DATE_SUB(u.d_t,INTERVAL u.rn day)) c_num from( select user_id,date(login_time) d_t, row_number() over(PARTITION by user_id order by login_time) rn from user_login)u)uw) GROUP BY ub.user_id 解释思路: 1、生成一个row_number() over() 窗户函数字段,根据用户分组,对时间排序。 2、用date_sub() 时间函数,把登录时间 减去 生成的row_number()字段数字,INTERVAL row_number数字 day 3、再次通过窗户函数对用户id,减去后的时间,同时分组。就能得出最大的连续登录数。 4、得出最大登录天数,就可以利用这个数字作为条件,或子查询的结果。反复嵌套,就可以查询出来,哪些用户,连续登录的天数。 5、最后对用户分组,就可以求出 min(time),max(time)。看上面示例

方法2、

SELECT user_id, MIN(login_date) 最小登录日期, MAX(login_date) 最大登录日期, COUNT(*) 最大连续天数 FROM (SELECT user_id, DATE(login_time) login_date, DATE_SUB(DATE(login_time), INTERVAL ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY DATE(login_time)) DAY) group_flag FROM (SELECT DISTINCT user_id, login_time FROM user_login) t1) t2 GROUP BY user_id, group_flag HAVING COUNT(*) = (SELECT MAX(cnt) FROM (SELECT COUNT(*) cnt FROM (SELECT user_id, DATE(login_time) login_date, DATE_SUB(DATE(login_time), INTERVAL ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY DATE(login_time)) DAY) group_flag FROM (SELECT DISTINCT user_id, login_time FROM user_login) t1) t2 GROUP BY user_id, group_flag) t3) ORDER BY user_id;

1、SQL 18 题(相对复杂)

https://www.doubao.com/thread/a49c6d42a3183https://www.doubao.com/thread/a49c6d42a3183

http://www.jsqmd.com/news/478357/

相关文章:

  • Yi-9B 200K超长上下文实测:处理40万字文本的终极方案
  • Stable Diffusion XL 1.0开源大模型部署:灵感画廊GPU显存优化方案
  • Qwen3-4B-Thinking-GGUF高性能部署:vLLM张量并行+PagedAttention显存优化详解
  • FlexLayout核心功能全解析:百分比布局与视图引用的终极指南
  • 如何让Flashlight插件完美支持不同macOS版本:完整兼容性指南
  • Git入门实战指南:从零开始掌握版本控制核心
  • AnimateDiff企业级部署:中小企业低成本GPU算力下的AI视频生产方案
  • Z-Image-Turbo-辉夜巫女完整指南:开源可部署+GPU显存优化+Gradio开箱即用
  • IPED数据恢复文件分类:自动将恢复文件按类型组织
  • Starry Night Art Gallery效果展示:手绘草图→精细油画转换案例
  • OpenTelemetry Operator配置详解:自定义Collector管道与资源优化技巧
  • Swin2SR部署教程:阿里云PAI-EAS平台一键部署Swin2SR在线API服务
  • C++游戏开发之旅 32
  • ubuntu 20.04 搭建 ProcDump
  • mmdetection模型压缩量化工具:MMDeploy使用指南
  • Colobot: Gold Edition完全指南:探索这款革命性编程机器人游戏的魅力
  • HY-Motion 1.0一文详解:DiT与流匹配在动作生成中的协同机制
  • bench-scripts完全指南:Linux服务器性能测试工具终极合集
  • Botpress集成指南:连接Slack、Notion等30+平台的实用技巧
  • ClawdBot开源镜像解析:300MB内含Whisper+PaddleOCR+Qwen3
  • Composer Installers支持的70+框架大盘点:总有一款适合你
  • Bidili Generator镜像部署:免conda/pip手动安装的一键Docker方案
  • pydata-book正则表达式应用:文本数据清洗与模式匹配技巧
  • PyTorch 2.9实战应用:图像分类任务快速部署完整流程
  • 3.顺序结构
  • PyCaret自动化机器学习:自定义评估指标完全指南
  • 比迪丽SDXL提示词工程:主体+风格+质量+细节四层结构拆解与示例
  • 计算机毕业设计springboot基于云服务的在线教育平台 基于SpringBoot的云端智慧教学服务平台设计与实现 基于云计算技术的在线学习资源管理系统开发
  • SOONet GPU显存优化教程:启用torch.compile+FlashAttention降低峰值内存31%
  • 最完整Stanford Alpaca训练指南:从环境搭建到模型微调全流程