环球科创网

2022年01月05日整理发布:MySQL精讲之五存储过程和函数

更新时间:2022-01-05 21:48:17

导读 我将告诉你关于MySQL的第五讲:存储过程和函数。我相信我的朋友们也应该密切关注这个话题。现在我将告诉你关于MySQL的第五讲:存储过程和函

我将告诉你关于MySQL的第五讲:存储过程和函数。我相信我的朋友们也应该密切关注这个话题。现在我将告诉你关于MySQL的第五讲:存储过程和函数。边肖还收集了关于MySQL第五讲:存储过程和函数的相关信息。我希望你看到后会喜欢。

免费学习推荐:mysql视频教程

文章目录

一、变量系统变量用户自定义变量二。存储过程三。函数一.变量

系统变量

系统变量分为全局变量和会话变量,由系统提供。

全局变量作用域:每次服务器启动时,所有全局变量都会被初始化,不能跨重启。

会话变量范围:仅对当前会话有效。

[全局变量]

Scope :服务器每次启动都会初始化所有全局变量,不能跨重启# 1。查看所有全局变量显示全局变量;# 2.检查一些全局变量SHow GLobaL VARIABLE LIKE“% char %”;# 3.检查全局变量SELECT @@global.autocommit的值;#检查是否自动提交SELECT @ @ global.tx _ isolation#检查隔离等级#4。为指定的全局变量SET @@global.autocommit=0赋值;[会话变量]

作用域:仅对当前会话有效。# 1.查看所有会话变量SHOW SESSION VARIABLES显示变量;#默认情况下省略会话# 2。检查某些会话变量是否显示像“% char%”这样的会话变量;# 3.检查会话变量SELECT @@tx_isolation的值;SELECT @ @ session.tx _ isolation# 4.将SET @@session.autocommit=0分配给指定的会话变量;自定义变量

用户定义的变量分为用户变量和局部变量,它们是用户定义的。

对比范围定义和位置语法用户变量的使用。您必须在当前会话中的任何位置添加@符号。您不需要限定类型。局部变量BEGIN…END只能在BEGIN…END中,第一句一般不需要加@号。您需要限定类型[用户变量]

作用域:对当前会话有效,与会话变量# Declare和initialize #的作用域相同,以下三种方式可以SET @ count=1;# set @ count :=1;# select @ count :=1;#将selectcount (*)分配到来自员工的@ count中;#查看用户变量SELECT @ count[局部变量]

作用域:只在定义的begin end有效,begin end中应用的第一句# declared声明变量名类型;#声明变量名类型默认值;#赋值SET局部变量名=值;#或设置局部变量名:=value# SELECT @局部变量名:=值#使用SELECT局部变量名;[Case] # Case :声明两个变量并赋值初始值,求和,打印#用户变量SET @ m=1;SET @ n=2;SET @ sum=@ m @ n;SELECT @ sum#局部变量[只能在begin中运行.end]DECLARE m INT DEFAULT 1;DECLARE n INT DEFAULT 2;DECLARE SUM INTSET SUM=m n;选择总和;第二,存储过程

定义:预先编译并存储在数据库中的一组sql语句。

存储过程的优点:提高代码的可重用性减少编译和连接次数提高效率。

创建语法:

CREATE PROCEDURE存储过程名(参数列表)BEGIN存储过程体(一个组合的sql语句);结束字符

调用语法:调用存储过程名(参数列表)

删除语法:DROP存储过程名称;

检查语法:如何创建过程存储过程名称;

存储过程的参数没有提到提供三个参数:

输入:您需要输入一个需要由调用者传入的值。输出:输出可用作返回值。INOUT:您可以输入和输出输入和返回值。注意:

如果存储过程只有一句话,BEGIN END可以省略。存储过程体中每个sql语句的末尾都需要一个加号。在存储过程的末尾,DELIMITOR可以用来重写结束标记,即DELIMITOR结束标记。[空参数存储过程] #案例:在管理表中插入五条记录#将后缀重置为$DELIMITER $#创建存储过程创建过程myp1BEGIN

