Mysql系列第十六講 變數詳解

qwer1030274531發表於2020-10-09

系統變數

概念

系統變數由系統定義的,不是使用者定義的,屬於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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章