一文详解MySQL常用内置函数
作者:Mortalbreeze
一、日期与时间函数
| 函数 | 功能描述 | 使用示例 |
|---|---|---|
NOW() | 获取当前日期和时间 | SELECT NOW(); |
CURDATE() | 获取当前日期 | SELECT CURDATE(); |
CURTIME() | 获取当前时间 | SELECT CURTIME(); |
DATE() | 提取日期部分 | SELECT DATE(NOW()); |
TIME() | 提取时间部分 | SELECT TIME(NOW()); |
DATEDIFF() | 计算两个日期相差的天数 | SELECT DATEDIFF('2026-10-08', '2026-10-01'); |
DATE_ADD() | 在日期基础上增加指定时间间隔 | SELECT DATE_ADD(NOW(), INTERVAL 7 DAY); |
DATE_SUB() | 在日期基础上减去指定时间间隔 | SELECT DATE_SUB(NOW(), INTERVAL 7 DAY); |
获取当前日期和时间:
select now(); +---------------------+ | now() | +---------------------+ | 2026-10-08 20:06:35 | +---------------------+ 1 row in set (0.00 sec)
获取当前日期:
select curdate(); +------------+ | curdate() | +------------+ | 2026-10-08 | +------------+
获取当前时间:
select curtime(); +-----------+ | curtime() | +-----------+ | 20:08:29 | +-----------+
提取日期和时间:
select date(now()) 日期, time(now()) 时间; +------------+----------+ | 日期 | 时间 | +------------+----------+ | 2026-10-08 | 20:10:30 | +------------+----------+
计算两个日期相差的天数:
select datediff(date(now()), '2026-10-01') res; +------+ | res | +------+ | 7 | +------+
在日期基础上增减时间间隔:
select date_add(now(), interval 2 day) res; +---------------------+ | res | +---------------------+ | 2026-10-10 20:18:42 | +---------------------+ select date_sub(now(), interval 2 day) res; +---------------------+ | res | +---------------------+ | 2026-10-06 20:18:49 | +---------------------+ select date_sub(now(), interval 2 year) res; +---------------------+ | res | +---------------------+ | 2024-10-08 20:19:00 | +---------------------+
二、数学函数
| 函数 | 功能描述 | 使用示例 |
|---|---|---|
ABS(x) | 返回 x 的绝对值 | SELECT ABS(-10); |
CEIL(x) | 向上取整,返回大于等于 x 的最小整数 | SELECT CEIL(3.14); |
FLOOR(x) | 向下取整,返回小于等于 x 的最大整数 | SELECT FLOOR(3.99); |
ROUND(x) | 四舍五入取整 | SELECT ROUND(3.56); |
TRUNCATE(x, d) | 截断到小数点后 d 位,不进行四舍五入 | SELECT TRUNCATE(3.14159, 2); |
MOD(x, y) | 求余数 | SELECT MOD(10, 3); |
RAND() | 返回 0 到 1 之间的随机数 | SELECT RAND(); |
ABS函数:
select abs(-10); +----------+ | abs(-10) | +----------+ | 10 | +----------+
CEIL 函数:
select ceil(3.14); +------------+ | ceil(3.14) | +------------+ | 4 | +------------+ select ceil(-1.1); +------------+ | ceil(-1.1) | +------------+ | -1 | +------------+
FLOOR函数:
select floor(3.99); +-------------+ | floor(3.99) | +-------------+ | 3 | +-------------+ select floor(-1.01); +--------------+ | floor(-1.01) | +--------------+ | -2 | +--------------+
ROUND函数:
select round(3.56); +-------------+ | round(3.56) | +-------------+ | 4 | +-------------+ select round(3.49); +-------------+ | round(3.49) | +-------------+ | 3 | +-------------+
TRUNCATE函数:
select truncate(3.14159, 2); +----------------------+ | truncate(3.14159, 2) | +----------------------+ | 3.14 | +----------------------+ select truncate(3.14159, 4); +----------------------+ | truncate(3.14159, 4) | +----------------------+ | 3.1415 | +----------------------+
MOD函数:
select mod(10, 3); +------------+ | mod(10, 3) | +------------+ | 1 | +------------+
RAND函数:
生成 0 ~ 1 中的随机数 select rand(); +--------------------+ | rand() | +--------------------+ | 0.9467393354948045 | +--------------------+ 生成 0 ~ 100 中的随机数 select rand() * 100; +------------------+ | rand() * 100 | +------------------+ | 58.6048947261692 | +------------------+ 生成 0 ~ 100 中的随机整数 select truncate(rand() * 100, 0); +---------------------------+ | truncate(rand() * 100, 0) | +---------------------------+ | 69 | +---------------------------+
补充:MySQL 中进制转换函数
| 函数 | 功能描述 | 使用示例 |
|---|---|---|
BIN(n) | 将十进制整数转换为二进制字符串 | SELECT BIN(10); → 1010 |
OCT(n) | 将十进制整数转换为八进制字符串 | SELECT OCT(10); → 12 |
HEX(n) | 将数字转换为十六进制字符串,也支持字符串的十六进制编码表示 | SELECT HEX(255); → FF |
CONV(n, from_base, to_base) | 将数字字符串从指定进制转换为另一种进制(2~36 进制) | SELECT CONV('1010', 2, 10); → 10 |
三、字符串函数
| 函数 | 功能描述 | 使用示例 |
|---|---|---|
CHARSET(s) | 查看字符串的字符集 | SELECT CHARSET('abc'); |
CONCAT(s1, s2, ...) | 将多个字符串拼接成一个字符串 | SELECT CONCAT('Hello', 'World'); |
LENGTH(s) | 返回字符串的字节长度 | SELECT LENGTH('abc'); → 3 |
UPPER(s) | 将字符串转换为大写 | SELECT UPPER('hello'); → HELLO |
LOWER(s) | 将字符串转换为小写 | SELECT LOWER('HELLO'); → hello |
SUBSTRING(s, pos, len) | 从指定位置开始截取指定长度的字符串 | SELECT SUBSTRING('abcdef', 2, 3); → bcd |
LEFT(s, n) | 获取字符串左侧的 n 个字符 | SELECT LEFT('abcdef', 3); → abc |
RIGHT(s, n) | 获取字符串右侧的 n 个字符 | SELECT RIGHT('abcdef', 3); → def |
TRIM(s) | 去除字符串首尾的空格 | SELECT TRIM(' hello '); → hello |
LTRIM(s) | 去除字符串左侧的空格 | SELECT LTRIM(' hello'); → hello |
RTRIM(s) | 去除字符串右侧的空格 | SELECT RTRIM('hello '); → hello |
REPLACE(s, from, to) | 将字符串中的指定子串替换为新字符串 | SELECT REPLACE('hello', 'l', 'x'); → hexxo |
INSTR(s, sub) | 返回子串首次出现的位置,未找到返回 0 | SELECT INSTR('hello', 'll'); → 3 |
STRCMP(s1, s2) | 比较两个字符串,相等返回 0 | SELECT STRCMP('abc', 'abc'); → 0 |
查看字符串字符集:
select charset('abc');
+----------------+
| charset('abc') |
+----------------+
| utf8 |
+----------------+
拼接字符串:
select concat('hello', 'world');
+--------------------------+
| concat('hello', 'world') |
+--------------------------+
| helloworld |
+--------------------------+
需要注意的是,如果参与拼接的任意一个参数为 NULL,最终结构也会是 NULL。
select concat('hello', NULL, 'world') res;
+------+
| res |
+------+
| NULL |
+------+
截取子串:
select substring('abcdefg', 1);
+-------------------------+
| substring('abcdefg', 1) |
+-------------------------+
| abcdefg |
+-------------------------+
select substring('abcdefg', 1, 2);
+----------------------------+
| substring('abcdefg', 1, 2) |
+----------------------------+
| ab |
+----------------------------+
字符串函数的实际应用
CREATE TABLE student (
id INT PRIMARY KEY,
first_name VARCHAR(20),
last_name VARCHAR(20),
email VARCHAR(100)
);
INSERT INTO student VALUES
(1, 'San', 'Zhang', 'ZHANGSAN@QQ.COM'),
(2, 'Si', 'Li', 'LISI@163.COM'),
(3, 'Wu', 'Wang', 'WANGWU@GMAIL.COM');
select * from student;
+----+------------+-----------+------------------+
| id | first_name | last_name | email |
+----+------------+-----------+------------------+
| 1 | San | Zhang | ZHANGSAN@QQ.COM |
| 2 | Si | Li | LISI@163.COM |
| 3 | Wu | Wang | WANGWU@GMAIL.COM |
+----+------------+-----------+------------------+
需求一:输出学生姓名
select concat(last_name, ' ', first_name) name from student; +-----------+ | name | +-----------+ | Zhang San | | Li Si | | Wang Wu | +-----------+
需求二:将所有邮箱转换为小写
select lower(email) from student; +------------------+ | lower(email) | +------------------+ | zhangsan@qq.com | | lisi@163.com | | wangwu@gmail.com | +------------------+
需求三:提取邮箱域名
select substring(email, instr(email, '@') + 1) suffix from student; +-----------+ | suffix | +-----------+ | QQ.COM | | 163.COM | | GMAIL.COM | +-----------+
需求四:查询使用 QQ 邮箱的学生
select * from student where substring(email, instr(email, '@') + 1) = 'qq.com'; +----+------------+-----------+-----------------+ | id | first_name | last_name | email | +----+------------+-----------+-----------------+ | 1 | San | Zhang | ZHANGSAN@QQ.COM | +----+------------+-----------+-----------------+
四、其他常用函数
常见函数汇总
| 函数 | 功能描述 | 使用示例 |
|---|---|---|
IF(expr, v1, v2) | 条件成立返回 v1,否则返回 v2 | SELECT IF(80 >= 60, '及格', '不及格'); |
IFNULL(v1, v2) | 如果 v1 为 NULL,返回 v2,否则返回 v1 | SELECT IFNULL(NULL, 0); |
COALESCE(v1, ...) | 返回第一个非 NULL 的参数 | SELECT COALESCE(NULL, NULL, 10); |
DATABASE() | 返回当前使用的数据库名称 | SELECT DATABASE(); |
USER() | 返回当前连接的用户名和主机信息 | SELECT USER(); |
VERSION() | 返回 MySQL 服务器版本 | SELECT VERSION(); |
| PASSWORD() | 对用户数据进行加密 | SELECT PASSWORD(s); |
其中 IF()、IFNULL()、COALESCE() 主要用于条件判断以及 NULL 值处理,在实际的数据查询过程中最为常见。
条件判断与 NULL 处理
(1)IF() 函数
IF() 函数用于根据条件表达式的结果,返回不同的值。
基本语法:
IF(expr, value1, value2);
- expr:条件表达式。
- value1:当条件成立时返回的值。
- value2:当条件不成立时返回的值。
例如:
select if(80 >= 60, '及格', '不及格') res; +--------+ | res | +--------+ | 及格 | +--------+
在 MySQL 中,IF() 将非零且非 NULL 的数值条件视为真,将零或 NULL 视为假。
例如:
SELECT IF(1, 'true', 'false'); -- true SELECT IF(0, 'true', 'false'); -- false SELECT IF(NULL, 'true', 'false'); -- false
(2)IFNULL() 函数
IFNULL() 主要用于处理 NULL 值。当第一个参数为 NULL 时,返回第二个参数;否则返回第一个参数。
基本语法:
IFNULL(value1, value2);
例如:
SELECT IFNULL(NULL, 100); -- 100 SELECT IFNULL(10, 100); -- 10
实际开发中,某些字段可能允许存储 NULL,如果希望在查询时使用指定的默认值,就可以使用 IFNULL() 。
假设存在如下学生信息表:
CREATE TABLE student (
id INT PRIMARY KEY,
name VARCHAR(20),
score INT
);
INSERT INTO student VALUES
(1, '张三', 90),
(2, '李四', NULL),
(3, '王五', 80);查询学生成绩时,如果成绩为 NULL,希望显示为 0:
SELECT name, IFNULL(score, 0) AS score FROM student;
查询结果:
| name | score |
|---|---|
| 张三 | 90 |
| 李四 | 0 |
| 王五 | 80 |
需要注意:IFNULL() 只是对查询结果进行处理,并不会修改数据表中实际存储的 NULL 值。
(3)NULLIF() 函数
NULLIF() 用于比较两个表达式,如果二者相等,则返回 NULL;否则返回第一个表达式的值。
基本语法:
NULLIF(value1, value2);
例如:
SELECT NULLIF(10, 10); -- NULL SELECT NULLIF(10, 20); -- 10
从逻辑上可以将其理解为:
CASE
WHEN value1 = value2 THEN NULL
ELSE value1
END一个常见的应用场景是避免除零错误。
SELECT 100 / NULLIF(0, 0); -- NULL
当除数为 0 时,NULLIF(0, 0) 返回 NULL,最终除法运算结果也为 NULL,从而避免直接使用零作为除数。在实际 MySQL 中,除零本身的报错或警告行为还与 SQL 模式及执行场景有关。
(4)COALESCE() 函数
COALESCE() 用于从多个参数中依次查找,返回第一个非 NULL 的参数。
基本语法:
COALESCE(value1, value2, ...);
例如:
SELECT COALESCE(NULL, NULL, 100, 200); -- 100
如果所有参数均为 NULL,则返回 NULL。
SELECT COALESCE(NULL, NULL, NULL); -- NULL
它与 IFNULL() 的作用比较相似,但存在一个明显的区别:
- IFNULL():只能接收两个参数。
- COALESCE():可以接收多个参数,依次返回第一个非 NULL 的值。
因此,当需要从多个候选值中选择有效数据时,使用 COALESCE() 更加方便。
CASE WHEN 条件表达式
注:CASE 属于 SQL 条件表达式,并不是普通的内置函数。
基本语法:
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END执行逻辑:
- 从上到下依次判断 WHEN 后面的条件。
- 当某个条件成立时,返回对应 THEN 后面的结果。
- 如果所有条件都不成立,则返回 ELSE 指定的结果。
- 如果没有符合条件的分支,并且省略了 ELSE,则返回 NULL。
假设需要根据学生的成绩划分等级:
- 成绩大于等于 90:优秀。
- 成绩大于等于 80:良好。
- 成绩大于等于 60:及格。
- 成绩小于 60:不及格。
- 成绩为 NULL:暂无成绩。
SELECT
name,
score,
CASE
WHEN score IS NULL THEN '暂无成绩'
WHEN score >= 90 THEN '优秀'
WHEN score >= 80 THEN '良好'
WHEN score >= 60 THEN '及格'
ELSE '不及格'
END AS grade
FROM student;此外,CASE 还支持另一种写法,适合对同一个表达式进行多个等值判断:
CASE gender
WHEN '男' THEN 'Male'
WHEN '女' THEN 'Female'
ELSE 'Unknown'
END这种形式就相当于依次比较 gender 与各个 WHEN 后面的值是否相等。
数据库信息函数
(1)DATABASE() 函数
获取当前正在使用的数据库:
mysql> select database(); +------------+ | database() | +------------+ | NULL | +------------+ 1 row in set (0.00 sec) mysql> use test; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select database(); +------------+ | database() | +------------+ | test | +------------+ 1 row in set (0.00 sec)
如果当前没有选择任何数据库,则返回 NULL。
(2)USER() 函数
获取当前连接时使用的用户名以及客户端主机信息:
mysql> select user(); +--------+ | user() | +--------+ | lt@ | +--------+
(3)VERSION() 函数
获取当前 MySQL 服务器的版本信息:
mysql> select version(); +-----------+ | version() | +-----------+ | 5.7.44 | +-----------+
(4)PASSWORD() 函数
对用户私密数据进行加密:
select password('1234');
+-------------------------------------------+
| password('1234') |
+-------------------------------------------+
| *A4B6157319038724E3560894F7F932C8886EBFCF |
+-------------------------------------------+
以上就是一文详解MySQL常用内置函数的详细内容,更多关于MySQL常用内置函数的资料请关注脚本之家其它相关文章!
