2.用户变量
/*
①用户变量: 会话用户变量 vs 局部变量
②会话用户变量:使用"@"开头,作用域为当前会话
③局部变量:只能使用在存储过程和存储函数中的
*/
2.1会话用户变量
#1.6会话用户变量
/*
①变量的声明和赋值
#方式1:“=”或“:=”
SET @用户变量 = 值;
SET @用户变量 := 值;
#方式2:“:=” 或 INTO关键字
SELECT @用户变量 := 表达式 [FROM 等子句];
SELECT 表达式 INTO @用户变量 [FROM 等子句];
②使用
select @变量名
*/
#准备工作
CREATE DATABASE dbtest16;
USE dbtest16;
CREATE TABLE employees
AS
SELECT * FROM atguigudb.`employees`;
CREATE TABLE departments
AS
SELECT * FROM atguigudb.`departments`;
#测试:
#方式1:
SET @m1=1;
SET @m2 :=2;
SET @sum :=@m1+@m2;
SELECT @sum;
#方式2:
SELECT @count :=COUNT(*) FROM employees;
SELECT @count;
SELECT AVG(salary) INTO @avg_sal FROM employees;
SELECT @avg_sal;
2.2局部变量
#1.7局部变量
/*
局部变量必须满足
①使用declare声明
②声明并使用在begin...end中(使用在存储过程、函数中)
③declare的方式声明的局部变量必须声明在begin中的首行的位置
2.声明格式:
DECLARE 变量名 类型 [default 值]; # 如果没有DEFAULT子句,初始值为NULL
3.赋值
方式1:
SET 变量名=值;
SET 变量名:=值;
方式2:
SELECT 字段名或表达式 INTO 变量名 FROM 表;
4.使用
select 局部变量名;
*/
#举例:
DELIMITER //
CREATE PROCEDURE test_var()
BEGIN
#声明局部变量
DECLARE a INT DEFAULT 0;
DECLARE b INT;
DECLARE emp_name VARCHAR(25);
#赋值
SET a=1;
SET b:=2;
SELECT last_name INTO emp_name FROM employees
WHERE employee_id=101;
#使用
SELECT a,b,emp_name;
END//
DELIMITER ;
#调用存储过程
CALL test_var;
#举例1:声明局部变量,并分别赋值为employees表中employee_id为102
#的last_name和salary
delimiter //
create procedure test_pro()
begin
#声明
declare emp_name varchar(25);
declare sal double(10,2) default 0.0;
#赋值
select last_name,salary into emp_name,sal
from employees
where employee_id=102;
#使用
select emp_name,sal;
end//
delimiter ;
#调用存储过程
call test_pro();
#举例2:声明两个变量,求和并打印
#(分别使用会话用户变量、局部变量的方式实现)
#方式1:使用会话用户变量
set @v1=10;
set @v2 :=20;
set @result :=@v1+@v2;
#查看
select @result;
#方式2:使用局部变量
delimiter//
create procedure add_value()
begin
#声明
declare value1,value2,sum_val int;
#赋值
set value1=10;
set value2=100;
set sum_val=value1+value2;
#使用
select sum_val;
end //
delimiter;
#调用存储过程
call add_value();
#举例3:创建存储过程“different_salary”查询某员工和他领导的薪资差距,
#并用IN参数emp_id接收员工id,用OUT参数dif_salary输出薪资差距结果。
delimiter //
create procedure different_salary(in emp_id int,out dif_salary double)
begin
#分析:查询出emp_id员工的工资,查询出emp_id员工的管理者的id
# 查询管理者的工资,计算两者差值
#声明变量
declare emp_sal double default 0.0;#记录员工工资
declare mgr_sal DOUBLE DEFAULT 0.0;#记录管理者工资
declare mgr_id int default 0; #记录管理者的id
#赋值
select salary into emp_sal from employees where employee_id=emp_id;
select manager_id into mgr_id from employees where employee_id=emp_id;
select salary into mgr_sal from employees where employee_id=mgr_id;
set dif_salary=mgr_sal-emp_sal;
end //
delimiter ;
#调用存储过程
set @emp_id=102;
set @dif_sal=0;
call different_salary(@emp_id,@dif_sal);
select @dif_sal;