【MySQL】内置函数
像编程语言一样,MySQL同样也提供了一部分内置函数供用户在SQL中进行调用。这些内置函数能简单处理一部分数据,避免我们在不同的用户层语言中进行逻辑编写。
1.日期函数
函数 | 作用 |
---|---|
current_date() | 当前日期 |
current_time() | 当前时间 |
current_timestamp() | 当前日期和时间 |
now() | 当前日期和时间(同上) |
unix_timestamp() | 当前时间戳数字 |
date(datetime) | 返回datetime参数中的日期部分 |
date_add(date,interval d_value_type) | 在date中添加日期或时间,interval后的参数可以是year/month/day/hour/mintue/second |
date_sub(date,interval d_value_type) | 在date中减去日期或时间,interval后的参数可以是year/month/day/hour/mintue/second |
datediff(date1,date2) | 计算两个日期的时间差,单位为天 |
date_format(date,format_string) | 根据format_string字符串来格式化时间显示 |
year(date) | 获取日期中的年份 |
month(date) | 获取日期中的月份 |
day(date) | 获取日期中的天 |
str_to_date(string,format_string) | 字符串转时间 |
下面挨个做个演示
1.1 获取日期和时间
获取时间分为获取当前日期,获取当前时间,和获取当前日期+时间;
1 | MariaDB [(none)]> select current_time(); |
经过测试可以发现,在MySQL中,current_timestamp()
函数和now()
函数的效果等效。
只有UNIX_TIMESTAMP()
函数返回的才是时间戳的数字
1 | MariaDB [(none)]> SELECT UNIX_TIMESTAMP(); |
1.2 获取时间的部分值
使用YEAR\MONTH\DAY函数从一个时间中提取日期的部分信息
1 | SELECT YEAR(NOW()) AS current_year; |
执行效果如下
1 | MariaDB [(none)]> SELECT YEAR(NOW()) AS current_year; |
1.3 时间运算
MySQL中时间可以直接用加减进行运算,时间列和时间函数返回的时间之间可以通过大于小于来比较大小;
1 | MariaDB [(none)]> SELECT NOW() + INTERVAL 1 DAY; |
在大学数据库的考试中一般会给出一张表,存了学生的出生日期,让你筛选出年龄小于20岁的学生,此时就需要进行年份的提取和时间计算
1 | -- 假设学生表中是id,name,birth三个字段 |
下面演示表格中提到的date_add/date_sub
运算函数的用法
1 | -- 在日期的基础上加上时间 |
效果如下
1 | MariaDB [(none)]> select date_sub('2023-10-1', interval 2 day); |
另外,MySQL中是允许日期中出现前导0的,依旧可以被正常识别
1 | MariaDB [(none)]> select date_sub('2023-01-01', interval 2 day); |
使用datediff函数计算两个日期的差值(日期要用单引号传入)
1 | MariaDB [(none)]> SELECT DATEDIFF('2022-01-30', '2022-01-15'); |
具体例子:在msg表中查询两分钟内发布的消息,可以用date_add
函数来实现。
1 | select * from msg |
1.4 日期格式化
使用date_format函数将时间格式化输出
1 | select DATE_FORMAT(now(),'%Y-%m-%d %H:%i:%s'); |
在这个格式化字符串中,你可以把一些值给写死,比如将分钟和秒写死为0点0分;
1 | select DATE_FORMAT(now(),'%Y-%m-%d %H:00:00'); |
最终效果如下
1 | MariaDB [(none)]> select DATE_FORMAT(now(),'%Y-%m-%d %H:%i:%s'); |
年份Y可以为小y,此时只显示年份的后二位
1 | MariaDB [(none)]> select DATE_FORMAT(now(),'%y-%m-%d %H:%i:%s'); |
1.5 字符串转时间
str_to_date
函数可以将给定的时间字符串和给定的字符串时间格式,转换为一个datetime类型
1 | select str_to_date('2024-01-02 20:37:14', '%Y-%m-%d %H:%i:%s'); |
效果如下
1 | MariaDB [(none)]> select str_to_date('2024-01-02 20:37:14', '%Y-%m-%d %H:%i:%s'); |
如果你给定的格式化字符串和时间字符串不符合,则无法成功转换,结果为NULL
1 | MariaDB [(none)]> select str_to_date('2024-01-02 20:37:14', '%y-%m-%d %H:%i:%s'); |
1.6 其他参考函数
以下是比较全的MySQL日期函数,可供参考
点我查看
原文链接:MySQL之日期时间处理函数
1 | -- MySQL日期时间处理函数 |
1.7 自动赋值时间戳
官方文档:https://dev.mysql.com/doc/refman/8.0/en/timestamp-initialization.html
MySQL有时间函数,也可以在插入和操作数据的时候自动帮我们更新时间。下面是一个示例语句,在TIMESTAMP和DATETIME类型中都可以这么使用。
1 | CREATE TABLE t1 ( |
ON UPDATE
语句的含义为当行被更新的时候,就自动更新为当前时间(即更新时间)
举个具体的例子:用户表中,我们的一条记录可以有两个时间字段,一个是更新时间,即用户信息被用户修改后的时间(这个时间可以用来限制用户多久才能修改一次个人信息等操作),另外一个是插入时间,即用户注册的时间。
此时可以让MySQL来自动帮我们维护插入时间和更新时间。
1 | CREATE TABLE your_table ( |
2.字符串函数
函数 | 作用 |
---|---|
charset(str) | 返回字符串的字符集 |
concat(str1,str2[,…]) | 拼接多个字符串 |
instr(str,substr) | 返回substr在str中出现的位置,不存在则返回0 |
ucase(string) | 字符串转大写 |
lcase(string) | 字符串转小写 |
left(string,length)/right(string,length) | 从string的左边/右边起取length个字符 |
length(string) | 字符串长度 |
replace(str,search_str,replace_str) | 将str中的replace_str部分替换为search_str |
strcmp(str1,str2) | 逐字符比较两个字符串的大小 |
substring(str,position [,length]) | 从str的position开始取length个字符 |
ltrim(strin)/rtrim(str)/trim(str) | 去除字符串中的前空格或者后空格 |
简单测试一下这些函数的使用吧
2.1 查看字符串字符集
1 | MariaDB [stu_test]> select charset("你好"); |
2.2 字符串拼接
1 | MariaDB [stu_test]> select concat('你好',',','今天天气不错'); |
2.3 子字符串查询
使用instr查询,在第一个参数中查询第二个参数的字符串。找到了子串后,返回起始位置的偏移量(并非下标),没有找到返回0。
1 | MariaDB [stu_test]> select instr('abcdef','bc'); |
2.4 字符串比较
和C语言中用的是同一个函数名strcmp;
- 第一个字符串更大返回
1
; - 第二个字符串更大返回
-1
; - 两个字符串相同返回
0
(忽略大小写);
注意它的比较是根据字符的ASCII码来逐字符比较的,比如小写字母的ASCII码就更大,所以AB和ad比较的结果是负一。
1 | MariaDB [stu_test]> select strcmp('AB','AB'); |
中文比较应该也是类似的逻辑,只不过中文编码这方面我不太懂,就不深入探究了。
1 | MariaDB [stu_test]> select strcmp('你好','你好吗'); |
2.5 大小写转换
1 | MariaDB [stu_test]> select ucase('adfasbasdf324r'); |
2.6 截取字符串
left和right用于从字符串的左边或右边开始截取给定长度的串
1 | MariaDB [stu_test]> select left('123456',2); |
对于中文而言也是截取两个汉字
1 | MariaDB [stu_test]> select right('这是一个测试',2); |
然后还有substring函数,可以从给定位置截取字符串
1 | MariaDB [stu_test]> select substring('123456',2,2); |
2.7 去除空格
ltrim和rtrim用于去除字符串左侧或者右侧的空格
1 | MariaDB [stu_test]> select ltrim(' 测试'); |
trim是同时去除字符串左侧和右侧的空格,不会对字符串内部的空格做操作
1 | MariaDB [stu_test]> select trim(' 空 格 去除测试 '); |
2.8 字符串长度
注意,当前为了支持中文,我们使用了utf8作为MySQL的字符集,在utf8中中文是3字节存储的
1 | MariaDB [stu_test]> select *,length(name) from stu; |
3.数学函数
函数 | 作用 |
---|---|
abs(num) | 绝对值 |
bin(decimal_num) | 十进制转二进制 |
hex(decimal_num) | 十进制转十六进制 |
conv(num,from_base,to_base) | 进制转换 |
ceiling(num) | 向上取整 |
floor(num) | 向下取整 |
rand() | 返回随机浮点数,范围[0.0, 1.0) |
mod(num,denominator) | 取模,求余 |
format(num,dnum) | 保留num的dnum位小数 |
3.1 绝对值
1 | MariaDB [stu_test]> select abs(-1241.12431); |
3.2 进制转换
十进制转二进制和十六进制
1 | MariaDB [stu_test]> select bin(100); |
在任意进制中转换,源进制和目标进制都是通过数字传入,比如2/8/10/16
;
1 | conv(目标数字,源进制,目标进制); |
测试如下
1 | MariaDB [stu_test]> select conv(100,2,16); |
3.3 向下和向上取整
向下取整和向上取整是基于小数的
- 向下取整:不管小数有几位,都去除小数,整数部分不变;
- 向上取整:不管小数有几位,都去除小数,并把整数部分加一;
1 | MariaDB [stu_test]> select ceiling(99); |
3.4 模运算
1 | mod(a,b); -- 等价于 a/b 的余数 |
效果如下
1 | MariaDB [stu_test]> SELECT MOD(17, 5); |
3.5 小数格式化
使用format函数,第二个参数指定保留几位小数。
1 | MariaDB [stu_test]> select format(3.1415,2); |
3.6 获取随机数
1 | MariaDB [stu_test]> select rand(); |
4.其他函数
函数 | 作用 |
---|---|
user() | 查询当前用户 |
database() | 查询当前所在数据库 |
password(str) | 对密码进行加密 |
md5(str) | 计算字符串的md5 |
ifnull(val1,val2) | 如果val1为null,返回val2,否则返回val1 |
这里只对ifnull函数做个测试
1 | MariaDB [stu_test]> select ifnull(null,'124'); |
The end
关于MySQL内置函数的章节就这些了,如果后续遇到本文没有记录的函数,会更新本文!