MySQL变量的使用总结
MySQL的变量分为系统变量和自定义变量两大类。自定义变量变量由用户定义,又分为局部变量和用户变量;系统变量变量由系统定义,又分为会话变量和全局变量。
一、局部变量
局部变量一般用在SQL语句块中,例如:存储过程、自定义函数、触发器中,局部变量仅仅在定义它的begin/end块中有效,作用范围为该语句块。定义局部变量需要使用DECLARE关键字进行声明,然后给局部变量赋值。
1、局部变量的声明
DECLARE 局部变量名称 类型; --声明局部变量
DECLARE 局部变量名称 类型 【DEFAULT 值】; --声明局部变量并设置默认值
2、局部变量的赋值
局部变量有两种赋值方式:
(1)使用SET关键字,语法如下:
SET 局部变量名称=值;
SET 局部变量名称:=值;
(2)使用SELECT关键字,语法如下:
SELECT 局部变量名称:=值;
SELECT 字段1,字段2,... INTO 局部变量名称1,局部变量名称2,... FROM 表;
4、局部变量的使用
SELECT 局部变量名称;
5、局部变量的应用举例
定义一个自定义函数,通过输入学生姓名和课程名称查询该学生所学课程的成绩。该自定义函数使用了一个局部变量result,类型为int,通过select…into命令把查询结果保存到该变量,然后使用return返回变量的值。
mysql> delimiter //
mysql> drop function if exists func_query_score;
->
-> create function func_query_score(student_name char(20),course_name char(20))
-> returns int reads sql data
-> begin
-> declare result int;
-> select score into result from score
-> where s_id=(select s_id from student where s_name=student_name) and
-> c_id=(select c_id from course where c_name=course_name);
-> return result;
-> end //
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> delimiter ;
使用上述自定义函数进行查询,结果如下:
mysql> select func_query_score('王刚','数据库') as result;
+--------+
| result |
+--------+
| 87 |
+--------+
1 row in set (0.00 sec)
二、用户变量
用户变量作用于当前连接,当前连接断开后,其所定义的用户变量失效。用户变量不需要使用declare关键字进行定义,可以通过直接赋值来定义用户变量。
1、声明并初始化用户变量
用户变量不需要使用declare关键字进行定义,直接通过赋值类定义。语法如下:
SET @用户变量名称=值;
SET @用户变量名称:=值;
SELECT @用户变量名称:=值; --注意:通过SELECT给变量赋值必须使用【:=】
2、用户变量的赋值
局部变量有两种赋值方式:
(1)使用SET关键字,语法如下:
SET @用户变量名称=值;
SET @用户变量名称:=值;
(2)使用SELECT关键字,语法如下:
SELECT @用户变量名称:=值;
SELECT 字段1,字段2,... INTO @用户变量名称1,用户变量名称2,... FROM 表;
3、用户变量的应用举例
(1)以下查询可以实现在查询结果中添加一个自动编号列。
mysql> SELECT (@rowno := @rowno + 1) AS 'rowno',student.*
-> FROM student, (SELECT @rowno:= 0) r;
+-------+------+-----------+------+
| rowno | s_id | s_name | age |
+-------+------+-----------+------+
| 1 | 1001 | 张平 | 20 |
| 2 | 1002 | 王刚 | 21 |
| 3 | 1003 | 张静静 | 19 |
| 4 | 1004 | 王涛 | 20 |
| 5 | 1005 | 王鹏飞 | 19 |
+-------+------+-----------+------+
5 rows in set (0.04 sec)
(2)定义两个用户变量保存学生人数和平均年龄。
mysql> set @cn=0;
Query OK, 0 rows affected (0.00 sec)
mysql> set @age_avg=0.0;
Query OK, 0 rows affected (0.01 sec)
mysql> select count(*),avg(age) into @cn,@age_avg from student;
Query OK, 1 row affected (0.03 sec)
mysql> select @cn,@age_avg;
+------+--------------+
| @cn | @age_avg |
+------+--------------+
| 5 | 19.800000000 |
+------+--------------+
1 row in set (0.00 sec)
三、会话变量
(1)服务器为每个连接的客户端维护一系列会话变量。在客户端连接时,使用相应全局变量的当前值对客户端的会话变量进行初始化。
(2)设置会话变量不需要特殊权限,但客户端只能更改自己的会话变量,而不能更改其它客户端的会话变量。
(3)会话变量的作用域与用户变量一样,仅限于当前连接。当前连接断开后,其设置的所有会话变量均失效。
1、设置会话变量的值
set session var_name = value;
set @@session.var_name = value;
set var_name = value;
2、查看会话变量的值
select @@var_name;
select @@session.var_name;
show session variables like "%var%";
3、会话变量的使用举例
mysql> show session variables like '%char%';
+--------------------------------------+----------------------------+
| Variable_name | Value |
+--------------------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
| validate_password_special_char_count | 1 |
+--------------------------------------+----------------------------+
9 rows in set (0.00 sec)
四、全局变量
(1)修改全局变量会影响MySQL服务器的整体操作。
(2)当服务器启动时,将所有全局变量初始化为默认值,这些默认值可以在选项文件中或在命令行中指定的选项进行更改。
(3)要更改全局变量的取值,必须具有SUPER权限。
(4)全局变量作用于MySQL Server的整个生命周期,但重启后所有设置的全局变量均失效。
(5)如果想让全局变量在重启MySQL之后继续生效,则需要更改配置文件。
1、设置全局变量
set global var_name = value;
set @@global.var_name = value;
注:此处global不能省略,如果不指定GLOBAL,则默认使用SESSION类型。
2、查看全局变量
select @@global.var_name;
show global variables like "%var%";
3、全局变量使用举例
mysql> show global variables like "%char%";
+--------------------------------------+----------------------------+
| Variable_name | Value |
+--------------------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
| validate_password_special_char_count | 1 |
+--------------------------------------+----------------------------+
9 rows in set (0.00 sec)
来源:CSDN
作者:睿思达DBA
链接:https://blog.csdn.net/weixin_44377973/article/details/103704550