系統變數
概念
系統變數由系統定義的,不是使用者定義的,屬於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
自定義變數
概念
/henan/
變數由使用者自定義的,而不是系統提供的。
使用
使用步驟: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
區域性變數
/anhui/
作用域
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 $$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;123456789101112131415161718192021222324
程式碼中使用到了儲存過程,關於儲存過程的詳解下章節介紹。
changchun/
delimiter關鍵字
我們寫sql的時候,mysql怎麼判斷sql是否已經結束了,可以去執行了?
需要一個結束符,當mysql看到這個結束符的時候,表示可以執行前面的語句了,mysql預設以分號為結束符。
當我們建立儲存過程或者自定義函式的時候,寫了很大一片sql,裡面包含了很多分號,整個建立語句是一個整體,需要一起執行,此時我們就不可用用分號作為結束符了。
那麼我們可以透過delimiter關鍵字來自定義結束符。
用法:
/hebei/
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> /*宣告指令碼的結束符為$$*/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)1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
使用者變數和區域性變數對比
/ningxia/
|
作用域 |
定義位置 |
語法 |
使用者變數 |
當前會話 |
會話的任何地方 |
加@符號,不用指定型別 |
區域性變數 |
定義他的begin end之間 |
begin end中的第一句話 |
不加@符號,要指定型別 |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30239065/viewspace-2725727/,如需轉載,請註明出處,否則將追究法律責任。