MySQL内置函数是数据库操作中非常实用的工具,它们能够帮助开发者高效地处理各种数据类型,包括日期、字符串、数值等。这些函数不仅简化了SQL语句的编写,还能提升查询性能和代码可读性。本文将详细解析MySQL中常见的内置函数,涵盖日期函数、字符串函数、数学函数以及其他实用函数,并通过实际案例演示它们的应用场景。
日期函数用于处理日期和时间相关的操作,比如获取当前时间、日期加减、计算日期差值等。以下是MySQL中常用的日期函数及其用法。
函数名称 | 描述 |
---|---|
current_date() |
获取当前日期 |
current_time() |
获取当前时间 |
current_timestamp() |
获取当前时间戳 |
now() |
获取当前日期和时间 |
date(datetime) |
提取日期时间中的日期部分 |
date_add(date, interval d_value_type) |
在指定日期上增加时间间隔 |
date_sub(date, interval d_value_type) |
在指定日期上减少时间间隔 |
datediff(date1, date2) |
计算两个日期之间的天数差 |
current_date()
函数current_date()
用于获取当前的日期。例如:
SELECT current_date();
执行后会返回类似 2023-10-05
的日期。
current_time()
函数current_time()
返回当前时间,不包含日期部分。例如:
SELECT current_time();
结果可能是 14:30:45
。
current_timestamp()
函数current_timestamp()
返回完整的日期和时间信息,格式为 YYYY-MM-DD HH:MM:SS
。例如:
SELECT current_timestamp();
now()
函数now()
和 current_timestamp()
类似,但 now()
的执行时间点是在语句开始时确定的,而 current_timestamp()
的执行时间点是在函数调用时确定的。
date(datetime)
函数date()
函数用于提取日期时间中的日期部分。例如:
SELECT date('2023-10-05 14:30:45');
结果为 2023-10-05
。
date_add()
和 date_sub()
函数这两个函数用于对日期进行加减操作。例如:
-- 在当前日期基础上加2天
SELECT date_add(current_date(), interval 2 day);
-- 在当前日期基础上减1个月
SELECT date_sub(current_date(), interval 1 month);
如果传入的间隔值为负数,则效果相反。例如:
-- 相当于 date_sub
SELECT date_add(current_date(), interval -1 day);
datediff()
函数datediff()
计算两个日期之间的天数差。例如:
SELECT datediff('2023-10-05', '2023-10-01');
结果为 4
。
假设我们需要创建一个评论表,记录用户的评论时间。表结构如下:
CREATE TABLE comments (
id INT AUTO_INCREMENT PRIMARY KEY,
nickname VARCHAR(50),
content TEXT,
sendtime DATETIME
);
插入数据时可以直接使用 now()
指定时间:
INSERT INTO comments (nickname, content, sendtime)
VALUES ('用户A', '这是一条评论', now());
查询时若只需显示日期部分,可以用 date()
截取:
SELECT nickname, content, date(sendtime) AS comment_date FROM comments;
若需筛选最近2分钟的评论,可以结合 date_add()
和 now()
:
SELECT * FROM comments
WHERE sendtime > date_add(now(), interval -2 minute);
字符串函数用于处理文本数据,包括拼接、截取、替换、大小写转换等操作。
函数名称 | 描述 |
---|---|
charset(str) |
获取字符串使用的字符集 |
concat(str1, str2...) |
拼接多个字符串 |
instr(str, substr) |
查找子字符串在主字符串中的位置 |
ucase(str) |
将字符串转换为大写 |
lcase(str) |
将字符串转换为小写 |
left(str, length) |
从左侧开始截取指定长度的字符 |
length(str) |
获取字符串的字节长度 |
replace(str, old, new) |
替换字符串中的指定内容 |
strcmp(str1, str2) |
比较两个字符串的大小 |
substring(str, pos, len) |
从指定位置截取指定长度的子字符串 |
ltrim(str) / rtrim(str) / trim(str) |
去除字符串前/后/前后空格 |
charset()
函数charset()
返回字符串使用的字符集。例如:
SELECT charset('你好');
结果可能是 utf8mb4
。
concat()
函数concat()
用于拼接多个字符串。例如:
SELECT concat('Hello', ' ', 'World');
结果为 Hello World
。
instr()
函数instr()
查找子字符串首次出现的位置(从1开始)。例如:
SELECT instr('abcdef', 'cd');
结果为 3
。
ucase()
和 lcase()
函数这两个函数分别将字符串转换为大写或小写:
SELECT ucase('hello'), lcase('WORLD');
结果分别为 HELLO
和 world
。
left()
函数left()
从左侧截取指定长度的字符:
SELECT left('abcdef', 3);
结果为 abc
。
length()
函数length()
返回字符串的字节长度。例如:
SELECT length('你好');
在 utf8mb4
编码下结果为 6
(每个汉字占3字节)。
replace()
函数replace()
替换字符串中的内容:
SELECT replace('Hello World', 'World', 'MySQL');
结果为 Hello MySQL
。
strcmp()
函数strcmp()
比较两个字符串的大小(区分大小写):
SELECT strcmp('abc', 'abd');
结果为 -1
(因为 c < d
)。
substring()
函数substring()
从指定位置截取子字符串:
SELECT substring('abcdef', 2, 3);
结果为 bcd
。
ltrim()
/ rtrim()
/ trim()
函数这些函数用于去除空格:
SELECT trim(' abc '); -- 结果为 'abc'
SELECT ltrim(' abc '); -- 结果为 'abc '
SELECT rtrim(' abc '); -- 结果为 ' abc'
假设员工表 employees
包含姓名 ename
,要求显示首字母小写的姓名。可以使用以下方法:
SELECT concat(lcase(left(ename, 1)), substring(ename, 2)) AS formatted_name
FROM employees;
数学函数用于处理数值计算,包括取绝对值、进制转换、四舍五入、随机数生成等。
函数名称 | 描述 |
---|---|
abs(number) |
返回绝对值 |
bin(decimal) |
十进制转二进制 |
hex(decimal) |
十进制转十六进制 |
conv(number, from_base, to_base) |
进制转换 |
ceiling(number) |
向上取整 |
floor(number) |
向下取整 |
format(number, n) |
格式化数值(保留n位小数) |
rand() |
生成随机浮点数(范围 [0.0, 1.0)) |
mod(number, denominator) |
取余运算 |
abs()
函数返回绝对值:
SELECT abs(-100); -- 结果为 100
bin()
和 hex()
函数将十进制转换为二进制或十六进制:
SELECT bin(10); -- 结果为 '1010'
SELECT hex(255); -- 结果为 'FF'
conv()
函数进制转换示例:
SELECT conv('1010', 2, 10); -- 二进制转十进制(结果为10)
SELECT conv('FF', 16, 10); -- 十六进制转十进制(结果为255)
ceiling()
和 floor()
函数向上/向下取整:
SELECT ceiling(3.2); -- 结果为 4
SELECT floor(3.9); -- 结果为 3
format()
函数格式化数值并四舍五入:
SELECT format(12345.6789, 2); -- 结果为 '12,345.68'
rand()
函数生成随机数:
SELECT rand(); -- 返回 [0.0, 1.0) 的随机数
mod()
函数取余运算:
SELECT mod(10, 3); -- 结果为 1
除了上述函数外,MySQL还提供了一些实用工具函数。
user()
函数返回当前用户和主机名:
SELECT user(); -- 可能返回 'root@localhost'
md5()
函数生成字符串的MD5摘要:
SELECT md5('password'); -- 返回32位十六进制字符串
database()
函数显示当前使用的数据库:
SELECT database(); -- 返回当前数据库名
password()
函数加密用户密码(已不推荐使用):
SELECT password('secret');
ifnull()
函数处理NULL值:
SELECT ifnull(NULL, 'default'); -- 返回 'default'
通过以上函数的学习和实践,开发者可以更高效地处理MySQL中的各种数据操作需求。后续可根据实际业务场景灵活组合这些函数,实现更复杂的逻辑。