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 查询的效率和表达能力。

相关推荐
风哥2号25 分钟前
MySQL8.x/9.x数据库安装自动化全过程-Fgedu
数据库·mysql自动化安装
疯狂打码的少年38 分钟前
【数据库技术】SQL数据查询(SELECT基本语法)
数据库·笔记·sql·oracle
程序员黎剑1 小时前
Redis缓存击穿:热点Key过期打崩数据库的3种解决方案
数据库·redis·缓存
Carl_.Net软开1 小时前
NSSM后台启动influx时序数据库
数据库·时序数据库
IPdodo_1 小时前
静态 IP 访问异常排查:403/429 归因与迁移验收
服务器·网络·数据库·python·网络协议·php·性能测试
DevOpenClub1 小时前
PDF 多格式解析如何避免混用输出:TEXT、HTML、XML 与 TAG 数据契约
xml·前端·数据库·pdf·html
meilindehuzi_a1 小时前
从域名到数据库:React + Node.js 项目部署全流程与用户访问链路
数据库·react.js·node.js
泡干脆面就番茄2 小时前
MySQL_流程控制_分组查询与连接查询详解
数据库·mysql
Bode_20022 小时前
全生命周期 SQL 控制
数据库·智能制造
西西弗Sisyphus2 小时前
Qt 在无边框窗口上做一套换肤系统
开发语言·数据库·qt