Node系列 · 数据库:函数和分组

发布时间:2026/10/30 6:37:20

Node系列 · 数据库:函数和分组 Node系列 · 数据库函数和分组SQL 函数是把数据加工成需要的结果的关键工具。本章按数学 / 聚合 / 字符 / 日期分类讲解内置函数再讲自定义函数的创建与限制最后回到 GROUP BY HAVING 实战。一、SQL 函数分类类别处理对象典型函数数学函数数字ROUND/CEIL/FLOOR/ABS/MOD/RAND聚合函数一组行COUNT/SUM/AVG/MAX/MIN字符函数字符串CONCAT/SUBSTRING/LENGTH/UPPER/LOWER/TRIM/REPLACE日期函数时间NOW/CURDATE/DATE_FORMAT/DATEDIFF/DATE_ADD条件函数表达式IF/CASE/IFNULL/COALESCE类型转换任意CAST/CONVERT二、数学函数SELECT ROUND(3.14159, 2), -- 3.14 四舍五入2 位小数 CEIL(3.14), -- 4 向上取整 FLOOR(3.99), -- 3 向下取整 ABS(-10), -- 10 绝对值 MOD(10, 3), -- 1 取模10 % 3 RAND(), -- 0.xxxxx 随机数 [0, 1) POW(2, 10), -- 1024 幂 SQRT(16); -- 4 平方根三、聚合函数聚合函数上一章已讲过补充几个常见用法-- COUNT(*) vs COUNT(col) vs COUNT(DISTINCT col) SELECT COUNT(*) AS 总行数, COUNT(phone) AS 有手机号的行数, COUNT(DISTINCT class_id) AS 班级去重数 FROM student; -- 聚合同时算多指标 SELECT COUNT(*) AS 人数, SUM(score) AS 总分, AVG(score) AS 平均分, MAX(score) AS 最高分, MIN(score) AS 最低分 FROM score WHERE subject 数学;四、字符函数SELECT CONCAT(张, 三), -- 张三 拼接 CONCAT_WS(-, 2024, 01, 15), -- 2024-01-15 带分隔符 SUBSTRING(Hello World, 1, 5), -- Hello 截取 LENGTH(张三), -- 6UTF-8 占 3 字节 × 2 CHAR_LENGTH(张三), -- 2 字符数 UPPER(hello), -- HELLO LOWER(WORLD), -- world TRIM( hello ), -- hello 去首尾空格 REPLACE(hello world, world, Node), -- hello Node LEFT(hello, 3), -- hel 左取 RIGHT(hello, 3); -- llo 右取::: warningLENGTH()返回字节数UTF-8 中文 3 字节CHAR_LENGTH()返回字符数。涉及中文长度的逻辑一定用CHAR_LENGTH。:::五、日期函数SELECT NOW(), -- 当前时间含时分秒 CURDATE(), -- 当前日期 CURTIME(), -- 当前时间 DATE_FORMAT(NOW(), %Y-%m-%d %H:%i:%s), -- 2024-08-15 14:30:00 DATE_FORMAT(NOW(), %Y年%m月%d日), -- 2024年08月15日 DATEDIFF(2024-12-31, 2024-01-01), -- 335 日期差天 DATE_ADD(2024-01-01, INTERVAL 30 DAY), -- 2024-01-31 加 30 天 DATE_SUB(2024-01-01, INTERVAL 1 MONTH), -- 2023-12-01 减 1 月 YEAR(NOW()), MONTH(NOW()), DAY(NOW()), UNIX_TIMESTAMP(NOW()), -- 1716310200 秒级时间戳 FROM_UNIXTIME(1716310200); -- 转回日期常用日期格式符格式符含义示例%Y4 位年2024%m2 位月08%d2 位日15%H24 小时14%i分钟30%s秒00六、条件函数-- IF三目运算符 SELECT IF(score 60, 及格, 不及格) AS result FROM score; -- IFNULL处理 NULL SELECT IFNULL(phone, 未填写) FROM student; -- COALESCE返回第一个非 NULL SELECT COALESCE(phone, email, 无可用联系方式) FROM student; -- CASE WHEN复杂分支 SELECT name, CASE WHEN score 90 THEN 优秀 WHEN score 80 THEN 良好 WHEN score 60 THEN 及格 ELSE 不及格 END AS 等级 FROM score;CASE WHEN比IF更强大——支持多分支和范围判断是 SQL 里写业务规则最常用的工具。七、自定义函数MySQL 允许用 SQL 写自定义函数UDF7.1 创建函数DELIMITER $$ CREATE FUNCTION calculate_age(birthday DATE) RETURNS INT DETERMINISTIC BEGIN RETURN TIMESTAMPDIFF(YEAR, birthday, CURDATE()); END$$ DELIMITER ;参数说明子句含义RETURNS INT返回类型DETERMINISTIC确定性函数输入相同输出相同用于查询优化BEGIN ... END函数体多条语句用分号必须改 delimiter7.2 使用函数SELECT name, birthday, calculate_age(birthday) AS age FROM student;7.3 删除函数DROPFUNCTIONcalculate_age;::: warningMySQL 自定义函数有严格限制不能引用表只能用 SELECT INTO 赋值局部变量不能修改数据库只能返回单一标量值复杂逻辑应该放在应用层Node / Java 代码:::八、GROUP BY 高级用法8.1 多列分组-- 每个班级每科的平均分 SELECT class_id, subject, AVG(score) AS avg_score FROM student s JOIN score sc ON sc.student_id s.id GROUP BY class_id, subject ORDER BY class_id, subject;8.2 WITH ROLLUP 汇总行SELECT class_id, subject, SUM(score) AS total FROM score GROUP BY class_id, subject WITH ROLLUP;WITH ROLLUP在分组结果末尾追加一行汇总。class_id NULL那行就是全部总和。8.3 HAVING 高级用法-- 找出每个班级数学成绩前 3 的学生 SELECT class_id, name, score FROM ( SELECT s.class_id, s.name, sc.score, ROW_NUMBER() OVER (PARTITION BY s.class_id ORDER BY sc.score DESC) AS rank FROM student s JOIN score sc ON sc.student_id s.id WHERE sc.subject 数学 ) AS t WHERE t.rank 3;MySQL 8.0 支持窗口函数ROW_NUMBER/RANK/DENSE_RANK/LAG/LEAD能在不破坏行结构的前提下做排序和聚合。九、SQL 执行顺序理解 SQL 执行顺序能解释为什么SELECT里给字段起的别名WHERE不能用SELECTscore*2ASdouble_scoreFROMscoreWHEREdouble_score100;-- ❌ 报错unknown column double_score实际执行顺序FROMWHERE行过滤GROUP BY分组HAVING组过滤SELECT计算列ORDER BY排序LIMIT分页WHERE在SELECT之前执行——所以 WHERE 不能用 SELECT 起的别名。::: tipHAVING 能用 SELECT 别名——因为 HAVING 在 SELECT 之后执行。但这依赖具体数据库实现不推荐这种写法可读性差。改用子查询或WITH子句更清晰。:::十、最佳实践场景推荐数学计算用ROUND/CEIL/FLOOR而非应用层处理字符串拼接CONCAT_WS带分隔符版本中文长度CHAR_LENGTH而非LENGTH日期格式化DATE_FORMAT格式符固定NULL 处理IFNULL/COALESCE业务规则CASE WHEN比IF链更可读自定义函数谨慎用复杂逻辑放应用层SQL 顺序别名只在 ORDER BY / HAVING 可用不推荐十一、小结函数分类数学 / 聚合 / 字符 / 日期 / 条件 / 类型转换聚合函数上一章已讲本节补充COUNT三种形式和SUM/AVG/MAX/MIN中文长度用CHAR_LENGTH字符数而非LENGTH字节数日期处理用DATE_FORMAT/DATEDIFF/DATE_ADD避免应用层解析条件分支CASE WHEN比IF链更强大自定义函数有严格限制复杂逻辑放应用层SQL 执行顺序FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
延伸阅读

