0、预备知识
变量
分为系统变量和自定义变量,和Java一样用于存储保存数据使用的容器。
1)系统变量
该变量由系统定义的,自带的变量值,属于MySQL本身层面的。
系统变量查看
:
show global variables; #查看全局变量
show global variables like '%char%';# 查看满足条件的系统变量
修改系统变量值
:
set global 系统变量名 = 值;
或者
set @global 系统变量名 = 值;
1.1 )全局变量
作用域:MySQL服务器启动时为所有全局变量初始化。
查看全部全局变量:
#查看
SHOW GLOBAL VARIABLES;
#查看满足条件的
SHOW GLOBAL VARIABLES LIKE '%g%';
#修改赋值全局变量 自动提交
SET @@global.autocommit=0;
SET GLOBAL autocommit=0;
1.2)会话变量
作用域:针对于当前会话或者当前连接有效
# 查看所有会话变量
SHOW SESSION VARIABLES;
# 查看满足条件的部分会话变量
SHOW SESSION VARIABLES LIKE '%g%';
#查看指定的会话变量的值
SELECT @@autocommit;
SELECT @@session.tx_isolation;
#为某个会话变量赋值
#隔离级别更改为读未提交
方式一
SET @@session.tx_isolation='read-uncommitted';
2)自定义变量(重要)
该变量是用户自定义的,不是由系统的。和Java一样也三步走:声明、赋值、使用(查看、比较、运算)
2.1)用户变量
针对于当前会话或者当前连接有效,是在BEGIN END里面或BEGIN END外面
赋值操作符:=或:=
一般还是使用:=
别分比较。
声明并初始化:
set @用户变量名 :=值
赋值操作:
SET @变量名=值;
或者
SELECT 字段 INTO @变量名
FROM 表
where 条件;
使用:
SET @m :=1;
SET @n :=1;
SET @sum := @m+@n;
select @sum;
2.2)局部变量
作用域:仅仅在定义它的begin end中有效。在 BEGIN END中的第一句话
,主要作用于存储过程和函数中。
局部变量得声明
:
declare 变量名 类型;
declare 变量名 类型 [default 值]
begin
declare a int default 1;
declare b int default 2;
declare sum int;
set sum = a+b;
select sum;
end
3、用户变量和局部变量对比
作用域 | 使用位置 | 语法 | |
---|---|---|---|
用户变量 | 当前会话 | 会话中的任何地方 | 必须加@符号,不用限定类型 |
局部变量 | begin end 中 | 只能用在begn end中,且为第一句话 | 一般不加@符号,需要限定类型 |
主角登场存储过程
:
1、存储过程
1.1 概述与理解
存储过程英文:stored procedure,它的思想很简单:一组经过预先编译的SQL语句的封装
。类似Java的方法
存储过程预先存储在MySQL服务器上,需要执行的时候,客户端只需要发出调用的指令,服务器就会调用预先存储好的存储过程。
客户端只需要调用过程或者函数,MySQL服务器内部会调用一组预先编译的SQL组。
1.2 好处
1)减少操作,客户端多次向MySQL服务端发送请求过程,提高sql语句的重用性。
2)减少网络传输量(客户端不需要把所有的SQL语句通过网络发给服务器)
3)减少了SQL语句暴露在网上的风险,提高数据查询的安全性
1.3 存储过程的分类
存储过程的参数类型是可以为IN、OUT、INOUT
- 没有参数(无参数无返回值)
- 仅仅带IN类型(有参数无返回值)
- 仅仅带OUT类型(无参数有返回值)
- 既带IN又带OUT(有参数有返回值)
- 带INOUT(有参数有返回值)
注意:IN、OUT、INOUT都可以在存储过程中有多个。
2、创建存储过程
创建存储过程的语法:
DELIMITER $$
CREATE
PROCEDURE 数据库名.存储过程名([in变量名 类型,out 参数 2,...])
BEGIN
[DECLARE 变量名 类型 [DEFAULT 值];]
逻辑语句
END$$
DELIMITER ;
参数符号的说明:
关键字 | 作用 |
---|---|
IN | 当前参数为输入参数,表示入参 ,存储过程只是读取这个参数的值,没有定义参数类型,默认是IN |
OUT | 当前参数为输出参数,出参,执行完成之后,调用该存储过程返回该参数的值 |
INOUT | 当前参数既可以为输入参数,也可以是输出参数 |
存储过程的语句是在begin和end之间编写,声明变量是declare,默认值default,在begin…end 中修改变量值,使用set 变量 = 值
存储过程中的每一条SQL语句的结尾要求必须加分号
,存储过程的结尾可以使用 delimiter 重新设置
delimiter 结束标记
3、不同存储过程案例
3.1)空参存储过程
定义一个存储过程:
delimiter $$
create procedure girls.demo()
begin
declare user_name varchar(20);
set user_name = '李四';
select user_name;
end $$
delimiter ;
调用存储过程:
call demo();
3.2)带IN模式的存储过程
定义一个存储过程:
delimiter $$
create procedure girls.demo2(IN user_name varchar(20))
begin
select * from employees where name = user_name;
end $$
delimiter ;
call demo2('李四');
在dataGrip上显示数据不代表它有返回值。
3.3)带OUT模式的存储过程
定义一个存储过程:
delimiter $$
create procedure girls.demo3(IN user_name varchar(20), IN emp_number varchar(20), OUT salary1 float)
begin
select salary into salary1 from employees where name = user_name and emp_no = emp_number;
end $$
delimiter ;
call demo3('李四','10001',@salary1);
select @salary1;
4、删除存储过程
语法格式如下:
DROP PROCEDURE [ IF EXISTS ] <过程名>