插入管理员(用户名、密码)

VALUES('join1 ',' 000 '),(' join2 ',' 000 '),(' join3 ',' 000 '),(' join4 ',' 000 '),(' join5 ',

39;000');END $# 调用存储过程CALL myp1$ 【带in模式的存储过程】# 案例:创建存储过程,实现根据女神名查询对应的男朋友信息CREATE PROCEDURE myp2(IN beautyName VARCHAR(20))BEGIN SELECT bo.* FROM boys bo RIGHT JOIN beauty b ON bo.id=b.boyfriend_id WHERE b.name=beautyName;END$CALL myp2('柳岩')$# 案例:创建存储过程,查看用户是否登录成功CREATE PROCEDURE myp3(IN username VARCHAR(10),IN PASSWORD VARCHAR(10))BEGIN DECLARE result INT DEFAULT 0;# 声明并初始化 SELECT COUNT(*) INTO result# 赋值 FROM admin WHERE admin.username=username AND PASSWORD=PASSWORD; SELECT IF(result,'成功','失败');#打印变量END$# 调用CALL myp3('john','8888')$ 【带out模式的存储过程】# 案例:根据女神名,返回对应的男神名CREATE PROCEDURE myp4(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20))BEGIN SELECT bo.boyName INTO boyName #赋值 FROM boys bo INNER JOIN beauty b ON b.boyfriend_id=bo.id WHERE b.name=beautyName;END $CALL myp4('热巴',@bName)$ # 不定义,直接使用用户变量填充# 调用SELECT @bName$# 案例:根据女神名,返回对应的男神名和男神魅力值CREATE PROCEDURE myp5(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT userCP INT)BEGIN SELECT bo.boyName,bo.userCP INTO boyName,userCP #赋值 FROM boys bo INNER JOIN beauty b ON b.boyfriend_id=bo.id WHERE b.name=beautyName;END $CALL myp5('热巴',@bName,@usercp)$ # 不定义,直接使用用户变量填充# 调用SELECT @bName,@userCP$【带inout模式的存储过程】# 案例:传入a和b两个值最终a和b都翻倍并返回CREATE PROCEDURE myp6(INOUT a INT,INOUT b INT)BEGIN SET a=a*2; SET b=b*2;END $SET @m=10$SET @n=20$CALL myp6(@m,@n)$SELECT @m,@n$

学习了存储过程尝试完成下列习题吧在这里插入图片描述 习题答案如下↓

【习题答案】# 习题1:创建存储过程实现传入用户名和密码,插入到admin表中DELIMITER $CREATE PROCEDURE test_1(IN username VARCHAR(10), IN loginPwd VARCHAR(10))BEGIN INSERT INTO admin(admin.username,PASSWORD) VALUES(username,loginPwd);END $CALL test_1('admin','111')$# 习题2:创建存储过程或函数实现传入女神编号,返回女神名称和电话CREATE PROCEDURE test_2(IN id INT,OUT NAME VARCHAR(20),OUT phone VARCHAR(20))BEGIN SELECT b.name,b.phone INTO NAME,phone FROM beauty b WHERE b.id=id;END $CALL test_2(1,@n,@p)$SELECT @n,@p;# 习题3:创建存储过程或函数实现传入两个女神的生日,返回大小CREATE PROCEDURE test_3(IN birth1 DATETIME,IN birth2 DATETIME,OUT result INT)BEGIN SELECT DATEDIFF(birth1,birth2) INTO result;END $CALL test_3('1998-1-1',NOW,@result)$SELECT @result$# 习题4:创建存储过程或函数实现传入一个日期格式化成 xx 年 xx 月 xx 日并返回CREATE PROCEDURE test_4(IN mydate DATETIME,OUT strdate VARCHAR(50))BEGIN SELECT DATE_FORMAT(mydate,'%y年%m月%d日') INTO strdate;END $CALL test_4(NOW,@str)$SELECT @str $#习题5:创建存储过程或函数实现传入女神名称返回:女神 and 男神 格式的字符串CREATE PROCEDURE test_5(IN beautyName VARCHAR(20),OUT str VARCHAR(50))BEGIN SELECT CONCAT(beautyName,'and',IFNULL(boyName,'null')) INTO str FROM boys bo RIGHT JOIN beauty b ON b.boyfriend_id=bo.id WHERE b.name=beautyName;END $CALL test_5('热巴',@str)$SELECT @str $#习题6:创建存储过程或函数根据传入的条目数和起始索引查询 beauty 表的记录CREATE PROCEDURE test_6(IN startIndex INT,IN size INT)BEGIN SELECT * FROM beauty LIMIT startIndex,size;END $CALL test_6(3,5)$

三、函数

存储过程和函数的区别

存储过程可以有0个或多个返回;函数有且只有一个返回。存储过程适合做批量插入、批量更新;函数适合做处理数据后返回一个结果。

创建语法:CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型BEGIN函数体(一定有return语句);END 结束符

调用语法:SELECT 函数名(参数列表)

查看函数:SHOW CREATE FUNCTION my_f3;

删除函数:DROP FUNCTION my_f3;

【无参有返回】# 返回公司的员工个数CREATE FUNCTION my_f1 RETURNS INTBEGIN DECLARE n INT DEFAULT 0;# 定义变量 SELECT COUNT(*) INTO n # 赋值 FROM employees; RETURN n;END $SELECT my_f1$ 【有参有返回】# 根据员工名,返回工资CREATE FUNCTION my_f2(empName VARCHAR(20)) RETURNS DOUBLEBEGIN SET @sal=0;# 定义用户变量 SELECT salary INTO @sal # 赋值 FROM employees WHERE last_name=empName; RETURN @sal;END $SELECT my_f2('Kochhar')$# 3.根据部门名,返回该部门平均工资CREATE FUNCTION my_f3(deptName VARCHAR(20)) RETURNS DOUBLEBEGIN DECLARE sal DOUBLE; SELECT AVG(Salary) INTO sal FROM employees e JOIN departments d ON e.department_id=d.department_id WHERE d.department_name=deptName; RETURN sal;END $SELECT my_f3('IT')$

学习了mysql的函数尝试完成下列习题在这里插入图片描述 答案:1、 CREATE FUNCTION test_1(num1 FLOAT,num2 FLOAT) RETURNS FLOAT BEGIN DECLARE SUM FLOAT DEFAULT 0; SET SUM=num1+num2; RETURN SUM; END $ SELECT test_1(1,2)$2、 CREATE FUNCTION test_2(jobName VARCHAR(20)) RETURNS INT BEGIN DECLARE number INT DEFAULT 0; # 定义变量 SELECT COUNT(employee_id) INTO number # 赋值 FROM employees e JOIN jobs j ON e.job_id=j.job_id WHERE j.job_title=jobName; RETURN number; END $ SELECT test_2(‘President’)$3、 CREATE FUNCTION test_3(empName VARCHAR(20)) RETURNS VARCHAR(20) BEGIN DECLARE managerName VARCHAR(20) DEFAULT ‘’; # 定义变量 SELECT e1.last_name AS managerName INTO managerName # 赋值 FROM employees e1 WHERE e1.employee_id=(SELECT e2.manager_id FROM employees e2 WHERE e2.last_name=empName); RETURN managerName; END $ SELECT test_3(‘Kochhar’)$

MySQL精讲系列文章(更新中)《MySQL精讲之一:DQL数据查询语句》《MySQL精讲之二:DML数据操作语句》《MySQL精讲之三:DDL数据定义语句》《MySQL精讲之四:TCL事务控制语句》《MySQL精讲之六:流程控制》

更多相关免费学习推荐:mysql教程(视频)

以上就是MySQL精讲之五:存储过程和函数的详细内容!

来源:php中文网

免责声明:本文由用户上传,如有侵权请联系删除!