這是Mysql系列第16篇。
環(huán)境:mysql5.7.25,cmd命令中進行演示。
代碼中被[]包含的表示可選,|符號分開的表示可選其一。
我們在使用mysql的過程中,變量也會經常用到,比如查詢系統(tǒng)的配置,可以通過查看系統(tǒng)變量來了解,當我們需要修改系統(tǒng)的一些配置的時候,也可以通過修改系統(tǒng)變量的值來進行。
我們需要做一些批處理腳本的時候,可以使用自定義變量,來做到數(shù)據(jù)的復用。所以變量這塊也挺重要,希望大家能夠掌握。
本文內容
-
詳解系統(tǒng)變量的使用
-
詳解自定義變量的使用
變量分類
-
系統(tǒng)變量
-
自定義變量
系統(tǒng)變量
概念
系統(tǒng)變量由系統(tǒng)定義的,不是用戶定義的,屬于mysql服務器層面的。
系統(tǒng)變量分類
-
全局變量
-
會話變量
使用步驟
查看系統(tǒng)變量
//1.查看系統(tǒng)所有變量
show?[global?|?session]?variables;
//查看全局變量
show?global?variables;
//查看會話變量
show?session?variables;
show?variables;
上面使用了show關鍵字
查看滿足條件的系統(tǒng)變量
通過like模糊匹配指定的變量
//查看滿足條件的系統(tǒng)變量(like模糊匹配)
show?[global|session]?like?'%變量名%';
上面使用了show和like關鍵字。
查看指定的系統(tǒng)變量
//查看指定的系統(tǒng)變量的值
select?@@[global.|session.]系統(tǒng)變量名稱;
注意
select
和@@
關鍵字,global和session后面有個.符號。
賦值
//方式1
set?[global|session]?系統(tǒng)變量名=值;
//方式2
set?@@[global.|session.]系統(tǒng)變量名=值;
注意:
上面使用中介紹的,全局變量需要添加global關鍵字,會話變量需要添加session關鍵字,如果不寫,默認為session級別。
全局變量的使用中用到了
@@
關鍵字,后面會介紹自定義變量,自定義變量中使用了一個@
符號,這點需要和全局變量區(qū)分一下。
全局變量
作用域
mysql服務器每次啟動都會為所有的系統(tǒng)變量設置初始值。
我們?yōu)橄到y(tǒng)變量賦值,針對所有會話(連接)有效,可以跨連接,但不能跨重啟,重啟之后,mysql服務器會再次為所有系統(tǒng)變量賦初始值。
示例
查看所有全局變量
/*查看所有全局變量*/
show?global?variables;
查看包含'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)
/*查看指定名稱的系統(tǒng)變量的值,如查看事務默認自動提交設置*/
mysql>?select?@@global.autocommit;
+---------------------+
|?@@global.autocommit?|
+---------------------+
|???????????????????0?|
+---------------------+
1?row?in?set?(0.00?sec)
為某個變量賦值
/*為某個系統(tǒng)變量賦值*/
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)
會話變量
作用域
針對當前會話(連接)有效,不能跨連接。
會話變量是在連接創(chuàng)建時由mysql自動給當前會話設置的變量。
示例
查看所有會話變量
/*①查看所有會話變量*/
show?session?variables;
查看滿足條件的會話變量
/*②查看滿足條件的步伐會話變量*/
/*查看包含`char`字符變量名的會話變量*/
show?session?variables?like?'%char%';
查看指定的會話變量的值
/*③查看指定的會話變量的值*/
/*查看事務默認自動提交的設置*/
select?@@autocommit;
select?@@session.autocommit;
/*查看事務隔離級別*/
select?@@tx_isolation;
select?@@session.tx_isolation;
為某個會話變量賦值
/*④為某個會話變量賦值*/
set?@@session.tx_isolation='read-uncommitted';
set?@@tx_isolation='read-committed';
set?session?tx_isolation='read-committed';
set?tx_isolation='read-committed';
效果:
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)
自定義變量
概念
變量由用戶自定義的,而不是系統(tǒng)提供的。
使用
使用步驟:
1.?聲明
2.?賦值
3.?使用(查看、比較、運算)
分類
-
用戶變量
-
局部變量
用戶變量
作用域
針對當前會話(連接)有效,作用域同會話變量。
用戶變量可以在任何地方使用也就是既可以在begin end里面使用,也可以在他外面使用。
使用
聲明并初始化(要求聲明時必須初始化)
/*方式1*/
set?@變量名=值;
/*方式2*/
set?@變量名:=值;
/*方式3*/
select?@變量名:=值;
注意:
上面使用了
@
符合,而上面介紹全局變量使用了2個@
符號,這點注意區(qū)分一下。set中=號前面冒號是可選的,select方式=前面必須有冒號
賦值(更新變量的值)
/*方式1:這塊和變量的聲明一樣*/
set?@變量名=值;
set?@變量名:=值;
select?@變量名:=值;
/*方式2*/
select?字段?into?@變量名?from?表;
注意上面select的兩種方式。
使用
select?@變量名;
綜合示例
/*set方式創(chuàng)建變量并初始化*/
set?@username='路人甲java';
/*select?into方式創(chuàng)建變量*/
select?'javacode2018'?into?@gzh;
select?count(*)?into?@empcount?from?employees;
/*select?:=方式創(chuàng)建變量*/
select?@first_name:='路人甲Java',@email:='javacode2018@163.com';
/*使用變量*/
insert?into?employees?(first_name,email)?values?(@first_name,@email);
局部變量
作用域
declare用于定義局部變量變量,在存儲過程和函數(shù)中通過declare定義變量在begin…end中,且在語句之前。并且可以通過重復定義多個變量
declare變量的作用范圍同編程里面類似,在這里一般是在對應的begin和end之間。在end之后這個變量就沒有作用了,不能使用了。這個同編程一樣。
使用
聲明
declare?變量名?變量類型;
declare?變量名?變量類型?[default?默認值];
賦值
/*方式1*/
set?局部變量名=值;
set?局部變量名:=值;
select?局部變量名:=值;
/*方式2*/
select?字段?into?局部變量名?from?表;
注意:局部變量前面沒有
@
符號
使用(查看變量的值)
select?局部變量名;
示例
/*創(chuàng)建表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;
代碼中使用到了存儲過程,關于存儲過程的詳解下章節(jié)介紹。
delimiter關鍵字
我們寫sql的時候,mysql怎么判斷sql是否已經結束了,可以去執(zhí)行了?
需要一個結束符,當mysql看到這個結束符的時候,表示可以執(zhí)行前面的語句了,mysql默認以分號為結束符。
當我們創(chuàng)建存儲過程或者自定義函數(shù)的時候,寫了很大一片sql,里面包含了很多分號,整個創(chuàng)建語句是一個整體,需要一起執(zhí)行,此時我們就不可用用分號作為結束符了。
那么我們可以通過delimiter
關鍵字來自定義結束符。
用法:
delimiter?分隔符
上面示例的效果
mysql>?/*創(chuàng)建表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中的第一句話 | 不加@ 符號,要指定類型 |
總結
-
本文對系統(tǒng)變量和自定義變量的使用做了詳細的說明,知識點比較細,可以多看幾遍,加深理解
-
系統(tǒng)變量可以設置系統(tǒng)的一些配置信息,數(shù)據(jù)庫重啟之后會被還原
-
會話變量可以設置當前會話的一些配置信息,對當前會話起效
-
declare創(chuàng)建的局部變量常用于存儲過程和函數(shù)的創(chuàng)建中
-
作用域:全局變量對整個系統(tǒng)有效、會話變量作用于當前會話、用戶變量作用于當前會話、局部變量作用于begin end之間
-
注意全局變量中用到了`@@`,用戶變量變量用到了`@`,而局部變量沒有這個符號文章來源:http://www.zghlxwxcb.cn/news/detail-700287.html
-
`delimiter`關鍵字用來聲明腳本的結束符文章來源地址http://www.zghlxwxcb.cn/news/detail-700287.html
到了這里,關于玩轉Mysql系列 - 第16篇:變量詳解的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!