更多相关文章

2026/10/25 12:31:50

UE5使用蓝图实现简单角色移动案例

1 首先创建角色和游戏模式蓝图BP_Character:角色蓝图,右键创建蓝图类,选择角色BP_MyGameMode:游戏模式蓝图,右键创建蓝图类,选择游戏模式基础2 创建控制器IA_MyLook:视角控制蓝图,右键创建输入,…

2026/10/30 6:36:14

29|可靠性设计:超时、重试、降级与幂等 - eino教程

29|可靠性设计:超时、重试、降级与幂等 《Eino 实战:用 Go 构建 AI 应用与智能体》 第 29 篇 关键词:context、超时分层、重试退避、故障切换、幂等键 前置条件:已完成 28|Callbacks 与可观测性 与 20&…

2026/10/30 6:36:14

NERDTree 文件树配色:让 Vim 文件树看得清、读得快

NERDTree 文件树配色:让 Vim 文件树看得清、读得快 【免费下载链接】nerdtree A tree explorer plugin for vim. 项目地址: https://gitcode.com/gh_mirrors/ne/nerdtree 当 Vim 左侧的文件树混成一团时,定位文件会变慢。本文讲清 NERDTree 文件树…

2026/10/30 6:36:14

JX3Toy:剑网3 PVE 宏脚本工具快速上手指南

