0
点赞
收藏
分享

微信扫一扫

MySQL存储过程和存储函数之存储过程

腾讯优测 2022-01-08 阅读 135

目录

1.存储过程和函数的概念

2.存储过程和函数的好处

3.存储过程和函数的区别

4.创建存储过程

5.调用存储过程

6.查看存储过程

7.删除存储过程

8.存储过程语法

8.1存储过程语法介绍

8.2变量的使用

8.3if语句的使用

8.4参数的传递

8.5case语句的使用

8.6while循环

8.7repeat循环

8.8loop循环


1.存储过程和函数的概念

  • 存储过程和函数是 事先经过编译并存储在数据库中的一段 SQL 语句的集合

2.存储过程和函数的好处

  • 存储过程和函数可以重复使用,减轻开发人员的工作量。类似于java中方法可以多次调用

  • 减少网络流量,存储过程和函数位于服务器上,调用的时候只需要传递名称和参数即可

  • 减少数据在数据库和应用服务器之间的传输,可以提高数据处理的效率

  • 将一些业务逻辑在数据库层面来实现,可以减少代码层面的业务处理

3.存储过程和函数的区别

  • 函数必须有返回值

  • 存储过程没有返回值

4.创建存储过程

  • 小知识

  • 数据准备

    -- 创建db8数据库
    CREATE DATABASE db8;
    
    -- 使用db8数据库
    USE db8;
    
    -- 创建学生表
    CREATE TABLE student(
    	id INT PRIMARY KEY AUTO_INCREMENT,	-- 学生id
    	NAME VARCHAR(20),					-- 学生姓名
    	age INT,							-- 学生年龄
    	gender VARCHAR(5),					-- 学生性别
    	score INT                           -- 学生成绩
    );
    -- 添加数据
    INSERT INTO student VALUES (NULL,'张三',23,'男',95),(NULL,'李四',24,'男',98),
    (NULL,'王五',25,'女',100),(NULL,'赵六',26,'女',90);
    
    -- 按照性别进行分组,查询每组学生的总成绩。按照总成绩的升序排序
    SELECT gender,SUM(score) getSum FROM student GROUP BY gender ORDER BY getSum ASC;
  • 创建存储过程语法

  • 创建存储过程

    -- 修改分隔符为$
    DELIMITER $
    
    -- 创建存储过程,封装分组查询学生总成绩的sql语句
    CREATE PROCEDURE stu_group()
    BEGIN
    	SELECT gender,SUM(score) getSum FROM student GROUP BY gender ORDER BY getSum ASC;
    END$
    
    -- 修改分隔符为分号
    DELIMITER ;

5.调用存储过程

  • 调用存储过程语法

6.查看存储过程

  • 查看存储过程语法

7.删除存储过程

  • 删除存储过程语法

8.存储过程语法

8.1存储过程语法介绍

  • 存储过程是可以进行编程的。意味着可以使用变量、表达式、条件控制语句、循环语句等,来完成比较复杂的功能!

8.2变量的使用

  • 定义变量

 

  • 变量的赋值1
  • 变量的赋值2

 

8.3if语句的使用

  • 标准语法
  • 案例演示:
    /*
    	定义一个int变量,用于存储班级总成绩
    	定义一个varchar变量,用于存储分数描述
    	根据总成绩判断:
    		380分及以上    学习优秀
    		320 ~ 380     学习不错
    		320以下       学习一般
    */
    DELIMITER $
    
    CREATE PROCEDURE pro_test4()
    BEGIN
    	-- 定义总分数变量
    	DECLARE total INT;
    	-- 定义分数描述变量
    	DECLARE description VARCHAR(10);
    	-- 为总分数变量赋值
    	SELECT SUM(score) INTO total FROM student;
    	-- 判断总分数
    	IF total >= 380 THEN 
    		SET description = '学习优秀';
    	ELSEIF total >= 320 AND total < 380 THEN 
    		SET description = '学习不错';
    	ELSE 
    		SET description = '学习一般';
    	END IF;
    	
    	-- 查询总成绩和描述信息
    	SELECT total,description;
    END$
    
    DELIMITER ;
    
    -- 调用pro_test4存储过程
    CALL pro_test4();
     

