mysql的變數類別及作用
閱讀:121
下面跟著筆者一起來了解下mysql的變數類別及作用,相信大家看完肯定會受益匪淺,文字在精不在多,希望mysql的變數類別及作用這篇短內容是你想要的。
mysql 的變數分為四種: 區域性變數 、 使用者變數 、 會話變數 和 全域性變數 ,其中區域性變數只存在於函式和儲存過程,這裡不多了解。其中 會話變數 和 全域性變數 在 mysql 中統稱為 系統變數 。
使用者變數
基本顧名思義,就是使用者定義的變數。如何定義變數呢?有兩種方法:
set 方式# 兩種方式都可以
set @variable = expr
set @variable := expr
select 方式# 必須 :=
select @variable := expr
使用者變數定義備註:未定義變數的初始值為 null(可不定義變數直接使用,不會報錯)
變數名對大小寫不敏感
變數不能在要求字面值的地方使用,比如 select 中的 limit 語句等。
呼叫使用者變數的表示式的計算順序實際上是未定義的,如 select @a = 0, @a := @a + 1;,兩列都可能是 0 。
為使用者變數賦值時,會先確定表示式的值。如何理解,請看如下**:set @m = 0;
set @m = 3, @n = @m;
select @n; # 0
雖然使用者變數的型別可以動態修改,但不建議這麼操作,因為在交接**的時候你可能會有生命危險:p。
作為變數,都是有作用域的,使用者變數的作用是整個會話,即整個會話間都是有效的。這看起來不錯,但要注意,當使用了連線池,自定義的使用者變數又沒有正確初始化,容易出現意想不到的問題。因為它實際上並沒有被銷毀,依舊記錄者上一次的結果。
示例我們來乙個簡單的示例,實現乙個序號的功能,表和資料如下:create table employee (
id int primary key,
salary int not null
insert into employee values(1, 100);
insert into employee values(2, 200);
insert into employee values(3, 300);
根據之前學習的內容,我們可以很快的寫出如下 sql:select salary, (@rowno := @rowno + 1) as 'rowno'
from employee, (select @rowno := 0) r;
沒有問題,一切都和預期一樣,然後我們加乙個 where 條件試試:select salary, (@rowno := @rowno + 1) as 'rowno'
from employee, (select @rowno := 0) r
where @rowno = 0;
理論上來說,這是不應該返回資料的,但是它還就是返回了一條資料,就是 id 為 1 的那條。
為什麼呢? where 條件使用的 @rowno 一直都是同乙個值 0 ,它不會因為 select 上修改了就實時響應 。要實現
where 的功能需要改寫成如下:select salary, rowno
from (
select salary, (@rowno := @rowno + 1) as 'rowno'
from employee, (select @rowno := 0) r
) mwhere rowno = 2;
實際上在 select 的 where 、 group by 和 order by 中使用者變數都不會按預期操作,它使用的是舊值,不會實時修改。
系統變數
會話變數
會話變數為雲伺服器為每個客戶端連線維護的變數。在客戶端連線時,使用相應全域性變數的當前值對客戶端的會話變數進行初始化。
顧名思義,會話變數的作用域就是乙個會話 session 咯。如何為會話變數設定值呢?如下:set session var_name = value;
set @@session.var_name = value;
set var_name = value;
注意,只能為現有的會話變數設定值,不能建立新的會話變數。那如何獲取會話變數呢?如下:show session variables;
# 以上**會把所有會話變數羅列出來,可通過 like 進行過濾
show session variables like "%var%";
全域性變數
全域性變數會影響雲伺服器整體操作。但是一旦重啟,這些設定會被重置。注意要想更改全域性變數,必須具有super許可權。
它的設定和會話變數的設定是類似的:set global var_name = value;
set @@global.var_name = value;
全域性變數也不能新增變數,只能修改已有的。而獲取全域性變數的操作也是和會話變數類似:show session variables;
show global variables like "%var%";
Mysql自定義變數的作用
使用者自定義變數的宣告方法形如 var name,其中變數名稱由字母 數字 和 組成。當然,在以字串或者識別符號引用時也 可以包含其他字元 例如 my var my var 或者 my var 使用者自定義變數是會話級別的變數。其變數的作用域僅限於宣告其的客戶端鏈結。當這個客戶端斷開時,其所有的會話...
mysql負變數 MySQL的變數
系統變數 系統定義好的變數,大部分時候使用者根本不需要使用系統變數。系統變數是用來控 務器表現的。如 autocommit,auto increment increment等。檢視系統變數 檢視所有變數 show variables 檢視範圍變數 show variables like 變數名 修改...
mysql中 變數 mysql中的變數
toc 變數 mysql本質是一種程式語言,需要很多變數來儲存資料。mysql中很多的屬性控制都是通過mysql中固有的變數來實現的。系統變數 系統內部定義的變數,系統變數針對所有使用者 mysql客戶端 有效。檢視系統所有變數 show variables like pattern mysql允許...