为了账号安全,请及时绑定邮箱和手机立即绑定

Mysql系列第十六讲 变量详解

标签:
MySQL

系统变量
概念
系统变量由系统定义的,不是用户定义的,属于mysql服务器层面的。

系统变量分类

全局变量

会话变量

使用步骤

查看系统变量

//1.查看系统所有变量show [global | session] variables;//查看全局变量show global variables;//查看会话变量show session variables;show variables;1234567
上面使用了show关键字

查看满足条件的系统变量

通过like模糊匹配指定的变量

//查看满足条件的系统变量(like模糊匹配)show [global|session] like ‘%变量名%’;12
上面使用了show和like关键字。

查看指定的系统变量

//查看指定的系统变量的值select @@[global.|session.]系统变量名称;12
注意select和@@关键字,global和session后面有个.符号。

赋值

//方式1set [global|session] 系统变量名=值;//方式2set @@[global.|session.]系统变量名=值;12345
注意:

上面使用中介绍的,全局变量需要添加global关键字,会话变量需要添加session关键字,如果不写,默认为session级别。

全局变量的使用中用到了@@关键字,后面会介绍自定义变量,自定义变量中使用了一个@符号,这点需要和全局变量区分一下。

全局变量
作用域
mysql服务器每次启动都会为所有的系统变量设置初始值。

我们为系统变量赋值,针对所有会话(连接)有效,可以跨连接,但不能跨重启,重启之后,mysql服务器会再次为所有系统变量赋初始值。

示例

查看所有全局变量

/查看所有全局变量/show global variables;12
查看包含’tx’字符的变量

/查看包含tx字符的变量/mysql> show global variables like ‘%tx%’;±--------------±----------------+| Variable_name | Value |±--------------±----------------+| tx_isolation | REPEATABLE-READ || tx_read_only | OFF |±--------------±----------------+2 rows in set, 1 warning (0.00 sec)/查看指定名称的系统变量的值,如查看事务默认自动提交设置/mysql> select @@global.autocommit;±--------------------+| @@global.autocommit |±--------------------+| 0 |±--------------------+1 row in set (0.00 sec)123456789101112131415161718
为某个变量赋值

/为某个系统变量赋值/set global autocommit=0;set @@global.autocommit=1;mysql> set global autocommit=0;Query OK, 0 rows affected (0.00 sec)mysql> select @@global.autocommit;±--------------------+| @@global.autocommit |±--------------------+| 0 |±--------------------+1 row in set (0.00 sec)mysql> set @@global.autocommit=1;Query OK, 0 rows affected (0.00 sec)mysql> select @@global.autocommit;±--------------------+| @@global.autocommit |±--------------------+| 1 |±--------------------+1 row in set (0.00 sec)123456789101112131415161718192021222324
会话变量
作用域

针对当前会话(连接)有效,不能跨连接。

会话变量是在连接创建时由mysql自动给当前会话设置的变量。

示例

查看所有会话变量

/①查看所有会话变量/show session variables;12
查看满足条件的会话变量
/②查看满足条件的步伐会话变量//查看包含char字符变量名的会话变量/show session variables like ‘%char%’;123
查看指定的会话变量的值

/③查看指定的会话变量的值//查看事务默认自动提交的设置/select @@autocommit;select @@session.autocommit;/查看事务隔离级别/select @@tx_isolation;select @@session.tx_isolation;1234567
为某个会话变量赋值

/④为某个会话变量赋值/set @@session.tx_isolation=‘read-uncommitted’;set @@tx_isolation=‘read-committed’;set session tx_isolation=‘read-committed’;set tx_isolation=‘read-committed’;12345
效果:

mysql> select @@tx_isolation;±---------------+| @@tx_isolation |±---------------+| READ-COMMITTED |±---------------+1 row in set, 1 warning (0.00 sec)mysql> set tx_isolation=‘read-committed’;Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> select @@tx_isolation;±---------------+| @@tx_isolation |±---------------+| READ-COMMITTED |±---------------+1 row in set, 1 warning (0.00 sec)123456789101112131415161718
自定义变量
概念

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

使用

使用步骤:1. 声明2. 赋值3. 使用(查看、比较、运算)1234
分类

用户变量

局部变量

用户变量
作用域

针对当前会话(连接)有效,作用域同会话变量。

用户变量可以在任何地方使用也就是既可以在begin end里面使用,也可以在他外面使用。

使用

