MySQL新手指南:深入理解变量、流程控制与游标(一)-用户变量
1. 2. 1 用户变量分类
用户变量是用户自己定义的,作为 MySQL 编码规范,MySQL 中的用户变量以一个“@”开头。根据作用范围不同,又分为会话用户变量
和局部变量
。
会话用户变量:作用域和会话变量一样,只对当前连接会话有效。
局部变量:只在 BEGIN 和 END 语句块中有效。局部变量只能在存储过程和函数中使用。
1. 2. 2 会话用户变量
变量的定义
#方式1:“=”或“:=” SET @用户变量 = 值; SET @用户变量 := 值; #方式2:“:=” 或 INTO关键字 SELECT @用户变量 := 表达式 [FROM 等子句]; SELECT 表达式 INTO @用户变量 [FROM 等子句];
查看用户变量的值 (查看、比较、运算等)
SELECT @用户变量
举例
SET @a = 1; SELECT @a;
SELECT @num := COUNT(*) FROM employees; SELECT @num;
SELECT AVG(salary) INTO @avgsalary FROM employees; SELECT @avgsalary;
SELECT @big; #查看某个未声明的变量时,将得到NULL值
1. 2. 3 局部变量
定义:可以使用DECLARE
语句定义一个局部变量
作用域:仅仅在定义它的 BEGIN … END 中有效
位置:只能放在 BEGIN … END 中,而且只能放在第一句
BEGIN #声明局部变量 DECLARE 变量名1 变量数据类型 [DEFAULT 变量默认值]; DECLARE 变量名2,变量名3,... 变量数据类型 [DEFAULT 变量默认值]; #为局部变量赋值 SET 变量名1 = 值; SELECT 值 INTO 变量名2 [FROM 子句]; #查看局部变量的值 SELECT 变量1,变量2,变量3; END
1 .定义变量
DECLARE 变量名 类型 [default 值]; # 如果没有DEFAULT子句,初始值为NULL
举例:
DECLARE myparam INT DEFAULT 100;
2 .变量赋值
方式 1 :一般用于赋简单的值
SET 变量名=值; SET 变量名:=值
方式 2 :一般用于赋表中的字段值
SELECT 字段名或表达式 INTO 变量名 FROM 表
3 .使用变量 (查看、比较、运算等)
SELECT 局部变量名;
举例 1 :声明局部变量,并分别赋值为employees表中employee_id为 102 的last_name和salary
DELIMITER // CREATE PROCEDURE set_value() BEGIN DECLARE emp_name VARCHAR(25); DECLARE sal DOUBLE(10,2); SELECT last_name,salary INTO emp_name,sal FROM employees WHERE employee_id = 102; SELECT emp_name,sal; END // DELIMITER ;
举例 2 :声明两个变量,求和并打印 (分别使用会话用户变量、局部变量的方式实现)
#方式1:使用用户变量 SET @m=1; SET @n=1; SET @sum=@m+@n; SELECT @sum;
#方式2:使用局部变量 DELIMITER // CREATE PROCEDURE add_value() BEGIN #局部变量 DECLARE m INT DEFAULT 1; DECLARE n INT DEFAULT 3; DECLARE SUM INT; SET SUM = m+n; SELECT SUM; END // DELIMITER ;
举例 3 :创建存储过程“different_salary”查询某员工和他领导的薪资差距,并用IN参数emp_id接收员工id,用OUT参数dif_salary输出薪资差距结果。
#声明 DELIMITER // CREATE PROCEDURE different_salary(IN emp_id INT,OUT dif_salary DOUBLE) BEGIN #声明局部变量 DECLARE emp_sal,mgr_sal DOUBLE DEFAULT 0.0; DECLARE mgr_id INT; 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; CALL different_salary(@emp_id,@diff_sal); #查看 SELECT @diff_sal;
1. 2. 4 对比会话用户变量与局部变量
作用域 | 定义位置 | 语法 | |
会话用户变量 | 当前会话 | 会话的任何地方 | 加@符号,不用指定类型 |
局部变量 | 定义它的BEGIN END中 | BEGIN END的第一句话 | 一般不用加@,需要指定类型 |
2. 定义条件与处理程序
定义条件是事先定义程序执行过程中可能遇到的问题,处理程序定义了在遇到问题时应当采取的处理方式,并且保证存储过程或函数在遇到警告或错误时能继续执行。这样可以增强存储程序处理问题的能力,避免程序异常停止运行。
说明:定义条件和处理程序在存储过程、存储函数中都是支持的。
上一篇: 玩转MySQL游标:揭秘PREPARE预处理语句的奥秘
下一篇: 玩转MySQL游标