第12周 计算字段、函数与数据汇总
第12周 · 计算字段、函数与数据汇总
这周学 SQL 的"加工能力":查询时当场拼接文本、算数、调函数,以及最常用的聚合汇总(总数、平均分、最大最小)。成绩单自动统计就靠它们。
一、知识点:计算字段
计算字段是查询时临时算出来的列,不写回表里。比如把"姓名+系"拼成一个显示串:
SELECT CONCAT(sname, '-', sdept) AS info FROM student;
结果:张伟-计算机系。AS info 给这列起名,方便看。
还可做算术:
SELECT sid, sage+1 AS 明年年龄 FROM student;(年龄+1)。
二、操作教程:字符串函数
| 函数 | 作用 | 示例 |
|---|---|---|
CONCAT(a,b) |
拼接 | CONCAT(sname,'-',sdept) |
UPPER(s) / LOWER(s) |
转大写/小写 | UPPER(sname) |
LENGTH(s) |
字符长度 | LENGTH(sname) |
LEFT(s,n) |
取左 n 个字符 | LEFT(sname,1) 取姓 |
TRIM(s) |
去首尾空格 | TRIM(sname) |
作业题1:拼接"姓名-系"并转大写姓名
SELECT CONCAT(sname, '-', sdept) AS info, UPPER(sname) FROM student;
三、操作教程:数值与日期函数
-- 数值:四舍五入,保留1位
SELECT ROUND(AVG(sage), 1) FROM student; -- 19.50 → 19.5
-- 日期:当前日期 / 当前时间
SELECT CURDATE(); -- 2026-08-29(仅日期)
SELECT NOW(); -- 2026-08-29 14:30:00(日期+时间)
常用:ROUND(x,n) 四舍五入、CURDATE() 当前日期、NOW() 当前日期时间。
四、知识点 + 操作:聚合函数
聚合函数对一组行算出一个汇总值:
| 函数 | 作用 |
|---|---|
COUNT(*) |
总行数 |
SUM(列) |
求和 |
AVG(列) |
平均值 |
MAX(列) |
最大值 |
MIN(列) |
最小值 |
作业题2:人数、最大/最小/平均年龄
SELECT
COUNT(*) AS cnt,
MAX(sage) AS max_s,
MIN(sage) AS min_s,
AVG(sage) AS avg_s
FROM student;
五、知识点:COUNT(*) 与 COUNT(列) 的区别(重点)
COUNT(*):统计所有行数,包括值为 NULL 的行。COUNT(列):统计该列非 NULL 的行数,NULL 不计入。
SELECT COUNT(*) FROM student; -- 4(全部4人)
SELECT COUNT(sage) FROM student; -- 若某人生龄为空,会少算
高频考点:聚合函数(COUNT/SUM/AVG/MAX/MIN)统统忽略 NULL。算"缺考人数"用
COUNT(*),算"有效成绩"用COUNT(grade)(自动排除缺考 NULL)。
六、操作教程:函数嵌套
函数可以套函数,从内往外算:
-- 当前日期 + 平均年龄四舍五入保留1位
SELECT CURDATE() AS cur_date, ROUND(AVG(sage), 1) AS avg_s FROM student;
七、综合实操:作业三题
-- 题1:拼接 info + 大写姓名
SELECT CONCAT(sname, '-', sdept) AS info, UPPER(sname) FROM student;
-- 题2:人数/最大/最小/平均年龄
SELECT COUNT(*) AS cnt, MAX(sage) AS max_s, MIN(sage) AS min_s, AVG(sage) AS avg_s
FROM student;
-- 题3:当前日期 + 平均年齡四舍五入1位
SELECT CURDATE() AS cur_date, ROUND(AVG(sage), 1) AS avg_s FROM student;
八、易混点排查表
| 现象 | 解决方法 |
|---|---|
COUNT(*) 和 COUNT(列) 结果不同 |
后者不计 NULL 行;按需求选 |
| 平均值算出来偏少 | 列里有 NULL 被 AVG 忽略;确认是否该用 COUNT(*) |
| CONCAT 出现 NULL | 任意一列为 NULL,CONCAT 整串变 NULL;用 IFNULL(列,'') 兜底 |
| ROUND 没生效 | 确认是 ROUND(值, 小数位);参数顺序别反 |
| 字符串忘了引号 | 函数内文本参数仍需单引号 |
| 聚合和单行列混选报错 | SELECT sname, AVG(sage) 不行;聚合需配合分组(下周 GROUP BY) |
九、小测验(自测)
CONCAT(sname,'-',sdept) AS info的作用是什么?AS起的名字会改表里数据吗?COUNT(*)和COUNT(sage)结果在什么情况下不同?为什么?- 聚合函数(AVG/SUM/MAX)遇到 NULL 怎么处理?
- 求平均年龄四舍五入保留 1 位小数,并查当前日期,怎么写?
【声明】本文由 AI 辅助生成,仅供 MySQL 数据库教学参考,如有疑误以教材为准。
浙公网安备 33010602011771号