
【MySQL】(十)数据库变量
发布日期:2021-05-08 01:09:17
浏览次数:20
分类:精选文章
本文共 2659 字,大约阅读时间需要 8 分钟。
变量
在 MySQL 数据库中,变量有两种,分别为:系统变量和自定义变量。
根据变量的作用范围,又分为:
- 会话级别变量:仅对当前客户端当次连接有效;
- 全局级别变量:对所有客户端的任一次连接都有效。
系统变量
系统变量,顾名思义,是系统设置好的变量(皆为全局级别变量),也是用来控制服务器表现的,如autocommit
、wait_timeout
等。
大多数的时候,我们并不需要使用系统变量,但我们仍然需要了解有这么回事,在必须要的时候,它可以帮助我们完成特殊的需求。
首先,查看系统变量,语法为:
- 基本语法:
show variables;
执行如下 SQL 语句,进行测试:
-- 查看系统变量show variables;
- 基本语法:
select + @@变量名 + [, @@变量名, ... , @@变量名];
执行如下 SQL 语句,进行测试:
-- 查看具体的系统变量的值select @@autocommit,@@version,@@version_compile_os,@@wait_timeout;
select
来完成的。 接下来,我们尝试修改系统变量,先修改会话级别变量,再修改全局级别变量。
对于修改会话级别变量,有两种方法,语法分别为:
- 基本语法 1:
set 变量名 = 值;
- 基本语法 2:
set @@变量名 = 值;
执行如下 SQL 语句,进行测试:
-- 设置会话级别变量set autocommit = 0;set @@wait_timeout = 20000;-- 查看系统变量select @@autocommit, @@wait_timeout;
autocommit
和wait_timeout
的值,但仅作用于会话级别,即只有当前当次连接有效,当再次打开一个新窗口的时候,我们会发现所有的变量值都恢复如初。 对于修改全局级别变量,语法为:
- 基本语法:
set global 变量名 = 值;
执行如下 SQL 语句,进行测试:
-- 设置全局级别变量set global autocommit = 0;-- 查看系统变量select @@autocommit;
自定义变量
自定义变量,顾名思义,是用户自己定义的变量,并且都是会话级别的变量。
系统为了区别系统变量与自定义变量,规定用户自定义的变量必须使用一个@
符号。设置自定义变量的语法为:
- 基本语法:
set @变量名 = 值;
执行如下 SQL 语句,进行测试:
-- 设置自定义变量set @name = 'binguo';-- 查看自定义变量select @name;
select
后面是跟着@@
的,而查看自定义变量时,select
后面是跟着@
的。在这里,我们需要注意:在 MySQL 中,很多地方会默认将=
处理为比较符号,因此 MySQL 还提供了另外一种赋值符号:=
,即冒号与等号拼接而成的符号。 此外,MySQL 允许我们从数据表中获取数据,然后直接赋值给变量,共有两种方式,分别为:
第 1 种:边赋值,边查看结果。
- 基本语法:
select @变量名 := 字段名 from 表名;
执行如下 SQL 语句,进行测试:
-- 从数据表中获取数据,然后直接为自定义变量赋值select @name = name from student;-- 查看自定义变量select @name;
select
语句中,我们误将:=
写为=
啦,然后 MySQL 将=处理为比较符号,并且在student
表中没有发现与binguo
匹配的名字,因此显示的结果皆为0
,如果匹配成功,则会显示1
。下面,我们修改赋值符号,重新进行测试: -- 从数据表中获取数据,然后直接为自定义变量赋值select @name := name from student;-- 查看自定义变量select @name;
select
语句的作用为:从student
表读取数据,然后依次赋值给自定义变量@name
,并且先赋的值会被覆盖,仅保留最后一个赋值结果。 第 2 种:只赋值,不查看结果。
- 基本语法:
select + 字段列表 + from + 表名 + into + 变量列表;
执行如下 SQL 语句,进行测试:
-- 从数据表中获取数据,然后直接为自定义变量赋值select name from student into @name;-- 查看自定义变量select @name;-- 查看 student 表数据select * from student;
EEROR
,内容为:返回结果包含的内容超过一列。实际上,在未加限制条件的情况下,我们直接从表中捞取数据,是捞取全部数据,因此忽略上述 SQL 语句中的into @name
,其返回的结果为表中的全部name
值,自然是超过一个了。在这种情况下,系统会报错,却将捞取数据的第一个值赋值给了@name
,也就是说,在捞取数据超过一条记录的时候,系统会默认将第一个值赋值给自定义变量。 虽然上述 SQL 语句修改了@name
的值,但却是一种错误的赋值方式,也是不可控的,其结果往往并不是我们想要的。对于上述的赋值方式,MySQL 的要求比较严格,规定每次只能获取一条记录。因此正确的做法是,加上一个where
条件,将查询的结果限制为一条,例如
-- 从数据表中获取数据,然后直接为自定义变量赋值select name from student where id = 2 into @name;-- 查看自定义变量select @name;
最后,在强调一点:自定义变量都是会话级别,只要是当前用户当次连接,都会受到影响,不区分数据库。
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月03日 21时06分15秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
《我是猫》总结
2019-03-06
《抗糖化书》总结
2019-03-06
apache虚拟主机配置
2019-03-06
光盘作为yum源
2019-03-06
PHP 正则表达式资料
2019-03-06
PHP官方网站及PHP手册
2019-03-06
mcrypt加密以及解密过程
2019-03-06
mysql连续聚合
2019-03-06
go等待N个线程完成操作总结
2019-03-06
消息队列 RocketMQ 并发量十万级
2019-03-06
ReactJs入门教程-精华版
2019-03-06
乐观锁悲观锁应用
2019-03-06
简单说说TCP三次握手、四次挥手机制
2019-03-06
.net Core 使用IHttpClientFactory请求
2019-03-06
多线程之旅(准备阶段)
2019-03-06
Python 之网络式编程
2019-03-06
MySql5.5安装步骤及MySql_Front视图配置
2019-03-06
springmvc Controller详解
2019-03-06