MySQL常用函数知识点总结

目录

引言

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, ...) :将多个字符串按顺序拼接成一个字符串。

    sql 复制代码
    SELECT CONCAT(last_name, ' ', first_name) AS full_name FROM users;
  • CONCAT_WS(separator, s1, s2, ...) :使用指定的分隔符连接多个字符串。此函数会忽略 NULL 值。

    sql 复制代码
    SELECT 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) 返回 xy 次幂
SQRT(x) 返回 x 的算术平方根
RAND() 返回一个 0 到 1 之间的随机小数
FORMAT(x, n) 将数字 x 格式化为带有千位分隔符的字符串,并四舍五入到 n 位小数

多层运算书写原则由内向外嵌套,先计算最内层的表达式。

sql 复制代码
SELECT 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)
    sql 复制代码
    SELECT 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)。

    sql 复制代码
    SELECT TIMESTAMPDIFF(YEAR, '2000-01-01', CURDATE()) AS age;

4. 日期增减

  • DATE_ADD(date, INTERVAL expr unit):为日期增加一个时间间隔。

  • DATE_SUB(date, INTERVAL expr unit) :从日期减去一个时间间隔。

    sql 复制代码
    SELECT 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;

六、区分易混淆函数

  1. LENGTH() vs CHAR_LENGTH()

    • LENGTH():返回字节长度 。在 UTF-8 编码下,LENGTH('中国') 返回 6。
    • CHAR_LENGTH():返回字符个数CHAR_LENGTH('中国') 返回 2。
  2. CEIL() vs FLOOR() vs ROUND()

    • CEIL(3.1):向上取整,结果为 4。
    • FLOOR(3.9):向下取整,结果为 3。
    • ROUND(3.456, 2):四舍五入到两位小数,结果为 3.46。
  3. 聚合函数 vs 单行函数

    • 聚合函数 (如 AVG, SUM, COUNT):对多行数据进行汇总计算,返回少量统计行
    • 单行函数 (如字符串、数值、日期函数):对每条记录单独进行运算,返回的行数与原表相同

七、书写通用技巧

  1. 多层函数嵌套 :理清运算顺序,先算最内层 。例如 SELECT UPPER(LEFT(name, 1)) FROM users; 先取名字首字母,再转为大写。
  2. 处理空值 :涉及可能为 NULL 的字段运算时,优先使用 IFNULL() 函数兜底,确保计算逻辑正确。
  3. 字符串拼接 :优先使用 CONCAT_WS(),它能自动处理分隔符,避免因部分字段为 NULL 导致拼接结果异常。
  4. 日期展示 :统一使用 DATE_FORMAT() 规范输出格式,提升数据的可读性和一致性。
  5. 性能考虑 :在 WHERE 子句或 JOIN 条件中对字段使用函数(如 YEAR(date_column) = 2023)可能会使索引失效,影响查询性能。如果数据量大,应考虑存储计算列或调整查询设计。

掌握这些函数并灵活运用,能极大提升 SQL 查询的效率和表达能力。

相关推荐
看浪的路人1 小时前
第6讲:SQL 解析器
java·开发语言·数据库
吴老弟i1 小时前
Mac 本地安装 MySQL 学习指南
数据库
万亿少女的梦1682 小时前
基于Spring Boot、Java与MySQL的同城宠物服务系统设计与实现
java·spring boot·mysql·系统设计·协同过滤
XLYcmy2 小时前
pdf论文处理:CSV输出模式
数据库·python·pycharm·pdf·论文·csv·dify
MC皮蛋侠客2 小时前
Redis 系列(十一):高可用(二)——Redis Cluster 集群
数据库·redis·bootstrap
zhanghaha13142 小时前
Python进阶教程:5_XML 解析 —— 新手完全指南
java·前端·数据库
万亿少女的梦1682 小时前
基于Spring Boot、Vue与MySQL的私人健身教练预约管理系统设计
java·spring boot·mysql·vue·预约管理
祈禾11 小时前
Redis三大缓存问题与分布式锁
运维·数据库·redis·笔记·分布式·缓存
DBA小马哥12 小时前
关系型数据库核心概念手册:SQL、事务与存储引擎的技术脉络
数据库·sql