8.1 变量

8.1.1 系统变量

  • 系统变量
    • 由系统提供,作用于服务器
    • 全局变量:对所有连接有效,服务器每次启动为所有全局变量赋初始值
    • 会话变量:仅对当前连接有效 ```sql / 系统变量 /

      1 查看全部系统变量

      show global/session variables;

2 查看部分系统变量

show global/session variables like ‘%某字符%’;

3 查看某个系统变量

select @@global/session.系统变量名;

4 修改系统变量

set global/session 系统变量名=值; set @@global/session.系统变量名=值;

  1. <a name="lXosB"></a>
  2. ### 8.1.2 自定义变量
  3. - **自定义变量**
  4. - 由用户自定义
  5. - **局部变量**:仅在定义其的 begin-end 中有效,声明于 begin-end 中的首句
  6. - **用户变量**:对当前连接有效,同于会话变量
  7. ```sql
  8. /* 自定义变量 */
  9. # 1 用户变量
  10. # 1.1 声明并初始化用户变量
  11. set @用户变量名=值;
  12. set @用户变量名:=值;
  13. select @用户变量名:=值;
  14. # 1.2 修改用户变量
  15. set/select @用户变量名:=/=值; # 与声明并初始化用户变量一致
  16. select 值 into @用户变量名 from 表;
  17. # 1.3 查看用户变量
  18. select @用户变量名;
  19. # 2 局部变量
  20. # 2.1 声明并初始化局部变量
  21. declare 变量名 类型 default 值;
  22. # 2.2 修改局部变量
  23. set 用户变量名=值;
  24. set 用户变量名:=值;
  25. select @用户变量名:=值;
  26. select 值 into 局部变量名 from 表;
  27. # 2.3 查看局部变量
  28. 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;