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)