JX3Toy:剑网3 PVE 宏脚本工具快速上手指南 【免费下载链接】JX3Toy 全功能减负工具 项目地址: https://gitcode.com/GitHub_Trending/jx/JX3Toy JX3Toy 是面向剑网3 的 PVE 宏脚本工具,汇集覆盖 20 个门派的 107 个 Lua 宏脚本,附带宏…

2026/10/30 6:36:14

C++中国象棋源代码编译运行与核心代码解析指南

简介:这是一份面向C初学者与进阶开发者的中国象棋游戏完整源代码,适合用于课程设计、编程练习或游戏开发入门。项目以C面向对象思想为核心,将将、士、象、马、车、炮、兵等棋子抽象为类,通过继承与多态实现各自的移动与吃子规则&a…

2026/10/30 6:31:14

Java开发者转型大模型的四大核心路径

1. Java开发者转型大模型的背景与机遇近年来,大模型技术正在重塑整个软件开发领域。作为拥有扎实编程基础的Java开发者,我们正站在技术浪潮的前沿。Java生态中积累的工程化思维、设计模式经验和系统架构能力,恰恰是大模型应用开发最需要的底层…

2026/10/29 17:05:52

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/29 17:06:02

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/29 17:06:13

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/30 0:00:46

NCP1342高频准谐振反激控制器:从设计约束到验收的完整方案

简介:NCP1342 高频准谐振反激控制器应用介绍译文文档,面向电源设计工程师、硬件研发人员及开关电源学习者,帮助读者跨越英文原版资料的语言门槛,系统理解这款高集成度 QR Flyback 控制器的设计要点。文档围绕芯片核心特性展开&…

2026/10/30 0:00:46

NCP1342准谐振反激电源设计:从选型到验收的全流程解析

简介:这份文档面向电源设计工程师与开关电源学习者,系统梳理NCP1342高频准谐振反激控制器的应用要点,帮助读者快速理解这款高集成度离线电源变换器控制芯片的工作机制与设计方法。内容涵盖芯片核心特性、引脚功能定义、电气特性参数表、最大额…

2026/10/30 0:00:46

Web系统自动登出机制设计与实现全解析

1. 系统自动登出机制的设计初衷在各类Web应用和后台管理系统中,自动登出功能早已成为标配。这个看似简单的功能背后,实际上涉及用户安全、资源管理和体验优化的多重考量。作为从业十多年的老开发,我见过太多因为登出逻辑设计不当导致的安全事…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