栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

MySQL学习总结(九)——变量、存储过程、函数和流程控制

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MySQL学习总结(九)——变量、存储过程、函数和流程控制

变量、存储过程、函数和流程控制
  • 一、变量
    • 1、系统变量
      • (1)全局变量和会话变量作用域
      • (2)系统变量创建、赋值、使用语法
    • 2、自定义变量
      • (1)用户变量
      • (2)局部变量
      • (3)用户变量和局部变量的比较:
  • 二、存储过程
    • 1、存储过程
    • 2、存储过程的好处
    • 3、存储过程创建语法:
    • 4、存储过程调用语法
    • 5、使用案例
      • (1)创建空参列表的存储过程
      • (2)创建带in模式参数的存储过程。
      • (3)创建带out模式的存储过程
      • (4)创建带inout模式参数的存储过程
    • 6、删除和查看存储过程
  • 三、函数
    • 1、函数和存储过程的区别
    • 2、创建语法
    • 3、调用语法
    • 4、案例演示
      • (1)无参有返回
      • (2)有参有返回
    • 5、函数的查看和删除
      • (1)函数的查看
      • (2)函数的删除
  • 四、流程控制
    • 1、分支结构
      • (1)IF函数
      • (2)case结构
      • (3)IF结构
    • 2、循环结构
      • (1)分类
      • (2)语法
      • (3)案例:

