MYSQL学习(九)存储过程、函数及流程控制结构

存储过程:一组预先编译好的SQL语句的集合,理解成批处理语句

  1. 提高代码的重用性

  2. 简化操作

  3. 减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率

    #一、创建语法
    /*
    注意:
    1、参数列表包含三部分
    参数模式  参数名  参数类型
    举例:
    IN stuname VARCHAR(20)
    参数模式:
    IN:该参数可以作为输入,也就是该参数需要调用方传入值
    OUT:该参数可以作为输出,也就是该参数可以作为返回值
    INOUT:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值
    2、如果存储过程体仅仅只有一句话,BEGIN END可以省略
    存储过程体中的每句SQL语句的结尾要求必须加分号。
    存储过程的结尾可以使用DELIMITER 重新设置
    语法:
    DELIMITER 结束标记
    案例:
    DELIMITER $
    */
    CREATE PROCEDURE 存储过程名(参数列表)
    BEGIN 
    		存储过程体(一组合法的SQL语句)
    END	
    
    #二、调用语法
    CALL 存储过程名(实参列表);
    
    #1.空参列表
    #案例:插入到admin表中五条记录
    DELIMITER $ -- 结束标记在navicat中使用无效 
    CREATE PROCEDURE myp1()
    BEGIN 
    INSERT into admin(username,`password`) VALUES ('john','000'),('tom','001'),('jack','002'),('rpse','004'),('cindy','0045');
    END $
    
    #调用
    CALL myp1()$ -- 由于结束标记在navicat中无效,直接CALL myp1()即可 

    在DOS可用结束标记:

     

     

    #2.创建存储过程实现 
    #创建带in模式的存储过程
    -- 案例:用户是否登录成功
    CREATE PROCEDURE myp3(IN username VARCHAR(20),IN PASSWORD VARCHAR(20))
    BEGIN 
    		DECLARE result INT DEFAULT 0 ;-- 声明并初始化
    		SELECT count(*) INTO result -- 赋值
    		FROM admin
    		WHERE admin.username = username
    		AND admin.`password` = PASSWORD;
    		
    		SELECT IF(result>0,'success','fail');
    END 
    #调用
    CALL myp3('张飞','8888')
    
    #创建带out模式的存储过程
    #案例1:根据女生名,返回对应的男生名
    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 bo.id = b.boyfriend_id
    	WHERE b.`name` = beautyName;
    END 
    
    # 调用
    CALL myp4('小昭',@bName);
    SELECT @bName;
    
    #案例2:根据女生名,返回对应的男生名和男生魅力值(多个Out写法)
    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 bo.id = b.boyfriend_id
    	WHERE b.`name` = beautyName;
    END 
    #调用
    CALL myp5('小昭',@bName,@userCP);
    
    #创建带INOUT模式的存储过程
    #案例1:传入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;
    
    #二、删除存储过程
    #语法:drop procedure 存储过程名
    DROP PROCEDURE myp1; #只能单个删除
    
    #三、查看存储过程的信息
    SHOW CREATE PROCEDURE myp2;
    

函数

函数:一组预先编译好的SQL语句的集合,理解成批处理语句

  1. 提高代码的重用性

  2. 简化操作

  3. 减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率

函数与存储过程的区别

存储过程:可以有0个返回,也可以有多个返回,适合做批量插入、批量刷新

函数:有且仅有1个返回,适合做处理属于后返回一个结果

#一、创建语法
/*
注意:
1.参数列表包含两部分:
参数名 参数类型
2.函数体:肯定会有return语句,如果没有会报错
如果return语句没有放在函数体的最后也不会报错,但不建议

return 值;
3.函数体中仅有一句话,可以省略BEGIN END
4.使用DELIMITER 语句设置结束标记
*/
CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN	
	函数体
END	
#二、调用语法
SELECT 函数名(参数列表)

#1.无参有返回
#案例:返回公司的员工个数
CREATE FUNCTION myf1() RETURNS INT
BEGIN 
		DECLARE c INT DEFAULT 0;#定义局部变量(也可以用户变量)
		SELECT COUNT(*) INTO c #赋值
		FROM employees;
		RETURN c;
END 

SELECT myf1();
 
#2.有参又返回
#案例2:根据员工名,返回其工资
CREATE FUNCTION myf2(empName VARCHAR(20)) RETURNS DOUBLE
BEGIN
	SET @sal=0;#定义用户变量
	SELECT salary INTO @sal #赋值
	FROM employees
	WHERE last_name = empName;
	RETURN @sal;
END

