MySQL学习笔记(8)——变量、存储过程和函数

本文详细介绍了MySQL中的系统变量、会话变量、全局变量以及自定义变量的使用,包括它们的作用域、声明、赋值和查看方法。此外,还讲解了存储过程、函数的创建、调用和功能,以及流程控制结构如if、case、while、loop和repeat的使用。
摘要由CSDN通过智能技术生成

一、变量

系统变量全局变量
会话变量
自定义变量用户变量
局部变量

一、系统变量:

有系统提供,不是用户定义,属于服务器层面。

使用语法:

1.查看所有的系统变量

SHOW VARIABLES;#会话变量
SHOW GLOBAL VARIABLES;#系统变量
SHOW SESSION VARIABLES;#会话变量

2查看满足条件的部分系统变量

SHOW VARIABLES LIKE '%char%';

3.查看指定的某个系统变量的值

SELECT @@系统变量名;#会话变量
SELECT @@global.系统变量名;#系统变量
SELECT @@session.系统变量名;#会话变量

4.为某个系统变量赋值

#方式一:
SET 系统变量=值;
#方式二:
SET @@系统变量=值;

全局变量(整个服务器,对任何客户端都有效)

作用域:服务器每次启动将为所有的全局变量赋初始值,针对于所有会话(连接)有效,但不能跨服务器

1.查看所有全局变量

2.查看部分全局变量

3.查看指定的全局变量的值

SELECT @@global.autocommit;
select @@tx_isolation;

4.为某个指定的全局变量赋值

SET @@global.autocommit=0;

会话变量(针对客户端一次连接)

作用域:仅仅针对于当前会话(连接)有效

1.查看所有会话变量

2.查看部分会话变量

3.查看指定会话变量的值

4.为某个会话变量赋值

set session tx_isolation   8.0

二、自定义变量

变量是用户自定义的,不是系统的

使用步骤:

声明

赋值

使用(查看、比较、运算)

1.用户变量

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

应用于任何地方,也就是begin end里面或外面

①声明并初始化:

赋值操作符 =或:=
SET @用户变量名=值;
SET @用户变量名:=值;
SELECT @用户变量名:=值;

②赋值

方式一同声明

方式二:用select into

SELECT 字段 INTO 变量名#查询出的字段为一个值而不是一组值
FROM 表;

③使用:查看用户变量的值

SELECT @用户变量名;
#案例:
#声明并初始化
SET @count=1;
#赋值
SELECT COUNT(*) INTO @count
FROM employees;
#使用
SELECT @count;

2.局部变量

作用域:仅仅在定义它的begin end中有效

应用于begin end中的第一句话

①声明

declare 变量名 类型;

declare 变量名 类型 default 值;值与类型一致或兼容

②赋值set 或select into

方式一:通过set 或select

set 局部变量=值;

set 局部变量:=值;

select @局部变量:=值

方式二:通过select into

select 字段 into 局部变量名

from 表;

③使用

select 局部变量名

对比用户变量和局部变量:

                        作用域                        定义和使用的位置                        语法

用户变量        当前会话                        会话中的任何地方                必须加@符号,不用限定类型

局部变量        begin end中                只能在begin end中,且为第一句话                一般不用加@除非,需要限定类型

二、存储过程
 存储过程和函数:类似于java中的方法

好处:

1.提高代码的重用性

2.简化操作

含义:一组预先编译好的sql语句的集合,理解成批处理语句

2.简化操作

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

语法:

一。创建语法

create procedure 存储过程名(参数列表)

begin

        存数过程体(一组合法有效的sql语句)

end

注意

1.参数列表包含三部分

参数模式 参数名 参数类型

in stuname varchar(20)

参数模式:

in:该参数可以作为输入,也就是该参数需要调用方传入值

out:该参数可以作为输出,也就是该参数可以作为返回值

inout:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值

2.如果存储过程体仅仅只有一句话,begin end可以省略

3.存储过程体的每条sql语句的结尾要求必须加分号。

存储过程的结尾可以使用delimiter重新设置

语法:

delimiter 结束标记

二、调用语法

call 存储过程名(实参列表);

空参列表

#插入到admin表中五条记录
#创建
DELIMITER $
CREATE PROCEDURE myp1()
BEGIN
    INSERT INTO admin(username,`password`)
    VALUES('john1','0000'),('lily','0000'),('rose','0000'),('jack','0000'),('tom','0000');
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('女生名')$#变量或常数