所有数据库学习总结文章均是根据B站尚硅谷视频总结而来,视频链接如下:
[https://www.bilibili.com/video/BV12b411K7Zu]

一、变量 1、系统变量

系统变量可分为全局变量和会话变量。使用时全局级别需要加GLOBAL,会话级别加SESSION,如果不写默认SESSION

(1)全局变量和会话变量作用域

全局变量服务器每次启动将为所有的全局变量赋予初始值,对所有的会话连接有效;会话变量仅仅针对于当前会话有效。

(2)系统变量创建、赋值、使用语法
①查看所有的全局变量/会话变量
语法;
SHOW GLOBAL/【SESSION可省略】 VARIABLES;
例如:
SHOW GLOBAL VARIABLES;   #查看全局变量
SHOW VARIABLES;    #查看会话变量
SHOW SESSION VARIABLES;   #查看会话变量

②查看满足条件的部分系统变量
SHOW GLOBAL/【SESSION可省略】 VARIABLES LIKE '%ASA%'; #查看包含ASA的变量

③查看指定的某个系统变量
语法:
SELECt @@GLOBAL/【SESSION可选】.系统变量名;
举例:
SELECT @@global.autocommit;  #查看指定全局变量的值
SELECT @@tx_isolation;   #查看指定会话变量的值
SELECT @@session.tx_isolation;   #查看指定会话变量的值

④为某个具体的系统变量赋值
语法:
   方式一:SET GLOBAL/【SESSION可选】 系统变量名=值;
   方式二:SET @@GLOBAL/【SESSION可选】.系统变量名=值;
举例:
SET @@global.autocommit=0;    #为全局变量赋值
SET @@session.autocommit=0;   #为会话变量赋值
SET SESSION autocommit=0;   #为会话变量赋值
2、自定义变量

自定义变量分为:用户变量和局部变量。

(1)用户变量

①作用域:针对于当前会话(连接)有效,用于会话变量作用域。

②创建、赋值和使用语法:

声明并初始化
  SET @用户变量名=值;
  SET @用户变量名 :=值;
  或 SELECT @用户变量名:=值;
赋值
  方式一:初始化赋值;
  方式二:通过 SELECT INTO
    SELECT 字段 INTO 变量名 FROM 表;	
使用(查看、比较、运算等)
   SELECt @用户变量名;
(2)局部变量

①作用域:仅仅在定义它的begin and中有效,并且应放在begin and里边第一句。

②创建、赋值和使用语法:

声明
  DECLARE 局部变量名 类型;
  DECLARE 局部变量名 类型 DEFAULT 值;
赋值
   方式一:通过SET或SELECT
	   SET 局部变量名=值;
	   SET 局部变量名:=值;
	   SELECT @局部变量名:=值;
   方式二:通过 SELECT INTO
	   SELECT 字段 INTO 局部变量名 FROM 表;
使用
    SELECt 局部变量名;
(3)用户变量和局部变量的比较:
比较特点用户变量局部变量
作用域当前会话BEGIN AND 中
定义和使用位置当前会话中的任意位置BEGIN AND 中且为第一句
语法必须加@符号,不用限定类型除SELECT外都不加@符号,需要限定类型
二、存储过程 1、存储过程

存储过程是一组编译好的SQL语句的集合。

2、存储过程的好处

提高代码的重用率;简化操作;减少编译次数和连接次数。

3、存储过程创建语法:
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
	一条或多条SQL语句;
END;

注意:

①参数列表包含三部分:参数模式、参数名、参数类型。

参数模式:
=IN:该参数可以作为输入,需要输入方传入值。
OUT:该参数可以作为输出,可以作为返回值。
INOUT:该参数既可以作为输入也可以作为输出。

②如果存储过程体只有一句话,BEGIN AND 可以省略。
③存储过程体中的每条SQL语句的结尾要求必须加分号,
④存储过程的结尾可以使用 DELIMITER 重新设置,语法如下: DELIMITER 结束标记。例如:DELIMITER $;即将结束标记设置为 $。

4、存储过程调用语法
CALL 存储过程名(实参列表);
5、使用案例

以下代码需要的命令行窗口操作。

(1)创建空参列表的存储过程
#案例1:插入到admim表中5条记录。
DELIMITER $
CREATE PROCEDURE myp3()
BEGIN
INSERT INTO admin(username,PASSWORD) 
VALUES('join','000'),('ffs','001'),('jo','002'),('joi','004'),('r1','003');
END $
CALL myp1()$  #调用
(2)创建带in模式参数的存储过程。
#案例1:创建存储过程实现,根据女神名查询对应的男神信息。
DELIMITER $  #设置结束符为$
CREATE PROCEDURE myp2(IN beautyName VARCHAR(10))
BEGIN 
	SELECT bo.*
	FROM boys bo
	RIGHT JOIN beauty b ON bo.id=b.boyfriend_id
	WHERe b.name=beautyName;
END $
CALL myp2('柳岩')$  #调用
 
 #案例2:创建存储过程实现,用户是否登录成功。
DELIMITER $  #设置结束符为$
CREATE PROCEDURE 
myp4(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,'成功','失败') 登陆状态; #使用
END $
CALL myp4('张飞','hshs')$   #调用
(3)创建带out模式的存储过程
#案例1:根据女生名,返回对应男生名。
DELIMITER $  #设置结束符为$
CREATE PROCEDURE myp5(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20))
BEGIN
	SELECT bo.boyname INTO boyName
	FROM boys bo
	JOIN beauty b ON bo.id=b.boyfriend_id
	WHERe b.name=beautyName;
END $
CALL myp5('小昭',@bName)$  #调用
SELECt @bName$  #查询

#案例2:根据女神名,返回对应的男神名和男神魅力值
DELIMITER $  #设置结束符为$
CREATE PROCEDURE myp6(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT userCP INT)
BEGIN
	SELECT bo.boyname,bo.userCP INTO boyName,userCP
	FROM boys bo
	JOIN beauty b ON bo.id=b.boyfriend_id
	WHERe b.name=beautyName;
END $
CALL myp6('小昭',@bName,@usercp)$   #调用
SELECt @bName,@usercp$  #查询
(4)创建带inout模式参数的存储过程
#案例1:定义两数a和b,求两数的2倍的结果为。
CREATE PROCEDURE myp8(INOUT a INT,INOUT b INT)
BEGIN
     SET a=a*2;
     SET b=b*2;
END