声明并初始化(要求声明时必须初始化)

/方式1/set @变量名=值;/方式2/set @变量名:=值;/方式3/select @变量名:=值;123456
注意:

上面使用了@符合,而上面介绍全局变量使用了2个@符号,这点注意区分一下。

set中=号前面冒号是可选的,select方式=前面必须有冒号

赋值(更新变量的值)

/方式1:这块和变量的声明一样/set @变量名=值;set @变量名:=值;select @变量名:=值;/方式2/select 字段 into @变量名 from 表;1234567
注意上面select的两种方式。

使用

select @变量名;1
综合示例

/set方式创建变量并初始化/set @username=‘路人甲java’;/select into方式创建变量/select ‘javacode2018’ into @gzh;select count(*) into @empcount from employees;/select :=方式创建变量/select @first_name:=‘路人甲Java’,@email:=‘javacode2018@163.com’;/使用变量/insert into employees (first_name,email) values (@first_name,@email);12345678910
局部变量
作用域

declare用于定义局部变量变量,在存储过程和函数中通过declare定义变量在begin…end中,且在语句之前。并且可以通过重复定义多个变量

declare变量的作用范围同编程里面类似,在这里一般是在对应的begin和end之间。在end之后这个变量就没有作用了,不能使用了。这个同编程一样。

使用

声明

declare 变量名 变量类型;declare 变量名 变量类型 [default 默认值];12
赋值

/方式1/set 局部变量名=值;set 局部变量名:=值;select 局部变量名:=值;/方式2/select 字段 into 局部变量名 from 表;1234567
注意:局部变量前面没有@符号

使用(查看变量的值)

select 局部变量名;1
示例

/创建表test1/drop table IF EXISTS test1;create table test1(a int PRIMARY KEY,b int);/声明脚本的结束符为∗/DELIMITER*/DELIMITER /DELIMITERDROP PROCEDURE IF EXISTS proc1;CREATE PROCEDURE proc1()BEGIN
/声明了一个局部变量/
DECLARE v_a int;
select ifnull(max(a),0)+1 into v_a from test1;
select @v_b:=v_a
2;
insert into test1(a,b) select v_a,@v_b;end $$/声明脚本的结束符为;/DELIMITER ;/调用存储过程/call proc1();/查看结果/select * from test1;123456789101112131415161718192021222324
代码中使用到了存储过程,关于存储过程的详解下章节介绍。

delimiter关键字
我们写sql的时候,mysql怎么判断sql是否已经结束了,可以去执行了?

需要一个结束符,当mysql看到这个结束符的时候,表示可以执行前面的语句了,mysql默认以分号为结束符。

当我们创建存储过程或者自定义函数的时候,写了很大一片sql,里面包含了很多分号,整个创建语句是一个整体,需要一起执行,此时我们就不可用用分号作为结束符了。

那么我们可以通过delimiter关键字来自定义结束符。

用法:
delimiter 分隔符1
上面示例的效果

mysql> /创建表test1/mysql> drop table IF EXISTS test1;Query OK, 0 rows affected (0.01 sec)mysql> create table test1(a int PRIMARY KEY,b int);Query OK, 0 rows affected (0.01 sec)mysql>mysql> /声明脚本的结束符为KaTeX parse error: Expected 'EOF', got '&' at position 8: */mysql&̲gt; DELIMITER
mysql> DROP PROCEDURE IF EXISTS proc1;
-> CREATE PROCEDURE proc1()
-> BEGIN
-> /声明了一个局部变量/
-> DECLARE v_a int;
->
-> select ifnull(max(a),0)+1 into v_a from test1;
-> select @v_b:=v_a
2;
-> insert into test1(a,b) select v_a,@v_b;
-> end $$
Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)mysql>mysql> /声明脚本的结束符为;/mysql> DELIMITER ;mysql>mysql> /调用存储过程/mysql> call proc1();±------------+| @v_b:=v_a*2 |±------------+| 2 |±------------+1 row in set (0.00 sec)Query OK, 1 row affected (0.01 sec)mysql> /查看结果/mysql> select * from test1;±–±-----+| a | b |±–±-----+| 1 | 2 |±–±-----+1 row in set (0.00 sec)1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
用户变量和局部变量对比
作用域 定义位置 语法
用户变量 当前会话 会话的任何地方 加@符号,不用指定类型
局部变量 定义他的begin end之间 begin end中的第一句话 不加@符号,要指定类型

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消