MySQL函数
函数
MySQL函数与其存储过程类似,是一系列完成某种功能的SQL语句。函数一旦定义后,与过程一样是存储在MySQL的服务器上。调用函数就是一次性执行这些语句。所以函数可以降低语句重复。
MySQL本身提供了内置函数,这些函数的存在给我们日常的开发和数据操作带来了很大的便利,MySQL提供的常用函数包括聚合函数,字符串函数,日期时间函数,控制流函数等。
MySQL除了可以使用它提供的内置函数外,我们亦可以按照我们的要求来实现我们自己的功能,可是这个函数式系统不能提供的因为这中需求的不确定性。因此我们需要自己来解决这种需求。还好MySQL设计的扩展性给了我们这个机会,我们可以通过自定义函数的功能解决这个问题。
函数名称 | 作用 |
---|---|
abs | 绝对值 |
mod | 求余数 |
sqrt | 求二次方根 |
ceil和ceiling | 都是小于参数的最小整数,向上取整 |
floor | 向下取整,返回值转换为bigint |
rand | 生成0-1的之间的随机数 |
round | 四舍五入 |
sign | 返回带参数的符号 |
pow和 power | 都是所传代数的次方的结果值 |
sin | 求正弦值 |
asin | 求反正弦值, |
cos | 求余弦值 |
acos | 求反余弦值 |
tan | 求正切值 |
atan | 求反正切值 |
cot | 求余切值 |
abs:求绝对值
函数abs(x)返回x的绝对值,正数的绝对值时本身,负数的绝对值时相反数,0的绝对值是0
select abs(5),abs(1.1),abs(-3.3),abs(0);
sqrt:求二次方根(开方)
函数SQRT(x)返回非负数x的二次方根,负数没有平方根,返回结果为null
select sqrt(25),sqrt(120),sqrt(-9);
mod:求余数
函数mod(x,y)返回x被y除后的余数,mod()对于带小数部分的数据也会起作用,返回除法算后的余数
select mod(63,8),mod (120,10),mod(15.5,3);
ceil和ceiling:向上取整
函数ceil和ceiling的意义是相同的,返回不小于x的最小整数值,返回值转换为一个bigint
select ceil(-2.5),ceil(3.3),ceiling(2.5);
floor:向下取整
函数floor(x)返回小于x的最大整数值
select floor(5),floor(5.66),floor(-4),floor(-4.66);
rand:生成一个随机数
生成一个0-1之间的随机数
select rand(),rand(),rand();
round:四舍五入
返回最近于参数x的整数,round(x)函数对参数x进行四舍五入的操作,
select round(-6.6),round(-8.44),round(3.44);
sign:返回参数的符号
返回参数的符号x的值为负数,零和正数时分别返回-1,0,1
select sign(-6),sign(0),sign(34);
pow和 power:次方函数
函数用于计算x的y次方
select pow(5,-2),pow(10,3),power(4,3),pow(100,0),power(6,-3);
sin:正弦函数
sin(x)返回x的正弦值,x值为弧度值
select sin(1),sin(0.5*pi()),pi();
asin:求反正弦值,
select asin(30),asin(25);
MySQL字符串函数
函数名称 | 作用 |
---|---|
length | 计算字符串长度函数, |
concat | 字符串拼接 |
insert | 替换字符串函数 |
lower | 将字符串中的字母转换为小写 |
upper | 将字符串中的字母转换为大写 |
left | 从左侧截取字符串,返回字符串左边的若干个字符 |
right | 从右侧截取字符串,返回字符串右边的若干个字符 |
trim | 删除字符串左右两侧的空格 |
replace | 字符串替换函数,返回替换后的新字符串 |
substr和substring | 截取字符串 |
reverse | 字符串反转 |
length:返回字符串长度
返回值为字符串的字节长度,unicode码为utf8,为万国码,变长字符出,一个汉字占3个字节,一个数据或者字母占一个字节
select length('helloworld');
concat:字符串拼接
select concat('张三','java'),concat('李','四','java');
insert:替换字符串
insert(s1,x,len,s2)返回字符串s1,子字符串起始于x位置,并且用len个字符长的字符串代替为s2
select insert('java',2,4,'**')As col1,insert('shell',-1,4,'**')as col2,insert('张三学习java',3,20,'**')as col3;
lower:将字母转换为小写
lower(str)可以将字符串str中的字母全部转换为小写
select lower('张三JAVAZHANGSAN');
upper:将字母转换为大写
upper(str)可以将字符串str中的字母字符全部转换为大写
select upper('张三javazhangsan');
left:从左侧截取字符串
select left('张三java',2),left('李四java',4),left('王五',-1);
right:从右侧截取字符串
select right('张三java',2),right('李四java',4),right('王五',-1);
trim:删除字符串两侧空格
select ' [ zhagnsan ] ',concat('[ ,李四 ]'),trim( ' [ zhagnsan ] ');
substr和substring截取字符串
select substr('javaScipt',3)
select substr('javaScipt',3,2)
reverse:反转字符串
select reverse('张三java')
MySQL日期和时间函数
函数名称 | 作 用 |
---|---|
curdate 和 current_date | 两个函数作用相同,返回当前系统的日期值 |
curtime 和 current_time | 两个函数作用相同,返回当前系统的时间值 |
now 和 sysdate | 两个函数作用相同,返回当前系统的日期和时间值 |
unix_timestamp | 获取UNIX时间戳函数,返回一个以 UNIX 时间戳为基础的无符号整数 |
from_unixtime | 将 UNIX 时间戳转换为时间格式,与UNIX_TIMESTAMP互为反函数 |
month | 获取指定日期中的月份 |
monthname | 获取指定日期中的月份英文名称 |
dayname | 获取指定曰期对应的星期几的英文名称 |
dayofweek | 获取指定日期是一周中是第几天,返回值范围是1~7,1=周日 |
week | 获取指定日期是一年中的第几周,返回值的范围是否为 0〜52 或 1〜53 |
dayofyear | 获取指定曰期是一年中的第几天,返回值范围是1~366 |
dayofmonth | 获取指定日期是一个月中是第几天,返回值范围是1~31 |
year | 获取年份,返回值范围是 1970〜2069 |
time_to_sec | 将时间参数转换为秒数 |
sec_to_time | 将秒数转换为时间,与TIME_TO_SEC 互为反函数 |
date_add 和 adddate | 两个函数功能相同,都是向日期添加指定的时间间隔 |
date_sub 和 subdate | 两个函数功能相同,都是向日期减去指定的时间间隔 |
addtime | 时间加法运算,在原始时间上添加指定的时间 |
subtime | 时间减法运算,在原始时间上减去指定的时间 |
datediff | 获取两个日期之间间隔,返回参数 1 减去参数 2 的值 |
date_format | 格式化指定的日期,根据参数返回指定格式的值 |
weekday | 获取指定日期在一周内的对应的工作日索引 |
curdate 和 current_date:返回当前系统的日期值
select curdate(),current_date,current_date+1;
curtime 和 current_time:返回系统当前时间
select curtime(),current_time,current_time+1;
now 和 sysdate:获取当前时间日期
select now(),sysdate();
unix_timestamp:获取unix时间戳
select unix_timestamp();
from_unixtime:时间戳转日期
格式 | 说明 |
---|---|
%M | 月名字 |
%W | 星期名字 |
%D | 有英语前缀的月份和日期 |
%Y | 年,数字,4位 |
%y | 年,数字,2位 |
%d | 月份的天数,(00-31) |
%e | 月份的天数,(0-31) |
%a | 缩写的星期名字 |
%m | 月,数字(01-12) |
%c | 月,数字(1-12) |
%b | 缩写的月份名字(Jan-Dec) |
%j | 一年中的天数(001-366) |
%H | 小时(00-23) |
%h | 小时(01-12) |
%l(L的小写) | 小时(1-12) |
%k | 小时(0-23) |
%I(i的大写) | 小时(01-12) |
%i | 分钟,数字(00-59) |
%S | 秒(00-59) |
%s | 秒(00-59) |
%r | 时间,12小时(hh:mm:ss [AP]M) |
%T | 时间,24小时(hh:mm:ss) |
%p | AM或者PM |
%U | 星期(0-52)星期天是星期第一天 |
%u | 星期(0-52)星期一是星期的第一天 |
%% | 输出% |
select from_unixtime(1663989244),from_unixtime(1663989244,'%Y-%m-%d %H:%i:%s');
month:指定日期的月份
select month('2022-9-24'),month(now());
monthname:获取指定日期月份的英文名称
select monthname('2022-9-24'),monthname(now());
dayname:获取指定日期的星期名称
select now(),dayname(now());
dayofweek:获取日期对应的周索引
1表示周天,2表示周一,。。。。
select now(),dayofweek('2022-9-25');
week:获取指定日期是一年中的第几周
模式 | 一周的第一天 | 范围 |
---|---|---|
0 | 星期日 | 0-53 |
1 | 星期一 | 0-53 |
2 | 星期日 | 1-53 |
3 | 星期一 | 1-53 |
4 | 星期日 | 0-53 |
5 | 星期一 | 0-53 |
6 | 星期日 | 1-53 |
7 | 星期一 | 1-53 |
select now(),week('2022-12-31');
dayofyear:获取指定曰期是一年中的位置
select now(),dayofyear(now()),dayofyear('2020-12-31');
dayofmonth:获取指定日期在一个月的位置
select now(),dayofmonth(now()),dayofmonth('2020-12-31');
year:获取年份
select now(),year(now()),year('2020-12-31');
time_to_sec:将时间转换位秒值
select time_to_sec('5:5:5'),now(),time_to_sec(now());
sec_to_time:将秒转换为时间格式
select sec_to_time('18305'),now(),sec_to_time('42004');
date_add 和 adddate:向日期添加指定时间间隔
select date_add('2022-9-21',interval 365 day );
date_sub 和 subdate:日期减法运算
select date_sub('2022-9-21',interval 365 day );
addtime:时间加法运算
select addtime('2022-9-24 11:47:36','0:1:1');
subtime:时间减法运算
select subtime('2022-9-24 11:47:36','0:1:1');
datediff:获取两个时间的时间间隔
select datediff('2022-9-24','2019-12-26');
date_format:格式化指定的日期
select date_format('2022-9-24','%Y年%m月%d日');
weekday:获取指定日期在一周内的索引位置
select now(),weekday(now());
MySQL聚合函数
函数名称 | 作用 |
---|---|
max | 查询指定列的最大值 |
min | 查询指定列的最小值 |
count | 统计查询结果的行数 |
sum | 求和,返回指定列的总和 |
avg | 求平均值,返回指定列数据的平均值 |
MySQL流程控制函数
函数名称 | 作用 |
---|---|
if | 判断,流程控制 |
ifnull | 判断是否为空 |
case | 搜索语句 |
if:判断
if(expr,v1,v2)
当expr为真是返回v1的值,为假返回v2的值
select if(1<2,1,0),if(1>5,'√','×');
ifnull:判断是否为空
ifnull(v1,v2):当v1为空则放回v2,当v1有值则放回v1
select ifnull('非空','为空'),ifnull(null,'空'),ifnull('空',null),ifnull(null,null);
case:搜索语句
方式1:
case <表示式>
when<值1> then<操作>
。。。
else<操作>
end case;
方式2:
case
when<值1> then<命令>
。。。
else commands
end case;
create table t_stu(id int auto_increment comment '学号',name varchar(20) comment '姓名',sex tinyint comment '性别,0:未知,1:男,2:女',primary key (id)
)charset = utf8mb4 collate = utf8mb4_bin engine = InnoDB;insert into t_stu(name,sex) values ('张三',1),('李四',2),('王五',1);
insert into t_stu(name, sex) values ('赵六',3),('唐七',0);select id, name, sex from t_stu;
需求:查询所有学生信息,输出姓名,性别(男,女,未知)
select name '名字', (case sexwhen 1then '男'when 2then '女'else '未知' end) '性别' from t_stu;
其他函数
函数名称 | 作用 |
---|---|
version | 数据库版本号 |
database | 当前数据库 |
user | 当前连接用户名 |
password | 返回字符串密码形式 |
md5 | 返回字符串的md5数据 |
select version();
select database();
select user();
select password('123456');
select md5('zhangsan123456lisiwangwu123456')