SET @m=10;
SET @n=20;
CALL myp8(@m,@n)
SELECT @m,@n;
6、删除和查看存储过程
#删除存储过程
DROP PROCEDURE 存储过程名;
#查看存储过程
SHOW CREATE PROCEDURE 存储过程名;
三、函数

函数和存储过程类似,都可以提高代码的重用率,简化操作,减少编译次数和连接次数。

1、函数和存储过程的区别

存储过程:可以有0个返回,也可以有多个返回,适合做批量的插入、更新。
函数:有且仅有一个返回,适合做数据处理返回一个结果。

2、创建语法
CREATE FUNCTION 函数名(参数列表) RETURNS 返回值的类型
BEGIN
    函数体;
    RETURN 返回值;
END

注意:
①参数列表包含两部分:参数名 参数类型。
②函数体:里边要有return语句,如果没有会报错,一般return放在最后。
③函数体中仅有一句话,则可以省略begin end。
④使用delimiter语句设置结束标记。

3、调用语法
SELECT 函数名(参数列表);
4、案例演示

以下代码需要的命令行窗口操作。

(1)无参有返回
#案例1:返回公司的员工个数
SET GLOBAL log_bin_trust_function_creators = 1;#先设置二进制文件开启
DELIMITER $
CREATE FUNCTION myf1() RETURNS INT
BEGIN
	DECLARE c INT DEFAULT 0;  #定义局部变量
	SELECT COUNT(*) INTO c   #为变量赋值
	FROM employees;
	RETURN c;
END $

SELECt myf1()$
(2)有参有返回
#案例1:根据员工名,返回他的工资。
CREATE FUNCTION myf2(empName VARCHAR(20)) RETURNS DOUBLE
BEGIN 
	SET @a=0; #定义用户变量
	SELECT salary INTO @a   #为变量赋值
	FROM employees
	WHERe last_name=empName;
	RETURN @a;
END $

SELECt myf2('Chen')$
 
 #案例2:根据部门名,返回该部门平均工资。
 CREATE FUNCTION myf3( dName VARCHAR(20)) RETURNS DOUBLE
 BEGIN
	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=dName;
	RETURN sal;
 END $
 
 SELECT myf3('IT')$
 
 #案例3:创建函数,实现传入两个float,返回二者之和
 CREATE FUNCTION myf4(num1 FLOAT,num2 FLOAT) RETURNS FLOAT
 BEGIN 
     SET @sum=num1+num2;
     RETURN @sum;
 END $
5、函数的查看和删除 (1)函数的查看
 SHOW CREATE FUNCTION 函数名;
(2)函数的删除
DROP FUNCTION 函数名;
四、流程控制 1、分支结构 (1)IF函数

①语法: IF(表达式1,表达式2,表达式3)
②执行顺序:如果表达式1成立,则返回表达式2的值,否则返回表达式3的值。

(2)case结构

①类似于Java中的switch 语句,一般用于实现等值判断。

CASE 变量|表达式|字段
	WHEN 要判断的值 THEN 返回的值1或【语句;】
	WHEN 要判断的值 THEN 返回的值2或【语句;】
	...
	ELSE 要返回的值n或【语句 ;】  #else可省略
	END 【CASE】;

②类似于Java中的多重if语句,一般用于实现区间判断。

CASE 
	WHEN 要判断的条件1 THEN 返回的值1或【语句;】
	WHEN 要判断的条件2 THEN 返回的值2或【语句;】
	...
	ELSE 要返回的值n或【语句;】  #else可省略
	END 【CASE】;

③特点

可以作为表达式,嵌套在其他语句中使用,可以放在任何地方,每个 THEN 语句结尾没有分号;

可以作为独立的语句去使用,只能放在 BEGIN AND 中,每个 THEN 语句结尾都有分号。

如果满足判断条件,则执行对应的 THEN 后面的语句,并且结束 CASE, 如果都不满足则执行 ELSE , ELSE 可以省略,若 ELSE 省略,则返回 NULL 。

