目录
引言
MySQL 提供了丰富的内置函数,用于简化数据处理、计算和格式化操作。掌握这些函数是高效进行数据库查询和数据分析的基础。本文将系统性地总结 MySQL 中常用的几类函数,包括聚合函数、字符串函数、数值函数、日期时间函数以及一些重要的补充函数和通用技巧。
一、聚合函数
聚合函数用于对一组值执行计算,并返回单个汇总值。运算时会自动忽略 NULL 值。
⚠ 重要规则 :单独使用聚合函数查询时,结果仅返回统计汇总行,不能直接随意搭配普通字段。若需处理可能为
NULL的字段,可使用IFNULL()函数。
| 函数 | 作用 |
|---|---|
COUNT(*) / COUNT(主键) |
统计表总记录条数 |
MAX(字段) |
查询指定字段的最大值 |
MIN(字段) |
查询指定字段的最小值 |
SUM(字段) |
对指定字段进行求和运算 |
AVG(字段) |
计算指定字段的平均值 |
常见练习方向:
- 统计总人数 :
SELECT COUNT(*) FROM students; - 条件计数 :
SELECT COUNT(*) FROM orders WHERE status = 'completed'; - 成绩总分/平均分 :
SELECT SUM(score), AVG(score) FROM exam; - 最高分/最低分 :
SELECT MAX(score), MIN(score) FROM exam;
二、字符串函数
字符串函数用于处理文本数据,包括拼接、截取、替换、大小写转换和长度统计等。
1. 拼接
-
CONCAT(s1, s2, ...):将多个字符串按顺序拼接成一个字符串。sqlSELECT CONCAT(last_name, ' ', first_name) AS full_name FROM users; -
CONCAT_WS(separator, s1, s2, ...):使用指定的分隔符连接多个字符串。此函数会忽略NULL值。sqlSELECT CONCAT_WS('-', year, month, day) AS date_str FROM logs;
2. 大小写转换
UPPER(str)/UCASE(str):将字符串转换为大写。LOWER(str)/LCASE(str):将字符串转换为小写。
3. 空格处理
TRIM(str):去除字符串首尾的空格。LTRIM(str):去除字符串左侧(开头)的空格。RTRIM(str):去除字符串右侧(结尾)的空格。
4. 截取字符
SUBSTRING(str, start, len):从字符串str的第start个位置开始,截取长度为len的子串。LEFT(str, n):返回字符串str最左边的n个字符。RIGHT(str, n):返回字符串str最右边的n个字符。
5. 长度与查找替换
LENGTH(str):返回字符串的字节长度。在 UTF-8 编码下,一个汉字通常占 3 个字节。CHAR_LENGTH(str):返回字符串的字符个数。一个汉字算作 1 个字符。REPLACE(str, old, new):将字符串str中所有的old子串替换为new子串。INSTR(str, substr):返回子串substr在字符串str中第一次出现的起始位置(从1开始计数)。如果未找到,则返回 0。
三、数值函数(数学运算)
用于数值计算、格式化、取整和幂运算等。
| 函数 | 功能 |
|---|---|
ABS(x) |
求 x 的绝对值 |
ROUND(x, n) |
将 x 四舍五入,保留 n 位小数 |
CEIL(x) / CEILING(x) |
向上取整,返回大于或等于 x 的最小整数 |
FLOOR(x) |
向下取整,返回小于或等于 x 的最大整数 |
MOD(x, y) |
返回 x 除以 y 的余数,等价于 x % y |
POW(x, y) / POWER(x, y) |
返回 x 的 y 次幂 |
SQRT(x) |
返回 x 的算术平方根 |
RAND() |
返回一个 0 到 1 之间的随机小数 |
FORMAT(x, n) |
将数字 x 格式化为带有千位分隔符的字符串,并四舍五入到 n 位小数 |
多层运算书写原则 :由内向外嵌套,先计算最内层的表达式。
sqlSELECT ROUND(AVG(score), 2) FROM exam; -- 先计算 AVG(score),再对结果四舍五入
四、日期时间函数
用于处理系统时间、日期格式化、计算时间差值和日期增减。
1. 获取当前时间
NOW():返回当前的日期和时间(YYYY-MM-DD HH:MM:SS)。CURDATE():返回当前日期(YYYY-MM-DD)。CURTIME():返回当前时间(HH:MM:SS)。
2. 日期格式化
-
DATE_FORMAT(date, format):按指定格式模板格式化日期。
常用格式模板 :%Y:四位年份%m:两位月份(01-12)%d:两位日期(01-31)%H:24小时制的小时(00-23)
sqlSELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H时') AS formatted_date;
3. 计算时间差值
-
DATEDIFF(date1, date2):计算两个日期之间相差的天数 (date1 - date2)。 -
TIMESTAMPDIFF(unit, datetime1, datetime2):以指定的单位(如YEAR,MONTH,DAY,HOUR)计算两个日期时间之间的差值(datetime2 - datetime1)。sqlSELECT TIMESTAMPDIFF(YEAR, '2000-01-01', CURDATE()) AS age;
4. 日期增减
-
DATE_ADD(date, INTERVAL expr unit):为日期增加一个时间间隔。 -
DATE_SUB(date, INTERVAL expr unit):从日期减去一个时间间隔。sqlSELECT DATE_ADD(NOW(), INTERVAL 7 DAY) AS next_week; SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH) AS last_month;
5. 提取日期时间部分
YEAR(date):提取年份。MONTH(date):提取月份。DAY(date):提取日期。HOUR(time):提取小时。
五、补充重要函数:IFNULL
IFNULL(expression, default_value)
作用 :如果 expression 的结果为 NULL,则返回 default_value;否则返回 expression 本身的值。
应用场景 :常用于处理可能为 NULL 的字段参与计算,避免因 NULL 值导致统计结果出错或为 NULL。
sql
-- 如果 bonus 为 NULL,则按 0 参与计算
SELECT salary + IFNULL(bonus, 0) AS total_income FROM employees;
六、区分易混淆函数
-
LENGTH()vsCHAR_LENGTH()LENGTH():返回字节长度 。在 UTF-8 编码下,LENGTH('中国')返回 6。CHAR_LENGTH():返回字符个数 。CHAR_LENGTH('中国')返回 2。
-
CEIL()vsFLOOR()vsROUND()CEIL(3.1):向上取整,结果为 4。FLOOR(3.9):向下取整,结果为 3。ROUND(3.456, 2):四舍五入到两位小数,结果为 3.46。
-
聚合函数 vs 单行函数
- 聚合函数 (如
AVG,SUM,COUNT):对多行数据进行汇总计算,返回少量统计行。 - 单行函数 (如字符串、数值、日期函数):对每条记录单独进行运算,返回的行数与原表相同。
- 聚合函数 (如
七、书写通用技巧
- 多层函数嵌套 :理清运算顺序,先算最内层 。例如
SELECT UPPER(LEFT(name, 1)) FROM users;先取名字首字母,再转为大写。 - 处理空值 :涉及可能为
NULL的字段运算时,优先使用IFNULL()函数兜底,确保计算逻辑正确。 - 字符串拼接 :优先使用
CONCAT_WS(),它能自动处理分隔符,避免因部分字段为NULL导致拼接结果异常。 - 日期展示 :统一使用
DATE_FORMAT()规范输出格式,提升数据的可读性和一致性。 - 性能考虑 :在
WHERE子句或JOIN条件中对字段使用函数(如YEAR(date_column) = 2023)可能会使索引失效,影响查询性能。如果数据量大,应考虑存储计算列或调整查询设计。
掌握这些函数并灵活运用,能极大提升 SQL 查询的效率和表达能力。