发布时间:2026/8/25 15:27:03
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/8/25 15:27:03

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

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

2026/8/25 17:42:55

FinalShell入门指南:零基础Linux远程连接实战

1. 为什么FinalShell是Linux远程连接里最“省心”的那一个我带过不少刚转行做运维、嵌入式开发或者自学Linux的新人,几乎每个人在搭建第一个实验环境时,都会卡在“怎么把命令敲到另一台机器上”这个环节。有人用原生ssh命令行,输错一次密码就…

2026/8/25 17:42:55

基于Hadoop+Spark+Hive的智能招聘分析系统构建

1. 项目概述:大数据技术栈构建的智能招聘分析系统这个基于HadoopSparkHive的薪资预测与招聘推荐系统,本质上是一个融合了大数据处理与机器学习技术的智能就业分析平台。我在实际企业级项目中多次采用类似架构,核心价值在于将分散的招聘信息转…

2026/8/25 17:42:55

知识图谱与神经网络构建智能简历匹配系统

1. 项目背景与核心价值在招聘领域,简历与岗位的精准匹配一直是行业痛点。传统关键词匹配方式存在语义理解浅层、关联维度单一等问题。我们团队构建的混合推荐系统,通过知识图谱构建行业人才画像,结合神经网络挖掘深层特征,实现了从…

2026/8/25 17:42:55

性能测试全流程解析:从JMeter工具使用到系统瓶颈定位

1. 性能测试:从“能用”到“好用”的必经之路在软件开发和运维的日常里,我们常常会陷入一种“功能满足”的错觉。一个功能,在开发环境里点几下,流程通了,数据存了,界面也正常显示了,大家就觉得“…

2026/8/25 17:37:46

HTML lang与viewport:网页正确渲染的底层契约

1. 这两个标签不是“可有可无”的装饰,而是网页在浏览器里站稳脚跟的第一块地基你有没有遇到过这样的情况:一个精心设计的响应式页面,在iPhone上文字小得看不清,横着滑半天才能看完一行;或者刚打开页面,中文…

2026/8/25 1:04:19

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/25 11:48:27

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/25 16:56:43

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 0:04:14

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory Meta Description:GetQzonehistory 是一个QQ空间历史说…

2026/8/25 0:04:14

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

【题目来源】 https://www.luogu.com.cn/problem/P7912 【题目描述】 小熊的水果店里摆放着一排 n 个水果。每个水果只可能是苹果或桔子,从左到右依次用正整数 1,2,…,n 编号。连续排在一起的同一种水果称为一个“块”。小熊要把这一排水果挑到若干个果篮里&#x…

2026/8/24 13:42:17

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/24 18:13:48

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/25 1:08:14

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…