3.创建带out模式的存储过程

#根据女生名返回对应男生名
CREATE PROCEDURE myp5(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 $
 
SET @bName#可以不写
CALL myp5('小昭',@bName)$
SELECT @bName$
#根据女生名,返回对应的男生名和数值
CREATE PROCEDURE myp6(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT userCP INT)
BEGIN
    SELECT bo.boyName,bo.useCP INTO boyName,userCP
    FROM beauty b
    INNER JOIN boys bo
    ON b.boyfriend_id=bo.id
    WHERE b,brautyName=beautyName
END $
 
CALL myp6('小昭',@bName,@uCP)$
SELECT @bName,@uCP$


4.创建带inout模式参数的存储过程

调用:

定义变量set

传入call

输出select

#传入a和b两个值,最终a和b都翻倍并返回
CREATE PROCEDURE myp8(INOUT a INT,INOUT b INT)
BEGIN
    SET a=*2;
    SET b=b*2;
END $
 
SET @m=10$
SET @m=20$
CALL myp8(@m,@n)$
SELECT @m,@n$

三、函数

区别:

存储过程可以有0个返回或多个返回,函适合做批量插入、批量更新,增删改

函数只能有且仅有1个返回,适合处理数据后返回一个结果,查询

创建语法:

create function 函数名(参数列表) returns 返回类型

begin

        函数体

end

注意:参数列表 包含两部分:

参数名 参数类型

函数体:肯定会有return语句,没有会报错

如果return没有放在函数体的最后也不报错,但不建议

函数体中只有一句话可以省略beginend

使用delimiter语句设置结束标记

delimiter $;

二、调用语法

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.有参有返回

#案例:根据员工名,返回他的工资
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('l_ing') $
#案例2:根据部门名,返回该部门的平均部门工资
CREATE FUNCTION myf3(depName VARCHAR(20)) RETURNS DOUBLE
BEGIN
	DECLARE avg_sal DOUBLE
	SELECT AVG(salary) INTO avg_sal
	FROM employees
	GROUP BY department_id;
	WHERE department_id=(
		SELECT department_id
		FROM departments
		WHERE department_name=depName
	);
	RETURN avg_sal;
END $;

SELECT myf3('Adm')$

查看函数

SHOW CREATE FUNCTION myf3;

删除函数

DROP FUNCTION myf3;
#案例:创建函数,实现传入两个float,返回二者之和
CREATE FUNCTION test1(num1 FLOAT,num2 FLOAT) RETURNS FLOAT
BEGIN
	DECLARE SUM FLOAT DEFAULT 0;
	SET SUM=num1+num2;
	RETURN SUM;
END $
SELECT test1(1,2) $

四、流程控制结构

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

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

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

一、分支结构

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

end case;

情况2:类似java中的多重if语句,一般用于实现区间判断

语法:case

when 要判断的条件1 then 返回的值1或语句1;

when 要判断的条件2 then 返回的值2或语句2;

。。。

else 要返回的值n

end case;

特点:

①可以作为表达式,嵌套在其他语句中使用,可以放在任何地方,beginend中或外(值)

可以作为独立的语句去使用,只能放在beginend中(语句)

②如果when中的值满足或条件成立,则执行对应的then后面的语句,并且结束case,如果都不满足,则执行else中的语句或值,

③如果else省略,并且所有when条件否不满足,则返回null

3.if结构

功能:实现多重分支

语法:

if 条件1 then 语句1

elseif 条件2 then 语句2

...

【else 语句n】

end if

只能应用在begin end中

二、循环结构

分类:

while loop repeat

循环控制:iterate 类似于continue,结束本次循环,继续下一次

leave 类似于break ,跳出,结束当前所在循环

1.while

语法:

【标签】while 循环条件 do

循环体;

end while【标签】

有循环控制写标签

while(循环条件){

循环体

先判断再执行

2.loop

【标签:】loop

        循环体;

end loop【标签】;

可以用来模拟简单的死循环

中途跳出leave

3.repeat

语法:

【标签:】repeat

循环体

until 结束循环的条件

end repeat【标签】;

先执行后循环 至少执行一次

3.添加iterate语句

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值