SQL:MySQL 函数
目录
为什么存在 MySQL 函数?
举个具体例子
字符串函数(String Functions)
🧵 字符串拼接函数(Concatenation)
✂️ 字符串截取器:SUBSTRING() 函数
🔠 字符大小写转换器——UPPER() 和 LOWER()
日期时间函数(Date Functions)
📅 把“日期+时间”简化成“日期”——DATE()
📆 MONTH() & YEAR() —— 从日期中提取“月份”和“年份”
为什么存在 MySQL 函数?
我们先问个问题:
“如果数据库只负责存数据,那我们每次都得把数据拉出来,再用程序处理,那数据库岂不是很傻?”
为了解决这个问题,SQL 提供了“函数”,让我们在数据库内部就可以:
-
清洗字符串(比如把名字变大写)
-
拼接文字(比如名字+后缀)
也就是说:函数是数据库里的“工具箱”,让我们在查数据时就能做很多变形、提取、处理,而不用拉到程序里再搞。
它们的本质是:
✅ 输入一些值(参数) → ✅ 输出一个处理结果(返回值)
🗂️ SQL 函数的类型非常多,大致可以分成几类:
类别 | 作用 |
---|---|
数学函数(Math Functions) | 加减乘除、开方、取整等 |
字符串函数(String Functions) | 处理文字,如拼接、替换、截取 |
日期时间函数(Date Functions) | 处理时间,如获取年份、计算日期差 |
聚合函数(Aggregate Functions) | 汇总一组数据,如求平均、计数、求最大最小值 |
流程控制函数(Control Flow Functions) | 条件判断、返回不同值 |
加密/解密函数(Encryption Functions) | 做哈希、加密操作等 |
你可以在 MySQL 官网查看所有函数的详细说明和示例:
MySQL :: MySQL 8.0 Reference Manual :: 14 Functions and Operatorshttps://dev.mysql.com/doc/refman/8.0/en/functions.html
(适用于 MySQL 8.0,其他版本可在页面切换)
举个具体例子
在众多 SQL 函数中,字符串函数(String Functions) 和 日期时间函数(Date Functions) 是最常用的两类,特别是在处理用户信息、日志记录、订单数据等日常业务时尤为重要。
比如你会遇到这样的需求:
-
把用户姓名格式化为统一格式(如全大写)
-
从邮箱中提取用户名
这些问题都不是通过简单的 SELECT 查询能解决的,而是需要借助 字符串函数 和 日期函数 来“加工”数据。
字符串函数(String Functions)
📌 作用:处理文字、邮箱、名字、路径等文字型数据。
🔧 常见字符串函数
函数 | 中文名 | 用法示例 | 说明 |
---|---|---|---|
UPPER(str) | 转大写 | UPPER('abc') → 'ABC' | 全部字母变大写 |
LOWER(str) | 转小写 | LOWER('ABC') → 'abc' | 全部字母变小写 |
LENGTH(str) | 获取长度(字节数) | LENGTH('abc') → 3 | 多字节字符如中文是 3 |
CHAR_LENGTH(str) | 获取字符数 | CHAR_LENGTH('张三') → 2 | 不按字节,而按“几个字”算 |
CONCAT(a, b) | 拼接字符串 | CONCAT('张', '三') → '张三' | 多个字段拼一起 |
SUBSTRING(str, start, len) | 截取字符串 | SUBSTRING('hello', 2, 3) → 'ell' | 从第 2 个字符起,取 3 个 |
LEFT(str, n) | 从左取 | LEFT('abcdef', 3) → 'abc' | 取前 n 个字符 |
RIGHT(str, n) | 从右取 | RIGHT('abcdef', 3) → 'def' | 取后 n 个字符 |
REPLACE(str, from, to) | 替换子串 | REPLACE('abcabc', 'a', 'x') → 'xbcxbc' |
🧵 字符串拼接函数(Concatenation)
什么是 Concatenation?
Concatenation 中文叫做“拼接”,意思是把两个或多个字符串连起来,形成一个更长的字符串。
在生活中我们经常干这个事,比如:
把姓和名拼成全名:"赵"
+ "又廷"
→ "赵又廷"
把路径拼成地址:"www." + "baidu" + ".com"
→ "www.baidu.com"
在 SQL 里怎么拼接字符串?
✅ 用 CONCAT()
函数
这是 SQL 中最常用、最标准的拼接方式。
CONCAT(str1, str2, ..., strN)
-
每个参数都是你想拼的内容。
-
可以是字符串、字段、常量。
-
空字符串不会影响拼接,但
NULL
会让整个结果变NULL
(这一点很重要!)。
示例 :拼接姓和名
假设你有这样一个表:
users(id, first_name, last_name)
你想要得到完整姓名:
SELECT CONCAT(first_name, last_name) AS full_name
FROM users;
如果 first_name 是 "赵",last_name 是 "又廷",结果就是 "赵又廷"
我们把空格也当作一个字符串参与拼接。
SELECT CONCAT(first_name, ' ', last_name) AS full_name
FROM users;
⚠️ NULL
的陷阱
SELECT CONCAT('hello', NULL, 'world');
-- 结果是 NULL!不是 'helloworld'
🤹♂️ 实战场景举几个:
业务需求 | 拼接方式 |
---|---|
显示用户全名 | CONCAT(first_name, ' ', last_name) |
构造个性化用户名 | CONCAT('user_', id) |
拼接图片路径 | CONCAT('https://cdn.xxx.com/', file_name) |
拼接手机号掩码 | CONCAT(LEFT(phone, 3), '****', RIGHT(phone, 4)) |
✂️ 字符串截取器:SUBSTRING()
函数
什么是 SUBSTRING()
?
SUBSTRING
(中文叫“子字符串”)的作用是:
从一个字符串里,截取出一段你感兴趣的部分。
基本语法:
SUBSTRING(string, start_position, length)
-
string
:你要处理的字符串,可以是字段、常量或拼接结果。 -
start_position
:从第几个字符开始(从 1 开始数,不是 0!也可以取为负数,表示从字符串的末端开始计数) -
length
:截取多长(可选)
示例 :截取姓名的前两个字
SELECT SUBSTRING('赵又廷', 1, 2);
-- 输出:'赵又'
示例 :截取邮箱的用户名部分
SELECT SUBSTRING(email, 1, LOCATE('@', email) - 1) AS username
FROM customers;
如果邮箱是 "zhaoyouting@example.com"
,就会输出 "zhaoyouting"
注意点
-
起始位置从 1 开始
-
如果
start_position
超过了字符串长度,会返回空字符串 -
如果你用的是
UTF-8
中文环境,1 个汉字 = 1 个字符(不是 3 字节!)
实战案例参考:
场景 | 截取方式 |
---|---|
取邮箱用户名 | SUBSTRING(email, 1, LOCATE('@', email) - 1) |
手机号后四位 | RIGHT(phone, 4) 或 SUBSTRING(phone, LENGTH(phone)-3, 4) |
学号的入学年份 | SUBSTRING(student_id, 1, 4) |
路径中的文件名 | SUBSTRING_INDEX(path, '/', -1) (这个是高级点的) |
🔠 字符大小写转换器——UPPER()
和 LOWER()
基本功能:
-
UPPER(str)
:把字符串中的字母全变成 大写 -
LOWER(str)
:把字符串中的字母全变成 小写
它们只对 英文字母 起作用,中文字符、数字、符号都不变。
示例 :统一邮箱格式
SELECT LOWER('ZhaoYouTing@Example.COM');
-- 输出:'zhaoyouting@example.com'
对中文/拼音字段也适用
SELECT UPPER('赵又廷 zhaoyouting');
-- 输出:'赵又廷 ZHAOYOUTING'
日期时间函数(Date Functions)
📌 作用:处理生日、注册时间、登录时间等字段
🔧 常用日期函数
函数 | 中文名 | 用法示例 | 说明 |
---|---|---|---|
NOW() | 当前时间 | NOW() → '2025-04-25 14:35:00' | |
CURDATE() | 当前日期 | CURDATE() → '2025-04-25' | 不含时间 |
YEAR(date) | 提取年份 | YEAR('2001-05-12') → 2001 | |
MONTH(date) | 提取月份 | MONTH('2001-05-12') → 5 | |
DAY(date) | 提取日 | DAY('2001-05-12') → 12 | |
DATEDIFF(date1, date2) | 计算天数差 | DATEDIFF('2025-04-25', '2025-04-01') → 24 | |
TIMESTAMPDIFF(unit, d1, d2) | 计算差值(年、月等) | TIMESTAMPDIFF(YEAR, '2000-01-01', NOW()) → 年龄计算 | |
DATE_FORMAT(date, format) | 自定义格式 | DATE_FORMAT(NOW(), '%Y年%m月%d日') → ‘2025年04月25日’ |
📅 把“日期+时间”简化成“日期”——DATE()
SQL 中有一种常见的数据类型叫 DATETIME
,它长得像这样:
2025-04-26 19:30:00
这个字段里既包含了“年月日”,也有“时分秒”。
有时候你只关心“是哪天”,比如:
-
今天有哪些场次?
-
哪天有放映,不关心几点
这个时候就用 DATE()
——
它会把 DATETIME
值截断,只保留“年月日”部分。
示例 :查看放映时间是哪天
SELECT start_time,DATE(start_time) AS play_date
FROM screenings;
假设 start_time = '2025-04-26 19:30:00'
,
输出的 play_date
就是:2025-04-26
📆 MONTH()
& YEAR()
—— 从日期中提取“月份”和“年份”
它们是干嘛的?
-
YEAR(date_or_datetime)
👉 提取出“年份” -
MONTH(date_or_datetime)
👉 提取出“月份”(1 到 12)
适用于任何带日期的字段,比如 DATETIME
或 DATE
。
示例 :提取电影场次的年份和月份
SELECT start_time,YEAR(start_time) AS play_year,MONTH(start_time) AS play_month
FROM screenings;
如果 start_time = '2025-04-26 19:30:00'
输出就是:
start_time | play_year | play_month |
---|---|---|
2025-04-26 19:30:00 | 2025 | 4 |