Skip to content

Commit 0b589cb

Browse files
committed
add: 变量、存储过程
1 parent 351e342 commit 0b589cb

File tree

1 file changed

+293
-0
lines changed

1 file changed

+293
-0
lines changed
+293
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,293 @@
1+
## 10. 变量
2+
3+
分类:
4+
- 系统变量
5+
- 全局变量
6+
- 会话变量
7+
- 自定义变量
8+
- 用户变量
9+
- 局部变量
10+
11+
### 10.1 系统变量
12+
13+
变量由系统提供,不是用户定义,属于服务器层面
14+
15+
如果是全局级别,需要加global,如果是会话级别,则需要加session,如果不写,则默认session
16+
17+
#### 1. 全局变量
18+
19+
作用域:服务器每次启动将为所有的全局变量赋初始值,针对所有的会话(连接)有效,但不能跨重启。
20+
21+
- 查看系统变量
22+
```sql
23+
#全局变量
24+
show global variables;
25+
#会话变量
26+
show session variables;
27+
```
28+
29+
- 查看满足条件的部分变量
30+
```sql
31+
show global variables like '%char%';
32+
```
33+
34+
- 查看指定的某个系统变量的值
35+
```sql
36+
select @@global.autocommit;
37+
select @@transaction_isolation;
38+
```
39+
40+
- 为某个具体的变量赋值
41+
```sql
42+
set @@global.autocommit=0;
43+
```
44+
45+
#### 2. 会话变量
46+
47+
作用域:仅针对于当前会话(连接)有效
48+
49+
- 查看所有会话变量
50+
```sql
51+
#会话变量
52+
show session variables;
53+
show variables;
54+
```
55+
56+
- 查看满足条件的部分变量
57+
```sql
58+
show session variables like '%char%';
59+
show variables like '%char%';
60+
```
61+
62+
- 查看指定的某个系统变量的值
63+
```sql
64+
select @@session.transaction_isolation;
65+
select @@transaction_isolation;
66+
```
67+
68+
- 为某个具体的变量赋值
69+
```sql
70+
set @@session.autocommit=0;
71+
set session autocommit=0;
72+
```
73+
74+
### 10.2 自定义变量
75+
76+
用户自定义的,不是由系统提供的
77+
78+
使用步骤:
79+
- 声明
80+
- 赋值
81+
- 使用(查看、比较、运算等)
82+
83+
#### 1. 用户变量
84+
85+
作用域:针对于当前会话(连接)有效,同于会话变量的作用域
86+
87+
应用在任何地方, begin end 里外都可以
88+
89+
```sql
90+
#1.声明并初始化
91+
set @用户变量名=值;
92+
set @用户变量名:=值;
93+
select @用户变量名:=值;
94+
95+
#2. 更新用户变量的值
96+
#方式一
97+
set @用户变量名=值;
98+
set @用户变量名:=值;
99+
select @用户变量名:=值;
100+
#方式二
101+
select 字段 into @变量名 from 表;
102+
103+
#3. 查看用户变量的值
104+
select @用户变量名
105+
106+
set @count=1;
107+
select count(*) into @count from employees;
108+
select @count;
109+
```
110+
111+
#### 2. 局部变量
112+
113+
作用域:仅仅在定义它的begin end中有效
114+
115+
应用在 begin end 中的第一句话
116+
117+
```sql
118+
#1. 声明
119+
declare 变量名 类型;
120+
declare 变量名 类型 default 值;
121+
#2. 赋值
122+
#方式一
123+
set 局部变量名=值;
124+
set 局部变量名:=值;
125+
select @局部变量名:=值;
126+
#方式二
127+
select 字段 into 局部变量名 from 表;
128+
#3. 使用
129+
select 局部变量名;
130+
```
131+
132+
#### 3. 用户变量与局部变量对比
133+
134+
用户变量
135+
- 作用域:当前会话
136+
- 定义和使用的位置:会话中的任何地方
137+
- 语法:必须加@符号,不用限定类型
138+
139+
局部变量
140+
- 作用域:begin end中
141+
- 定义和使用的位置:只能在begin end 中,且为第一句话
142+
- 语法:一般不用加@符号,需要限定类型
143+
144+
```sql
145+
#声明两个变量并赋初始值,求和,并打印
146+
#1. 用户变量
147+
set @m=1;
148+
set @n=2;
149+
set @sum=@m+@n;
150+
select @sum;
151+
152+
#2. 局部变量
153+
declare m int default 1;
154+
declare n int default 2;
155+
declare sum int;
156+
set sum=m+n;
157+
select sum;
158+
```
159+
160+
## 11. 存储过程和函数
161+
162+
类似于java中的方法
163+
164+
好处:
165+
1. 提高代码的重用性
166+
2. 简化操作
167+
168+
### 11.1 存储过程
169+
170+
含义:一组预先编译好的SQL语句的集合,理解成批处理语句
171+
172+
好处:
173+
1. 提高代码的重用性
174+
2. 简化操作
175+
3. 减少了编译次数,并且减少了和数据服务器的连接次数,提高效率
176+
177+
#### 1. 创建语法
178+
179+
语法:`create procedure 存储过程名(参数列表) begin 存储过程体(一组合法的sql语句) end`
180+
181+
注意:
182+
1. 参数列表包含三部分:参数模式 参数名 参数类型
183+
- `in stuname varchar(20)`
184+
- 参数模式
185+
- in: 该参数可以作为输入,该参数需要调用方传入值
186+
- out: 该参数作为输出,该参数可以作为返回值
187+
- inout: 该参数既可以作为输入,又可以作为输出
188+
2. 如果存储过程体仅仅只有一句话,begin end 可以省略
189+
3. 存储过程体中的每条sql语句的结尾必须加分号,存储过程的结尾可以使用 delimiter 重新设置
190+
- 语法:`delimiter 结束标记`
191+
192+
```sql
193+
194+
```
195+
196+
#### 2. 调用语法
197+
198+
语法:`call 存储过程名(实参列表);`
199+
200+
**1. 空参列表**
201+
```sql
202+
#插入到admin表中五条记录
203+
delimiter $
204+
205+
create procedure myp1()
206+
begin
207+
insert into admin(username,password) values('john1', '0000'), ('lily', '0000'), ('rose', '0000'),('jack', '0000'),('tom', '0000');
208+
end $
209+
210+
call myp1()$
211+
```
212+
213+
**2. 创建带in模式参数的存储过程**
214+
```sql
215+
#根据女神名,查询对应的男神信息
216+
create procedure myp2(in beautyName varchar(20))
217+
begin
218+
select bo.* from boys bo right join beauty b on bo.id = b.boyfriend_id where b.name = beautyName;
219+
end $
220+
221+
call myp2('liuyan')$
222+
223+
#用户是否登录成功
224+
create procedure myp3(in username varchar(20), in password varchar(20))
225+
begin
226+
declare result int default '';
227+
select count(*) into result from admin where admin.username=username and admin.password=password;
228+
select if(result>0,'success','unsuccess');
229+
end $
230+
231+
call myp3('zhangfei', '8888')$
232+
```
233+
234+
**3. 创建带out模式的存储过程**
235+
236+
```sql
237+
#根据女神名,返回对应的男神名
238+
create procedure myp4(in beautyName varchar(20), out boyName varchar(20))
239+
begin
240+
select bo.boyName into boyName from boys bo inner join beauty b on bo.id = b.boyfriend_id where b.name=beautyName;
241+
end $
242+
243+
set @bName$
244+
call myp4('xiaozhao', @bName)$
245+
select @bName$
246+
247+
#根据女神名,返回对应的男神名和男神魅力值
248+
create procedure myp5(in beautyName varchar(20), out boyName varchar(20), out userCP int)
249+
begin
250+
select bo.boyName,bo.userCP into boyName,userCP from boys bo inner join beauty b on bo.id = b.boyfriend_id where b.name=beautyName;
251+
end $
252+
253+
call myp5('xiaozhao', @bName, @usercp)$
254+
select @bName, @usercp$
255+
```
256+
257+
**4. 创建带inout模式的存储过程**
258+
```sql
259+
#传入a和b两个值,最终a和b都翻倍并返回
260+
create procedure myp6(inout a int, inout b int)
261+
begin
262+
set a=a*2;
263+
set b=b*2;
264+
end $
265+
266+
set @m=10$
267+
set @n=20$
268+
call myp6(@m, @n)$
269+
select @m, @n$
270+
```
271+
272+
#### 3. 删除存储过程
273+
274+
语法:`drop procedure 存储过程名;`
275+
276+
```sql
277+
drop procedure mp1;
278+
```
279+
280+
#### 4. 查看存储过程的信息
281+
282+
```sql
283+
show create procedure myp2;
284+
```
285+
286+
### 11.2 函数
287+
288+
- 存储过程:可以有0个返回,也可以有多个返回。适合批量插入、批量更新
289+
- 函数:有且仅有1个返回。适合在处理数据后返回一个结果
290+
291+
292+
293+

0 commit comments

Comments
 (0)