MySQL变量知识点及使用示例
MySQL变量主要分为两种:系统变量和自定义变量。APIMySQL官方API1.系统变量:系统变量包括:全局变量和会话变量。全局变量会话变量全局变量影响服务器整体操作。会话变量影响具体客户端连接的操作。全局变量是由系统提供的。当服务器启动时,它将所有全局变量初始化为默认值。这些默认值可以在选项文件中或在命令行中指定的选项进行更改。服务器启动后,通过连接服务器并执行SET GLOBAL var_na
·
官方API
分类
MySQL变量主要分为两种:系统变量和自定义变量。
1.系统变量:
系统变量包括:全局变量和会话变量。
全局变量 | 会话变量 |
---|---|
全局变量影响服务器整体操作。 | 会话变量影响具体客户端连接的操作。 |
全局变量是由系统提供的。 当服务器启动时,它将所有全局变量初始化为默认值。这些默认值可以在选项文件中或在命令行中指定的选项进行更改。服务器启动后,通过连接服务器并执行SET GLOBAL var_name语句,可以动态更改这些全局变量。 要想更改全局变量,必须具有SUPER权限。 | 服务器还为每个连接的客户端维护一系列会话变量,是用户自己定义的。 在连接时使用相应全局变量的当前值对客户端的会话变量进行初始化。对于动态会话变量,客户端可以通过SET SESSION var_name语句更改它们。 设置会话变量 不需要特殊权限,但客户端只能更改自己的会话变量,而不能更改其它客户端的会话变量。 |
GLOBAL变量语法:mysql>SET@@global.sort_buffer_size=value; | SESSION变量语法:mysql>SET@@session.sort_buffer_size=value; |
查看某个指定的GLOBAL变量:select @@global.变量名称; | 查看某个指定的SESSION变量:select @@session.变量名称; |
2.自定义变量
自定义变量也可以分为两种:用户变量和局部变量。
用户变量 | 局部变量 |
---|---|
用户变量可以先在用户变量中保存值然后在以后引用它;这样可以将值从一个语句传递到另一个语句。 用户变量与连接有关。也就是说,一个客户端定义的变量不能被其它客户端看到或使用。 当客户端退出时,该客户端连接的所有变量将自动释放。 | 局部变量的作用域就是在定义他的begin end中有效。 |
set @用户变量名 := 值 | declare 变量名 类型; set @用户变量名 = 值 |
select @用户变量名:=值 | select @用户变量名:=值 |
简单使用
1. 示例一:需要变量进行值传递
题目:查询比前一天温度更高的日期的id
#建表语句:
CREATE TABLE `Weather` (
`id` bigint(10) NOT NULL AUTO_INCREMENT,
`RecordDate` date NOT NULL,
`Temperature` int(3) NOT NULL,
PRIMARY KEY (`id`)
);
#插入数据:
insert into Weather(RecordDate, Temperature) values('2020-01-01', 10),('2020-01-02', 25),('2020-01-04', 20),('2020-01-05', 30);
答案解析;在查询当前数据是否符合时,需要使用前一条数据的温度,所以需要使用变量@curr_temperature接收前一个温度。
第一条数据和null判断的结果刚好为不符合. SELECT if(10 > null,1,0) as is_bigger; #结果为:0;
select
a.id,a.is_bigger
from
(select
a.id,if(a.Temperature>@curr_temperature,1,0) as is_bigger,@curr_temperature:=a.Temperature
from
(select * from Weather a,(select @curr_temperature:=null) b order by a.RecordDate asc) a
) a
where a.is_bigger=1;
2. 示例二:不需要值传递
题目:查询每一条有内控名称的制度的内控id
答案及解析:
#查询所有的内控流程不为空的制度
SELECT r.reg_id, r.reg_process FROM rms_regulation r WHERE r.reg_process IS NOT NULL;
#根据内控流程名称查询出对应的一级流程id
SELECT id FROM rms_icp a WHERE a.parent_id IS NULL AND a.name = '';
#查询每一条内控流程不为空的流程id
SELECT
c.reg_id,
c.reg_process,
( SELECT id FROM rms_icp a WHERE a.parent_id IS NULL AND a.NAME = c.reg_process ) AS icpid
FROM
(
SELECT
r.reg_id,
r.reg_process,
@pname
FROM
rms_regulation r,
( SELECT @pname := NULL ) b
WHERE
IS NOT NULL
) c;
更多推荐
已为社区贡献1条内容
所有评论(0)