8.1 变量
8.1.1 系统变量
- 系统变量
2 查看部分系统变量
show global/session variables like ‘%某字符%’;
3 查看某个系统变量
select @@global/session.系统变量名;
4 修改系统变量
set global/session 系统变量名=值; set @@global/session.系统变量名=值;
<a name="lXosB"></a>
### 8.1.2 自定义变量
- **自定义变量**
- 由用户自定义
- **局部变量**:仅在定义其的 begin-end 中有效,声明于 begin-end 中的首句
- **用户变量**:对当前连接有效,同于会话变量
```sql
/* 自定义变量 */
# 1 用户变量
# 1.1 声明并初始化用户变量
set @用户变量名=值;
set @用户变量名:=值;
select @用户变量名:=值;
# 1.2 修改用户变量
set/select @用户变量名:=/=值; # 与声明并初始化用户变量一致
select 值 into @用户变量名 from 表;
# 1.3 查看用户变量
select @用户变量名;
# 2 局部变量
# 2.1 声明并初始化局部变量
declare 变量名 类型 default 值;
# 2.2 修改局部变量
set 用户变量名=值;
set 用户变量名:=值;
select @用户变量名:=值;
select 值 into 局部变量名 from 表;
# 2.3 查看局部变量
select 局部变量名;
8.2 存储过程
- 存储过程:一组编译好的 SQL 语句集合,一种批处理语句,减少了语句的编译次数和与数据库服务器的连接次数
8.2.1 语法
```sql / 存储过程 /1 创建存储过程
create procedure 存储过程名(参数列表) begin SQL语句1; SQL语句2; … end
2 使用存储过程
call 存储过程名(参数列表);
3 删除存储过程
drop procedure 存储过程名; # 只能删除一个
4 查看存储过程
show create procedure 存储过程名;
- **参数列表**包括 参数模式、参数名、参数类型三部分
- 例: `in name varchar(20)`
- 参数模式包括
- `in`:该参数可以作为传入值输入
- `out`:该参数可以作为返回值输出
- `inout`:该参数既可以作为输入,又可以作为输出
- 若存储过程中只有一句 SQL 语句, `begin end` 可以省略
- 存储过程中 SQL 语句使用 `;` 作为结尾,存储过程则使用 `delimiter 结束标记` 作为结尾,例 `delimiter $`
<a name="q1v67"></a>
### 8.2.2 使用
```sql
# 1 【创建并使用存储过程】
# 1.1 【空参】插入到admin表中3条记录
delimiter $
create procedure myp1()
begin
insert into admin(username, `password`)
values('xy1', '111'),('xy2', '222'),('xy3', '333');
end $
call myp1()$
# 1.2 【in模式参数】判断用户输入的用户名和密码是否正确
create procedure myp2(in username varchar(20), in password varchar(20))
begin
declare result varchar(20) default ''; # 声明变量
select count(*) into result # 赋值变量
from admin
where admin.username=username
and admin.password=password;
select if(result>0, '成功', '失败'); # 使用变量
end $
call myp2('xy1', '111') $
# 1.3 【out模式参数】通过用户名查找并返回对应的密码
create procedure myp3(in username varchar(20), out password varchar(20))
begin
select admin.password, into password
from admin
where admin.username=username;
end $
set @p$ # 声明用户变量,可省略
call myp3('xy1', @p) $ # 赋值用户变量
select @p$ # 使用用户变量
# 1.4 【inout模式参数】传入a与b两个值,并返回其翻倍值
create procedure myp4(inout a int, inout b int)
begin
set a=a*2;
set b=b*2;
end $
set @x=10$ # 声明并幅值用户变量
set @y=20$
call myp4(@x, @y) $
select @x, @y$
# 2 【删除存储过程】
drop procedure myp1;
# 3 【查看存储过程】
show create procedure myp1;
8.3 函数
- 函数:与存储过程类似,但有且仅有一个返回值
- 存储过程适合用于批量插入或修改,函数适合用于处理数据
8.3.1 语法
```sql / 函数 /1 创建函数
create function 函数名(参数列表) returns 返回类型 begin SQL语句1; SQL语句2; … return 值; end
2 使用函数
select 函数名(参数列表)
3 查看函数
show create function 函数名;
4 删除函数
drop function 函数名;
- **参数列表**包括参数名、参数类型两部分
- 例: `name varchar(20)`
- 若存储过程中只有一句 SQL 语句, `begin end` 可以省略
- 存储过程中 SQL 语句使用 `;` 作为结尾,存储过程则使用 `delimiter 结束标记` 作为结尾,例 `delimiter $`
<a name="0gQ8S"></a>
### 8.3.2 使用
```sql
# 1 【创建并使用函数】
# 1.1 【无参有返回值】返回公司员工个数
delimiter $
create function myf1() returns int
begin
declare c int default 0;
select count(*) into c
from employees;
return c;
end $
select myf1() $
# 1.2 【有参有返回值】根据员工名查询员工工资
create function myf2(name varchar(20)) returns double
begin
set @salary=0; # 定义用户变量
select salary into @salary
from employees
where last_name=name;
retrun @salary;
end $
select myf2('vickie') $
# 2 【查看函数】
show create function myf1;
# 3 【删除函数】
drop function myf1;