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(x)返回x的绝对值,正数的绝对值时本身,负数的绝对值时相反数,0的绝对值是0
select abs(5),abs(1.1),abs(-3.3),abs(0);
函数SQRT(x)返回非负数x的二次方根,负数没有平方根,返回结果为null
select sqrt(25),sqrt(120),sqrt(-9);
函数mod(x,y)返回x被y除后的余数,mod()对于带小数部分的数据也会起作用,返回除法算后的余数
select mod(63,8),mod (120,10),mod(15.5,3);
函数ceil和ceiling的意义是相同的,返回不小于x的最小整数值,返回值转换为一个bigint
select ceil(-2.5),ceil(3.3),ceiling(2.5);
函数floor(x)返回小于x的最大整数值
select floor(5),floor(5.66),floor(-4),floor(-4.66);
生成一个0-1之间的随机数
select rand(),rand(),rand();
返回最近于参数x的整数,round(x)函数对参数x进行四舍五入的操作,
select round(-6.6),round(-8.44),round(3.44);
返回参数的符号x的值为负数,零和正数时分别返回-1,0,1
select sign(-6),sign(0),sign(34);
函数用于计算x的y次方
select pow(5,-2),pow(10,3),power(4,3),pow(100,0),power(6,-3);
sin(x)返回x的正弦值,x值为弧度值
select sin(1),sin(0.5*pi()),pi();
select asin(30),asin(25);
函数名称 | 作用 |
---|---|
length | 计算字符串长度函数, |
concat | 字符串拼接 |
insert | 替换字符串函数 |
lower | 将字符串中的字母转换为小写 |
upper | 将字符串中的字母转换为大写 |
left | 从左侧截取字符串,返回字符串左边的若干个字符 |
right | 从右侧截取字符串,返回字符串右边的若干个字符 |
trim | 删除字符串左右两侧的空格 |
replace | 字符串替换函数,返回替换后的新字符串 |
substr和substring | 截取字符串 |
reverse | 字符串反转 |
返回值为字符串的字节长度,unicode码为utf8,为万国码,变长字符出,一个汉字占3个字节,一个数据或者字母占一个字节
select length('helloworld');
select concat('张三','java'),concat('李','四','java');
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(str)可以将字符串str中的字母全部转换为小写
select lower('张三JAVAZHANGSAN');
upper(str)可以将字符串str中的字母字符全部转换为大写
select upper('张三javazhangsan');
select left('张三java',2),left('李四java',4),left('王五',-1);
select right('张三java',2),right('李四java',4),right('王五',-1);
select ' [ zhagnsan ] ',concat('[ ,李四 ]'),trim( ' [ zhagnsan ] ');
select substr('javaScipt',3)
select substr('javaScipt',3,2)
select reverse('张三java')
函数名称 | 作 用 |
---|---|
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 | 获取指定日期在一周内的对应的工作日索引 |
select curdate(),current_date,current_date+1;
select curtime(),current_time,current_time+1;
select now(),sysdate();
select unix_timestamp();
格式 | 说明 |
---|---|
%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');
select month('2022-9-24'),month(now());
select monthname('2022-9-24'),monthname(now());
select now(),dayname(now());
1表示周天,2表示周一,。。。。
select now(),dayofweek('2022-9-25');
模式 | 一周的第一天 | 范围 |
---|---|---|
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');
select now(),dayofyear(now()),dayofyear('2020-12-31');
select now(),dayofmonth(now()),dayofmonth('2020-12-31');
select now(),year(now()),year('2020-12-31');
select time_to_sec('5:5:5'),now(),time_to_sec(now());
select sec_to_time('18305'),now(),sec_to_time('42004');
select date_add('2022-9-21',interval 365 day );
select date_sub('2022-9-21',interval 365 day );
select addtime('2022-9-24 11:47:36','0:1:1');
select subtime('2022-9-24 11:47:36','0:1:1');
select datediff('2022-9-24','2019-12-26');
select date_format('2022-9-24','%Y年%m月%d日');
select now(),weekday(now());
函数名称 | 作用 |
---|---|
max | 查询指定列的最大值 |
min | 查询指定列的最小值 |
count | 统计查询结果的行数 |
sum | 求和,返回指定列的总和 |
avg | 求平均值,返回指定列数据的平均值 |
函数名称 | 作用 |
---|---|
if | 判断,流程控制 |
ifnull | 判断是否为空 |
case | 搜索语句 |
if(expr,v1,v2)
当expr为真是返回v1的值,为假返回v2的值
select if(1<2,1,0),if(1>5,'√','×');
ifnull(v1,v2):当v1为空则放回v2,当v1有值则放回v1
select ifnull('非空','为空'),ifnull(null,'空'),ifnull('空',null),ifnull(null,null);
方式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 sex
when 1
then '男'
when 2
then '女'
else '未知' end) '性别' from t_stu;
函数名称 | 作用 |
---|---|
version | 数据库版本号 |
database | 当前数据库 |
user | 当前连接用户名 |
password | 返回字符串密码形式 |
md5 | 返回字符串的md5数据 |
select version();
select database();
select user();
select password('123456');
select md5('zhangsan123456lisiwangwu123456')
创建语法:
create function 参数名称(参数1 参数类型1,参数2 参数类型2…) returns 数据类型
begin
函数体;
return(返回值);
end
调用语法:
select 函数名称(传参数);
删除语法:
drop function if exists 自定义函数名称
create function getpi(pi double,r int)
returns double
begin
# 定义一个变量 a 变量为double类型 初始值为0;
declare a double default 0;
set a = pi * r * 2;
return a;
end;
select getpi(3.1415926,3);