MySql基础(存储过程)

为什么使用存储过程
在这里插入图片描述
存储过程可以带参数,也可以返回结果
可以包含数据操纵语句、变量、逻辑控制语句等。
存储过程的优点:

  1. 执行速度更快
  2. 允许模块化程序设计
  3. 提高系统安全性
  4. 减少网络流通量
    存储过程语法
    创建存储过程

CREATE PROCEDURE
存储过程名( 参数1,参数2… )
[存储过程选项]
Begin
Sql语句

End

创建存储过程usp_pname:查询某个产品的供应商姓名、供应商地址、邮政编码,产品名称,产品价格

CREATE PROCEDURE usp_pname()
BEGIN
	SELECT DISTINCT vname,vaddress,vzip,pname,pprice FROM product INNER JOIN recruit 
	ON recruit.pid=product.pid INNER JOIN vendor 
	ON recruit.vid=vendor.vid ; 
END

调用存储过程

CALL  存储过程名称( 参数1,参数2... );

CALL usp_pname('小米Note2');

删除存储过程

DROP PROCEDURE 存储过程名;
DROP PROCEDURE usp_pname;

存储过程的参数
• 和Java语言的方法一样,参数可选
• 参数分为输入参数、输出参数 、输入输出参数
• 输入参数允许有默认值

存储过程的参数分三种:

输入参数
输出参数
输入输出参数

输入参数(in):

向存储过程传入值

CREATE PROCEDURE usp_pname(in name VARCHAR(20))
BEGIN
	SELECT DISTINCT vname,vaddress,vzip,pname,pprice FROM product INNER JOIN recruit 
	ON recruit.pid=product.pid INNER JOIN vendor 
	ON recruit.vid=vendor.vid WHERE pname=name; 
END

CALL usp_pname('小米Note2');

输出参数(out):

调用存储过程后,传出执行结果

创建查找指定科目的最高分 输入参数科目,输出参数分数
CREATE PROCEDURE usp_maxScore(IN suname VARCHAR(10),OUT maxSc INT)
BEGIN
	-- 查询指定科目的最高分
	SELECT MAX(socre) FROM score INNER JOIN `subject` ON score.subid=`subject`.subid
	WHERE subname=suname INTO maxSc;
  -- 把查询的结果赋值给maxSc
END

-- 成员变量 语法: @变量名 @max
CALL usp_maxScore('MySQL',@max);

-- 查询最高分
SELECT @max;

输入输出参数(inout):

把数据传递给存储过程和将存储过程的返回值传递给外部使用者

CREATE PROCEDURE usp_age(INOUT age INT)
BEGIN
 SET age=age+10;
END

-- 定一个变量
SET @age=10;

CALL usp_age(@age);

SELECT @age;

存储过程变量

常用的存储过程变量分为两种:用户变量和局部变量。

(1)用户变量:用户定义的变量就叫用户变量,以"@“开始,形式为”@变量名"。用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效
(2)局部变量:作用范围在begin到end语句块之间。在该语句块里设置的变量。declare语句专门用于定义局部变量。 DECLARE
变量名 [,…] 变量类型[DEFAULT value]

变量之间的区别
局部变量与用户变量的区分在于两点:

用户变量是以"@"开头的。局部变量没有这个符号。 定义变量不同,局部变量使用declare语句定义 。
作用范围。局部变量只在begin-end语句块之间有效。在begin-end语句块运行完之后,局部变量就消失了。

变量赋值

SET 变量名=expr[va_name=expr]...

局部变量

set t1=0;

用户变量

SET @t1=0;
SELECT @t1=0;

变量赋值,SELECT语句

SELECT ... INTO语句
SELECT col_name[,...] INTO var_name[,...] table_expr

存储过程管理

描述 格式
查看存储过程定义 SHOW PROCEDURE STATUS;
查看指定存储过程定义 SHOW CREATE PROCEDURE 存储过程名称
调用存储过程 CREATE PROCEDURE 存储过程名称(参数);
删除存储过程 DROP PROCEDURE 存储过程名;

流程控制语句
MySQL流程控制语句有以下几种:

顺序结构控制语句:BENGIN…END语句。
分支结构控制语句:IF-ELSE和CASE-END语句。
循环结构控制语句:WHILE语句。

IF-ELSE

 IF  条件  THEN 输出结果 
    [ELSE IF   条件 THEN 输出结果 ... 
    [ELSE   输出结果 ] 
    END IF

mysql平均分,大于60分,成绩优秀
CREATE PROCEDURE usp_avgScore()
BEGIN
DECLARE str1 VARCHAR(20);

-- 查询平均成绩
SELECT AVG(socre) FROM score INNER JOIN `subject` ON score.subid=`subject`.subid
WHERE subname='MySQL' INTO @avgScore;

-- 判断
IF @avgScore>60 THEN 
SET str1='成绩优秀';
ELSE 
set str1='成绩差';
END IF;
	SELECT str1 AS 结果;
END

CALL usp_avgScore();

CASE-END

CASE case_value 
WHEN 条件1 THEN 结果1
[WHEN 条件2 THEN 条件2] ... 
[ELSE 其他结果1] 
 END CASE

  CREATE  PROCEDURE usp_bonus(IN bonus INT)
    BEGIN 
        	DECLARE str VARCHAR(30);
        	CASE bonus 
        	WHEN 500 THEN SET str='真少';
        	WHEN 2000 THEN SET str='给点力';	
          WHEN 10000 THEN SET str='够嗨皮的了';	
        	ELSE SET str='真好';
        	END CASE;
        	SELECT str;
    END
    CALL usp_bonus(500);

WHILE语句

WHILE 条件  DO 
sql语句
END WHILE 

使用循环显示1-10之间的奇数
CREATE PROCEDURE even()
BEGIN
	DECLARE num INT;
	SET num=1;
	WHILE num<=10 DO
	SELECT num;
	SET num=num+2;
	END WHILE;
END

CALL even();

猜你喜欢

转载自blog.csdn.net/qq_43529877/article/details/84111777
今日推荐