image.png

系统变量

系统变量:由系统提供的变量,不是用户自定义的。

查看所有系统变量:

  1. show global|[session] variables

查看满足指定条件的系统变量:

  1. -- 如:查看所有名字中带char的变量
  2. show global|[session] variables like '%char%';

查看指定的某个系统变量的值:

  1. select @@global|[session].系统变量名;

例如:

  1. MariaDB [myemployees]> select @@global.character_set_client;
  2. +-------------------------------+
  3. | @@global.character_set_client |
  4. +-------------------------------+
  5. | utf8 |
  6. +-------------------------------+
  7. 1 row in set (0.000 sec)

为某个系统变量赋值:

  1. -- 方式一
  2. set global|[session] 系统变量名 = 值;
  3. -- 方式二
  4. set @@global|[session].系统变量名 = 值;

全局变量

数据库服务器每次启动,都会为所有的全局变量赋初始值,针对所有会话(连接)有效(例如开了很多个操作数据库的cmd窗口,一个窗口就是一个会话,在一个会话中修改了全局变量的值,其他会话中的全局变量值也会发生改变),但不能跨重启(即服务器重启后,所有全局变量的值又恢复为默认值)。

  1. 查看所有全局变量:

    1. show global variables;
  2. 查看满足指定条件的全局变量

    1. -- 如:查看所有名字中带char的变量
    2. show global variables like '%char%';
  3. 查看指定的全局变量的值

    1. select @@global.系统变量名;
  4. 为指定的全局变量赋值 ```sql — 方式一 set global 系统变量名 = 值;

— 方式二 set @@global.系统变量名 = 值;

  1. <a name="rtQAc"></a>
  2. ### 会话变量
  3. 服务器会为每个会话提供一组会话变量,会话变量仅针对当前会话有效,即在一个会话中修改了会话变量,对其他会话中的会话变量值不造成影响。
  4. 1. 查看所有会话变量
  5. ```sql
  6. -- 方式一
  7. show variables;
  8. -- 方式二
  9. show session variables;
  1. 查看满足指定条件的会话变量

    1. -- []表示可选
    2. -- 例如:查看变量名带char的会话变量
    3. show [session] variables like '%char%';
  2. 查看指定的会话变量 ```sql — 如:查看隔离级别 select @@tx_isolation;

— 完整写法 select @@session.tx_isolation;

  1. 4. 为某个会话变量赋值
  2. ```sql
  3. -- 方式一
  4. set session 会话变量名 = 值;
  5. -- 方式二
  6. set @@session.会话变量名 = 值;

自定义变量

自定义变量:由用户自行定义。

使用步骤:1. 声明 2. 赋值 3. 使用

用户变量

作用域:仅针对于当前会话(连接)有效

  1. 声明并初始化 ```sql — 写法一 set @用户变量名 = 值;

— 写法二 set @用户变量名 := 值;

— 写法三 select @用户变量名 := 值;

  1. 2. 赋值(更新变量值)
  2. 方式一:通过 `set` `select`
  3. ```sql
  4. -- 写法一
  5. set @用户变量名 = 值;
  6. -- 写法二
  7. set @用户变量名 := 值;
  8. -- 写法三
  9. select @用户变量名 := 值;

方式二:通过 select into

  1. select 字段 into @用户变量名 from 表;

例如:

  1. -- count变量进行赋值
  2. select count(*) into @count from employees;
  3. -- 读取count变量中的值
  4. select @count;
  1. 使用
    1. select @用户变量名;

    局部变量

作用域:仅在定义它的 begin end 块中有效。

  1. 声明 ```sql — 方式一 declare 变量名 类型;

— 方式二:指定了默认值 declare 变量名 类型 default 值;

  1. 2. 赋值
  2. 方式一:通过 `set` `select`
  3. ```sql
  4. -- 写法一
  5. set 局部变量名 = 值;
  6. -- 写法二
  7. set 局部变量名 := 值;
  8. -- 写法三
  9. select @局部变量名 := 值;

方式二:通过 select into

  1. select 字段 into 局部变量名 from 表;
  1. 使用
    1. select @局部变量名;

用户变量与局部变量对比

作用域 定义和使用的位置 语法
用户变量 当前会话 会话中的任何地方 必须加@符号,不用限定类型
局部变量 BEGIN END块中 只能在BEGIN END块中,且为第一句话 一般不加@符号,除非和 select 一起用时,需要限定类型