数据库函数
■ MySQL提供了实现各种功能的函数
■ 常用的函数分类
● 数学函数
● 聚合函数
● 字符串函数
● 日期时间函数
数学函数
■ 常用的数学函数
abs(x)返回x的绝对值
mysql> select abs(3);
mysql> select abs(-2);
rand() 返回0到1的随机数
mysql> select rand();
mod(x,y) 返回x除以y以后的余数
mysql> select mod(10,4);
mysql> select mod(19,2);
round(x)返回离x最近的整数
mysql> select round(9.10);
mysql> select round(10.12);
mysql> select round(13.16);
round(x,y)保留x的y位小数四舍五入后的值
mysql> select round(4.654,2);
mysql> select round(4.656,2);
sqrt(x)返回x的平方根
mysql> select sqrt(81);
mysql> select sqrt(24);
truncate(x,y) 返回数字x截断为y位小数的值
mysql> select truncate(9.762,2);
mysql> select truncate(9.769,2);
ceil(x) 返回大于或等于x的最小整数
mysql> select ceil(10.0001);
mysql> select ceil(12.908);
floor(x)返回小于或等 于x的最大整数
mysql> select floor(13.541);
mysql> select floor(14.128);
### greatest(x1,x2…) 返回集合中最大的值
mysql> select greatest(15,110,150);
mysql> select greatest(118,66,898);
least(x1,x2…)返回集合中最小的值
mysql> select least(127,22,45);
mysql> select least(929,67,332);
聚合函数
■ 对表中数据记录进行集中概括而设计的一类函数
■ 常用的聚合函数
avg()返回指定列的平均值
mysql> select * from cj1;
mysql> select avg(chengji) from cj1;
count()返回指定列中非NULL值的个数
mysql> select count(NULL) from cj1;
mysql> select count(chengji) from cj1;
min()返回指定列的最小值
mysql> select min(chengji) from cj1;
max()返回指定列的最大值
mysql> select max(chengji) from cj1;
sum()返回指定列的所有值之和
mysql> select sum(chengji) from cj1;
字符串函数
常用的字符串函数
length(x) 返回字符串x的长度
mysql> select length('abc');
mysql> select length('abcde');
trim()返回去除指定格式的值
mysql> select trim('abcd');
concat(x,y)将提供的参数x和y拼接成一个字符串
mysql> select concat('abc','def');
upper(x) 将字符串x的所有字母变成大写字母
mysql> select upper('Goodnight');
left(x,y)返回字符串x的前y个字符
mysql> select left('flowers',2);
right(x,y) 返回字符串x的后y个字符
mysql> select right('flowers',2);
repeat(x,y)将字符串x重复y次
mysql> select repeat('night',2);
space(x) 返回x个空格
mysql> select space(5);
mysql> select space(20);
replace(x,y,z) 将字符串z替代字符串x中的字符串y
mysql> select replace('goodnight','o','a');
strcmp(x,y)比较x和y,返回的值可以为-1,0,1
mysql> select strcmp(2,3);
mysql> select strcmp(2,2);
mysql> select strcmp(3,2);
substring(x,y,z)获取从字符串x中的第y个位置开始长度为z的字符串
mysql> select substring('abceagting',3,4);
reverse(x) 将字符串x反转
mysql> select reverse('night');
日期时间函数
■ 常用的日期时间函数
curdate() 返回当前时间的年月日
mysql> select curdate();
curtime() 返回当前时间的时分秒
mysql> select curtime();
now() 返回当前时间的日期和时间
mysql> select now();
month(x) 返回日期x中的月份值
mysql> select month('2020-12-29');
week(x)返回日期x是年度第几个星期
mysql> select week('2020-12-29');
hour(x)返回x中的小时值
mysql> select hour('23:27:26');
minute(x) 返回x中的分钟值
mysql> select minute('23:27:26');
second(x) 返回x中的秒钟值
mysql> select second('23:27:26');
dayofweek(x) 返回x是星期几,1星期日,2星期一
mysql> select dayofweek('2020-12-29');
dayofmonth(x) 计算日期x是本月的第几天
mysql> select dayofmonth('2020-12-29');
dayofyear(x) 计算日期x是本年的第几天
mysql> select dayofyear('2020-12-29');
存储过程简介
■ 是一组为了完成特定功能的SQL语句集合
■ 比传统SQL速度更快、执行效率更高
存储过程的优点
■ 执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率
■ SQL语句加上控制语句的集合,灵活性高
■ 在服务器端存储,客户端调用时,降低网络负载
■ 可多次重复被调用,可随时修改,不影响客户端调用
■ 可完成所有的数据库操作,也可控制数据库的信息访问权限
■ 要创建存储过程,必须要具有CREATE ROUTINE权限
■ 存储过程被创建后,可以多次重复调用,它将多条SQL封装到了一起,可随时针对SQL语句进行修改,不影响调用它的客户端
创建存储过程
■ 使用CREATE PROCEDURE语句创建存储过程
■ 创建存储过程的语法结构
CREATE PROCEDURE <过程名> ( [过程参数[..]]) <过程体> #尽量避免与内置的函数或字段重名
[过程参数[,...]]格式
[ IN| OUT | INOUT] <参数名> <类型>
■ 参数分为
● 输入参数: IN
● 输出参数: OUT
● 输入/输出参数: INOUT
■ 存储过程的主体部分,被称为过程体
■ 以BEGIN开始,以END结束,若只有一-条SQL语句,则可以省略BEGIN-END
■ 以DELIMITER开始和结束
mysql> DELIMITER
/
/
//
//是用户自定义的结束符
//省略存储过程其他步骤
mysql> DELIMITER ; //分号前有空格
不带参数的存储过程
mysql> use zz;
mysql> delimiter $$ #定义结束符
mysql> create procedure zzz() #定义存储过程名字
-> begin
-> create table qq(name varchar(64),score int(3));
-> insert into qq values('zhangsan',90),('lisi',60);
-> select * from qq;
-> end $$
mysql> delimiter ; # 分号前有空格
mysql> call qq();
带参数的存储过程
mysql> use zz;
mysql> delimiter &&
mysql> create procedure getscore(IN a varchar(64))
-> begin
-> select * from zzz1 where name=a;
-> end &&
mysql> delimiter ;
mysql> call getscore('lisi');
修改存储过程
■ 存储过程的修改分为特征修改和内容修改
■ 特征修改的方法
ALTER PROCEDURE <过程名> [ <特征> … ]
■ 内容修改可先删除原有存储过程,之后再创建的方法
删除存储过程
■ 删除存储过程的语法
DROP { PROCEDURE | FUNCTION}[ IF EXISTS ] <过程名> #防止因删除不存在的存储过程而引发的错误
■ 删除的具体用法
mysql> DROP PROCEDURE PlayerRole; #删除之前确认有无依赖关系
Query OK, 0 rows affected (0.0C sec)
mysql> CALL PlayerRole;
ERROR 1305 (42000): PROCEDURE test.PlayerRole does not exist
删除
mysql> drop procedure zzz;
mysql> call zzz();
ERROR 1305 (42000): PROCEDURE aa.cr does not exist
存储过程in、out、inout参数实例与总结
mysql> use zz;
mysql> set @num1=1, @num2=2, @num3=3;
mysql> delimiter $$
mysql> create procedure p(in num1 int, out num2 int, inout num3 int)
-> begin
-> select num1,num2,num3;
-> set num1=10,num2=20,num3=30;
-> select num1,num2,num3;
-> end $$
mysql> delimiter ;
mysql> call p(@num1,@num2,@num3);
mysql> select @num1,@num2,@num3; #查看全局变量的值
总结1: in和inout参数会将全局变量的值传入存储过程中,而out参数不会将全局变量的值传入存储过程中。在存储过程使用中,参数值in、 out、 inout都会发生改变。
总结2:调用完存储过程后,发现in参数不会对全局变量的值引起变化,而out和inout参数调用完存储过程后,会对全局变量的值产生变化,会将存储过程引用后的值赋值给全局变量。
in参数赋值类型可以是变量还有定值,而out和inout参数赋值类型必须是变量。
视图
mysql> create table sushe(id int(10),num int(3));
mysql> insert into sushe values(1,101),(2,102),(3,103),(4,104),(5,105);
mysql> create view stu as select cj.name,sushe.num from cj1 inner join sushe where cj.xuehao=sushe.id;
mysql> select * from stu;