P84 会话用户变量与局部变量的

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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中的会话变量局部变量是两种不同的变量类型,它们有以下区别: 1. 作用范围不同: - 会话变量(Session Variable)是在整个数据库会话期间可见和访问的变量。它们在连接到数据库时被创建,并在断开连接时销毁。 - 局部变量(Local Variable)只在定义它们的存储过程、函数或触发器内部可见和访问。一旦存储过程、函数或触发器执行结束,局部变量将被销毁。 2. 生命周期不同: - 会话变量的生命周期与数据库会话一致,它们可以在会话期间的多个查询之间共享和保持其值。 - 局部变量的生命周期仅限于包含它们的存储过程、函数或触发器的执行过程,它们在执行结束后被销毁。 3. 默认值设置不同: - 会话变量可以通过SET语句进行赋值,并且可以在数据库会话中保持其值直到被修改或会话结束。 - 局部变量可以在声明时设置默认值,也可以通过赋值语句进行赋值。如果未显式赋值,则局部变量将为NULL。 4. 使用场景不同: - 会话变量通常用于保存用户特定的配置参数、临时计算结果等,在整个会话期间可以在多个查询中使用。 - 局部变量通常用于存储存储过程、函数或触发器内部的中间结果或临时变量,只在其所在的代码块中可见。 总的来说,会话变量适用于在整个数据库会话期间共享和保持值,而局部变量适用于在存储过程、函数或触发器内部使用的临时变量

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值