④案例:创建存储过程,根据传入的成绩来显示等级,比如传入的成绩90-100 显示A,80-90显示B,70-80显示C,其余全为D。

DELIMITER $ 
 CREATE PROCEDURE gra(IN score INT)
 BEGIN
	 CASE
		 WHEN score>90 AND score<=100 THEN SELECT 'A';
 		WHEN score>80 AND score<=90 THEN SELECT 'B';
 		WHEN score>70 AND score<=80 THEN SELECT 'C';
 		ELSE  SELECT 'D';
 	END CASE;
 END $
 
 CALL gra(90)$
(3)IF结构

①功能和Java中的if elseif类似, 只能应用在 begin and 中。

② 语法:

BEGIN
	IF 条件1 THEN 语句;
 		ELSEIF 条件2 THEN 语句2;
		 ··· 
 		【 ELSE 语句n;】
	END IF;
END

③案例:创建存储过程,根据传入的成绩来返回等级,比如传入的成绩90-100 返回A,80-90返回B,70-80返回C,其余全返回D。

CREATE FUNCTION myf5(score INT) RETURNS CHAR
BEGIN
	IF score>90 AND score<=100 THEN RETURN 'A';
	ELSEIF score>80 AND score<=90 THEN RETURN 'B';
	ELSEIF score>70 AND score<=80 THEN RETURN 'C';
	ELSE RETURN 'D';
	END IF;
END$

SELECT myf5(89) 等级;
2、循环结构

循环结构只能放在 begin and里边。

(1)分类

while----先判断后执行;
loop----可用来模拟简单死循环,要跳出要搭配循环控制;
repeat----先执行后判断;

循环控制:
iterate类似于continue,结束本次循环;
leave类似于break,结束当前所在的循环。

(2)语法
#1、while---先判断后执行
【标签:】 while 循环条件 do 循环体;
end while 【标签】;

#2、loop---死循环
可用来模拟简单死循环,要跳出要搭配循环控制
【标签:】 loop 循环体;
end loop 【标签】;

#3、repeat  --先执行后判断
至少执行一次,类似do while
【标签:】 repeat 循环体;
until 结束循环的条件
end repeat 【标签】;
(3)案例:

①案例1(没有添加循环控制语句):批量插入,根据次数插入到admin表中多条记录。

DROP PROCEDURE IF EXISTS test_while$
CREATE PROCEDURE test_while(IN insertcount INT)
BEGIN
    DECLARE i INT DEFAULT 1;
    a:WHILE i<= insertcount DO
	INSERT INTO admin(username,PASSWORD) 
	VALUES(CONCAT('shi',i),'8888');
	SET i=i+1;
   END WHILE a;
END$

CALL test_while(100)$

②案例2(添加leave语句):批量插入,根据次数插入到admin表中多条记录,如果次数大于20则停止。

TRUNCATE TABLE admin$
DROP PROCEDURE test_while$
CREATE PROCEDURE test_while(IN insertcount INT)
BEGIN
    DECLARE i INT DEFAULT 1;
    a:WHILE i<= insertcount DO
	INSERT INTO admin(username,PASSWORD)
	VALUES(CONCAT('xia',i),'8888');
	IF i>=20 THEN LEAVE a;
	END IF;
	SET i=i+1;
    END WHILE a;
END$
DELIMITER $
CALL test_while(100)$

③案例3:批量插入,根据次数插入到admin表中多条记录,只插入偶数次数,且大于20停止。

TRUNCATE TABLE admin$   #删除表里的所有数据
DROP PROCEDURE test_while$  #删除存储过程
CREATE PROCEDURE test_while1(IN insertcount INT)
BEGIN
    DECLARE i INT DEFAULT 0;
   a:WHILE i<= insertcount DO
    SET i=i+1;
    IF MOD(i,2)!=0 THEN ITERATE a;
    END IF;
    INSERT INTO admin(username,PASSWORD)
	  VALUES(CONCAT('xia',i),'8888');
    END WHILE a;
END$

CALL test_while1(100)$
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/310928.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号