史上最簡單的 MySQL 教程(四十)「資料庫變數」,
溫馨提示:本系列博文已經同步到 GitHub,地址為「mysql-tutorial」,歡迎感興趣的童鞋Star
、Fork
,錯誤修正。
變數
在 MySQL 資料庫中,變數有兩種,分別為:系統變數和自訂變數。
根據變數的作用範圍,又分為:
- 會話層級變數:僅對當前用戶端當次串連有效;
- 全域層級變數:對所有用戶端的任一次串連都有效。
系統變數
系統變數,顧名思義,是系統設定好的變數(皆為全域層級變數),也是用來控制伺服器表現的,如autocommit
、wait_timeout
等。
大多數的時候,我們並不需要使用系統變數,但我們仍然需要瞭解有這麼回事,在必須要的時候,它可以協助我們完成特殊的需求。
首先,查看系統變數,文法為:
執行如下 SQL 陳述式,進行測試:
-- 查看系統變數show variables;
如所示,顯示了 MySQL 在本伺服器上共含有 506 個系統變數。更近一步,我們可以查看具體的系統變數的值,文法為:
- 基本文法:
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
的值,但僅作用於會話層級,即只有當前當次串連有效,當再次開啟一個新視窗的時候,我們會發現所有的變數值都恢複如初。
對於修改全域層級變數,文法為:
執行如下 SQL 陳述式,進行測試:
-- 設定全域層級變數set global autocommit = 0;-- 查看系統變數select @@autocommit;
如所示,當我們修改全域變數的時候,其效果對所有用戶端的任一次串連都有效。But,如果某一個用戶端在我們修改全域變數之前已經連上了伺服器並且沒有退出的話,那麼我們的修改對其當前當次串連無效,需要重新登入才會生效。
自訂變數
自訂變數,顧名思義,是使用者自己定義的變數,並且都是會話層級的變數。
系統為了區別系統變數與自訂變數,規定使用者自訂的變數必須使用一個@
符號。設定自訂變數的文法為:
執行如下 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;
如所示,我們擷取資料並賦值成功。
最後,在強調一點:自訂變數都是會話層級,只要是目前使用者當次串連,都會受到影響,不區分資料庫。
溫馨提示:符號[]
括起來的內容,表示可選項;符號+
,則表示串連的意思。
———— ☆☆☆ —— 返回 -> 史上最簡單的 MySQL 教程 <- 目錄 —— ☆☆☆ ————
-
頂
-
1
-
踩
-
0
查看評論