Java充电社
专辑
博文
联系我
本人继续续收门徒,亲手指导
MySQL教程
-> 变量
1、MySQL的一些基础知识
2、MySQL中数据类型介绍
3、MySQL管理员常用的一些命令
4、DDL常见操作汇总
5、DML常见操作
6、select查下基础篇
7、select条件查询
8、排序和分页(order by 、limit)
9、分组查询(group by、having)
10、常用函数汇总
11、深入了解连接查询及原理
12、子查询(本篇非常重要,高手必备)
13、细说NULL导致的神坑,让人防不胜防
14、事务详解
15、视图
16、变量
17、存储过程 & 自定义函数详解
18、流程控制语句介绍
19、游标详解
20、异常捕获及处理详解
21、什么是索引?
22、MySQL索引原理详解
23、MySQL索引管理
24、如何正确的使用索引?
25、sql中的where条件在数据库中提取与应用浅析
26、聊聊如何使用MySQL实现分布式锁
27、MySQL如何确保数据不丢失的?有几点我们可以借鉴
28、MySQL系列测试库脚本
29、win10安装mysql5.7.20解压版
上一篇:视图
下一篇:存储过程 & 自定义函数详解
<div style="display:none"></div> Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能。 欢迎大家加我微信itsoku一起交流java、算法、数据库相关技术。 这是Mysql系列第16篇。 环境:mysql5.7.25,cmd命令中进行演示。 **代码中被[]包含的表示可选,|符号分开的表示可选其一。** 我们在使用mysql的过程中,变量也会经常用到,比如查询系统的配置,可以通过查看系统变量来了解,当我们需要修改系统的一些配置的时候,也可以通过修改系统变量的值来进行。 我们需要做一些批处理脚本的时候,可以使用自定义变量,来做到数据的复用。所以变量这块也挺重要,希望大家能够掌握。 ## 本文内容 - 详解系统变量的使用 - 详解自定义变量的使用 ## 变量分类 - 系统变量 - 自定义变量 ## 系统变量 ### 概念 系统变量由系统定义的,不是用户定义的,属于mysql服务器层面的。 ### 系统变量分类 - 全局变量 - 会话变量 ### 使用步骤 #### 查看系统变量 ```java //1.查看系统所有变量 show [global | session] variables; //查看全局变量 show global variables; //查看会话变量 show session variables; show variables; ``` > 上面使用了show关键字 #### 查看满足条件的系统变量 > 通过like模糊匹配指定的变量 ```java //查看满足条件的系统变量(like模糊匹配) show [global|session] like '%变量名%'; ``` > 上面使用了show和like关键字。 #### 查看指定的系统变量 ```java //查看指定的系统变量的值 select @@[global.|session.]系统变量名称; ``` > 注意`select`和`@@`关键字,global和session后面有个.符号。 #### 赋值 ```java //方式1 set [global|session] 系统变量名=值; //方式2 set @@[global.|session.]系统变量名=值; ``` > 注意: > > 上面使用中介绍的,全局变量需要添加global关键字,会话变量需要添加session关键字,如果不写,默认为session级别。 > > 全局变量的使用中用到了`@@`关键字,后面会介绍自定义变量,自定义变量中使用了一个`@`符号,这点需要和全局变量区分一下。 ## 全局变量 ### 作用域 mysql服务器每次启动都会为所有的系统变量设置初始值。 我们为系统变量赋值,针对所有会话(连接)有效,可以跨连接,但不能跨重启,重启之后,mysql服务器会再次为所有系统变量赋初始值。 ### 示例 #### 查看所有全局变量 ```java /*查看所有全局变量*/ show global variables; ``` #### 查看包含'tx'字符的变量 ```java /*查看包含`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) ``` #### 为某个变量赋值 ```java /*为某个系统变量赋值*/ set global autocommit=0; set @@global.autocommit=1; ``` ```java 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) ``` ## 会话变量 ### 作用域 针对当前会话(连接)有效,不能跨连接。 会话变量是在连接创建时由mysql自动给当前会话设置的变量。 ### 示例 #### 查看所有会话变量 ```java /*①查看所有会话变量*/ show session variables; ``` #### 查看满足条件的会话变量 ```java /*②查看满足条件的步伐会话变量*/ /*查看包含`char`字符变量名的会话变量*/ show session variables like '%char%'; ``` #### 查看指定的会话变量的值 ```java /*③查看指定的会话变量的值*/ /*查看事务默认自动提交的设置*/ select @@autocommit; select @@session.autocommit; /*查看事务隔离级别*/ select @@tx_isolation; select @@session.tx_isolation; ``` #### 为某个会话变量赋值 ```java /*④为某个会话变量赋值*/ set @@session.tx_isolation='read-uncommitted'; set @@tx_isolation='read-committed'; set session tx_isolation='read-committed'; set tx_isolation='read-committed'; ``` 效果: ```java 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) ``` ## 自定义变量 ### 概念 变量由用户自定义的,而不是系统提供的。 ### 使用 ```java 使用步骤: 1. 声明 2. 赋值 3. 使用(查看、比较、运算) ``` ### 分类 - 用户变量 - 局部变量 ## 用户变量 ### 作用域 针对当前会话(连接)有效,作用域同会话变量。 用户变量可以在任何地方使用也就是既可以在begin end里面使用,也可以在他外面使用。 ### 使用 #### 声明并初始化(要求声明时必须初始化) ```java /*方式1*/ set @变量名=值; /*方式2*/ set @变量名:=值; /*方式3*/ select @变量名:=值; ``` > 注意: > > 上面使用了`@`符合,而上面介绍全局变量使用了2个`@`符号,这点注意区分一下。 > > set中=号前面冒号是可选的,select方式=前面必须有冒号 #### 赋值(更新变量的值) ```java /*方式1:这块和变量的声明一样*/ set @变量名=值; set @变量名:=值; select @变量名:=值; /*方式2*/ select 字段 into @变量名 from 表; ``` > 注意上面select的两种方式。 #### 使用 ```java select @变量名; ``` ### 综合示例 ```java /*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); ``` ## 局部变量 ### 作用域 declare用于定义局部变量变量,在存储过程和函数中通过declare定义变量在begin...end中,且在语句之前。并且可以通过重复定义多个变量 declare变量的作用范围同编程里面类似,在这里一般是在对应的begin和end之间。在end之后这个变量就没有作用了,不能使用了。这个同编程一样。 ### 使用 #### 声明 ```java declare 变量名 变量类型; declare 变量名 变量类型 [default 默认值]; ``` #### 赋值 ```java /*方式1*/ set 局部变量名=值; set 局部变量名:=值; select 局部变量名:=值; /*方式2*/ select 字段 into 局部变量名 from 表; ``` > 注意:局部变量前面没有`@`符号 #### 使用(查看变量的值) ```java select 局部变量名; ``` ### 示例 ```java /*创建表test1*/ drop table IF EXISTS test1; create table test1(a int PRIMARY KEY,b int); /*声明脚本的结束符为$$*/ DELIMITER $$ 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 $$ /*声明脚本的结束符为;*/ DELIMITER ; /*调用存储过程*/ call proc1(); /*查看结果*/ select * from test1; ``` > 代码中使用到了存储过程,关于存储过程的详解下章节介绍。 #### delimiter关键字 我们写sql的时候,mysql怎么判断sql是否已经结束了,可以去执行了? 需要一个结束符,当mysql看到这个结束符的时候,表示可以执行前面的语句了,mysql默认以分号为结束符。 当我们创建存储过程或者自定义函数的时候,写了很大一片sql,里面包含了很多分号,整个创建语句是一个整体,需要一起执行,此时我们就不可用用分号作为结束符了。 那么我们可以通过`delimiter`关键字来自定义结束符。 **用法:** ```java delimiter 分隔符 ``` #### 上面示例的效果 ```java 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> /*声明脚本的结束符为$$*/ mysql> 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) ``` ## 用户变量和局部变量对比 | | 作用域 | 定义位置 | 语法 | | -------- | --------------------- | --------------------- | ----------------------- | | 用户变量 | 当前会话 | 会话的任何地方 | 加`@`符号,不用指定类型 | | 局部变量 | 定义他的begin end之间 | begin end中的第一句话 | 不加`@`符号,要指定类型 | ## 总结 - **本文对系统变量和自定义变量的使用做了详细的说明,知识点比较细,可以多看几遍,加深理解** - **系统变量可以设置系统的一些配置信息,数据库重启之后会被还原** - **会话变量可以设置当前会话的一些配置信息,对当前会话起效** - **declare创建的局部变量常用于存储过程和函数的创建中** - **作用域:全局变量对整个系统有效、会话变量作用于当前会话、用户变量作用于当前会话、局部变量作用于begin end之间** - **注意全局变量中用到了`@@`,用户变量变量用到了`@`,而局部变量没有这个符号** - **`delimiter`关键字用来声明脚本的结束符** <a style="display:none" target="_blank" href="https://mp.weixin.qq.com/s/_S1DD2JADnXvpexxaBwLLg" style="color:red; font-size:20px; font-weight:bold">继续收门徒,亲手带,月薪 4W 以下的可以来找我</a> ## 最新资料 1. <a href="https://mp.weixin.qq.com/s?__biz=MzkzOTI3Nzc0Mg==&mid=2247484964&idx=2&sn=c81bce2f26015ee0f9632ddc6c67df03&scene=21#wechat_redirect" target="_blank">尚硅谷 Java 学科全套教程(总 207.77GB)</a> 2. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247484192&idx=1&sn=505f2faaa4cc911f553850667749bcbb&scene=21#wechat_redirect" target="_blank">2021 最新版 Java 微服务学习线路图 + 视频</a> 3. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247484573&idx=1&sn=7f3d83892186c16c57bc0b99f03f1ffd&scene=21#wechat_redirect" target="_blank">阿里技术大佬整理的《Spring 学习笔记.pdf》</a> 4. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247484544&idx=2&sn=c1dfe907cfaa5b9ae8e66fc247ccbe84&scene=21#wechat_redirect" target="_blank">阿里大佬的《MySQL 学习笔记高清.pdf》</a> 5. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247485167&idx=1&sn=48d75c8e93e748235a3547f34921dfb7&scene=21#wechat_redirect" target="_blank">2021 版 java 高并发常见面试题汇总.pdf</a> 6. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247485664&idx=1&sn=435f9f515a8f881642820d7790ad20ce&scene=21#wechat_redirect" target="_blank">Idea 快捷键大全.pdf</a> ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/1/2883e86e-3eff-404a-8943-0066e5e2b454.png)
#custom-toc-container