SELECT myf2('Ernst')

#三、查看函数
SHOW CREATE FUNCTION myf2;
#四、删除函数
DROP FUNCTION myf2;

流程控制结构

顺序结构:程序从上往下依次执行

分支结构:程序从两条或多条路径中选择一条去执行

循环结构:程序在满足一定条件的基础上,重复执行一段代码

#一、分支结构
#1.if函数
功能:实现简单的双分支
语法:
IF(表达式1,表达式2,表达式3)
执行顺序:如果表达式1诚意,则返回表达式2的值,否则返回表达式3的值
应用:
#2.case结构
情况1:类似于java中的switch语句,一般用于实现的等值的判断
语法:
CASE 变量|表达式|字段
WHEN 要判断的值 THEN 返回的值1 或 语句1;
WHEN 要判断的值 THEN 返回的值2 或 语句2;
...
ELSE 要返回的值 N 或 语句N;
END CASE;
情况2:类型于java中的多重IF语句,一般用于实现区间判断
语法:
CASE 
WHEN 要判断的条件 THEN 返回的值1 或 语句1;
WHEN 要判断的条件 THEN 返回的值2 或 语句2;
...
ELSE 要返回的值 N 或 语句N;
END CASE;

特点:
①
可以作为表达式,嵌套在其他语句中使用,可以放在任何地方,BEGIN END 中或 BEGIN END 的外面
可以作为独立的语句去使用,只能放在 BEGIN END	中 
②
如果WHEN中的值满足或条件成立,则执行对应的THEN后面的语句,并且结束CASE
如果都不满足,则执行ELSE 中语句或值
③ELSE可以省略,如果ELSE省略了,并且所有WHEN条件都不满足,则返回NULL

#案例:创建存储过程,根据传入的成绩,来显示等级
CREATE PROCEDURE test_case(IN score INT)
BEGIN 
		CASE 
		WHEN score>=90 AND score<=100 THEN SELECT 'A';
		WHEN score>=80 THEN SELECT 'B';
		WHEN score>=60 THEN SELECT 'C'; 
		ELSE SELECT 'D';
		END CASE;
END

CALL test_case(95);

#3.if结构
/*
功能:实现多重分支
语法:
if 条件1 then 语句1;
elseif 条件2 then 语句2;
...
else 语句n;
应用在begin end中
*/
CREATE FUNCTION test_if(score INT) RETURNS CHAR
BEGIN 
		IF score>=90 AND score<=100 THEN RETURN 'A';
		ELSEIF score>=80 THEN RETURN 'B';
		ELSEIF score>=60 THEN RETURN 'C'; 
		ELSE RETURN 'D';
		END IF;
END

SELECT test_if(95);

#二、循环结构
/*
分类:
while 、 loop、repeat
循环控制:
iterate 类似于 continue,继续,结束本次循环,继续下一次
leave 类型break,跳出,结束当前所在循环
*/
#1、while语法
【标签:】while 循环条件 do
		循环体;
end while 【标签】; -- 写了标签可以搭配循环控制去用
#2、loop
【标签:】loop 循环条件 do
		循环体;
end loop 【标签】;
#3、repeat
【标签:】repeat 
		循环体;
until 结束循环的条件
end repeat 【标签】;

#案例:批量插入,根据次数插入到admin表中多条记录
CREATE PROCEDURE pro_while(IN insertCount INT)
BEGIN
		DECLARE i INT DEFAULT 1;
		WHILE i<=insertCount DO
		INSERT INTO admin (username,`password`) VALUES(CONCAT('while',i),'666');
		SET i = i+1;
		END WHILE;
END

CALL pro_while(100);

#案例:批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止
CREATE PROCEDURE pro_leave(IN insertCount INT)
BEGIN
	DECLARE i INT DEFAULT 1;
	a:WHILE i<insertCount DO
					INSERT INTO admin (username,`password`) VALUES(CONCAT('leave',i),'777');
					IF i>=20 THEN LEAVE a;
					END IF;
					SET i = i+1;
	END WHILE a;
END

CALL pro_leave(100);

#案例:批量插入,根据次数插入到admin表中,只插入偶数次
CREATE PROCEDURE pro_iterate(IN insertCount INT)
BEGIN
	DECLARE i INT DEFAULT 1;
	a:WHILE i<insertCount DO
					SET i = i+1;
					IF MOD(i,2) THEN ITERATE a;
					END IF;
					INSERT INTO admin (username,`password`) VALUES(CONCAT('iterate',i),'888');
	END WHILE a;
END

CALL pro_iterate(100);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值