8.4参数的传递

  • 参数传递的语法
  • 输入参数
    • 标准语法

       案例演示:

      /*
      	输入总成绩变量,代表学生总成绩
      	定义一个varchar变量,用于存储分数描述
      	根据总成绩判断:
      		380分及以上  学习优秀
      		320 ~ 380    学习不错
      		320以下      学习一般
      */
      DELIMITER $
      
      CREATE PROCEDURE pro_test5(IN total INT)
      BEGIN
      	-- 定义分数描述变量
      	DECLARE description VARCHAR(10);
      	-- 判断总分数
      	IF total >= 380 THEN 
      		SET description = '学习优秀';
      	ELSEIF total >= 320 AND total < 380 THEN 
      		SET description = '学习不错';
      	ELSE 
      		SET description = '学习一般';
      	END IF;
      	
      	-- 查询总成绩和描述信息
      	SELECT total,description;
      END$
      
      DELIMITER ;
      
      -- 调用pro_test5存储过程
      CALL pro_test5(390);
      CALL pro_test5((SELECT SUM(score) FROM student));

  • 输出参数
    • 标准语法
    •  案例演示
      /*
      	输入总成绩变量,代表学生总成绩
      	输出分数描述变量,代表学生总成绩的描述
      	根据总成绩判断:
      		380分及以上  学习优秀
      		320 ~ 380    学习不错
      		320以下      学习一般
      */
      DELIMITER $
      
      CREATE PROCEDURE pro_test6(IN total INT,OUT description VARCHAR(10))
      BEGIN
      	-- 判断总分数
      	IF total >= 380 THEN 
      		SET description = '学习优秀';
      	ELSEIF total >= 320 AND total < 380 THEN 
      		SET description = '学习不错';
      	ELSE 
      		SET description = '学习一般';
      	END IF;
      END$
      
      DELIMITER ;
      
      -- 调用pro_test6存储过程
      CALL pro_test6(310,@description);
      
      -- 查询总成绩描述
      SELECT @description;

    • 小知识:

8.5case语句的使用

  • 标准语法1
  • 标准语法2
  • 案例演示
    /*
    	输入总成绩变量,代表学生总成绩
    	定义一个varchar变量,用于存储分数描述
    	根据总成绩判断:
    		380分及以上  学习优秀
    		320 ~ 380    学习不错
    		320以下      学习一般
    */
    DELIMITER $
    
    CREATE PROCEDURE pro_test7(IN total INT)
    BEGIN
    	-- 定义变量
    	DECLARE description VARCHAR(10);
    	-- 使用case判断
    	CASE
    	WHEN total >= 380 THEN
    		SET description = '学习优秀';
    	WHEN total >= 320 AND total < 380 THEN
    		SET description = '学习不错';
    	ELSE 
    		SET description = '学习一般';
    	END CASE;
    	
    	-- 查询分数描述信息
    	SELECT description;
    END$
    
    DELIMITER ;
    
    -- 调用pro_test7存储过程
    CALL pro_test7(390);
    CALL pro_test7((SELECT SUM(score) FROM student));

8.6while循环

  • 标准语法
  • 案例演示
    /*
    	计算1~100之间的偶数和
    */
    DELIMITER $
    
    CREATE PROCEDURE pro_test8()
    BEGIN
    	-- 定义求和变量
    	DECLARE result INT DEFAULT 0;
    	-- 定义初始化变量
    	DECLARE num INT DEFAULT 1;
    	-- while循环
    	WHILE num <= 100 DO
    		-- 偶数判断
    		IF num%2=0 THEN
    			SET result = result + num; -- 累加
    		END IF;
    		
    		-- 让num+1
    		SET num = num + 1;         
    	END WHILE;
    	
    	-- 查询求和结果
    	SELECT result;
    END$
    
    DELIMITER ;
    
    -- 调用pro_test8存储过程
    CALL pro_test8();

8.7repeat循环

  • 标准语法
  • 案例演示
    /*
    	计算1~10之间的和
    */
    DELIMITER $
    
    CREATE PROCEDURE pro_test9()
    BEGIN
    	-- 定义求和变量
    	DECLARE result INT DEFAULT 0;
    	-- 定义初始化变量
    	DECLARE num INT DEFAULT 1;
    	-- repeat循环
    	REPEAT
    		-- 累加
    		SET result = result + num;
    		-- 让num+1
    		SET num = num + 1;
    		
    		-- 停止循环
    		UNTIL num>10
    	END REPEAT;
    	
    	-- 查询求和结果
    	SELECT result;
    END$
    
    DELIMITER ;
    
    -- 调用pro_test9存储过程
    CALL pro_test9();

8.8loop循环

  •  标准语法
  • 案例演示
    /*
    	计算1~10之间的和
    */
    DELIMITER $
    
    CREATE PROCEDURE pro_test10()
    BEGIN
    	-- 定义求和变量
    	DECLARE result INT DEFAULT 0;
    	-- 定义初始化变量
    	DECLARE num INT DEFAULT 1;
    	-- loop循环
    	l:LOOP
    		-- 条件成立,停止循环
    		IF num > 10 THEN
    			LEAVE l;
    		END IF;
    	
    		-- 累加
    		SET result = result + num;
    		-- 让num+1
    		SET num = num + 1;
    	END LOOP l;
    	
    	-- 查询求和结果
    	SELECT result;
    END$
    
    DELIMITER ;
    
    -- 调用pro_test10存储过程
    CALL pro_test10();

 

 

 

举报

相关推荐

0 条评论