共計(jì) 21128 個(gè)字符,預(yù)計(jì)需要花費(fèi) 53 分鐘才能閱讀完成。
今天丸趣 TV 小編給大家分享一下 MySQL 中的變量、流程控制與游標(biāo)怎么用的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
1. 變量
在 MySQL 數(shù)據(jù)庫的存儲(chǔ)過程和函數(shù)中,可以使用變量來存儲(chǔ)查詢或計(jì)算的中間結(jié)果數(shù)據(jù),或者輸出最終的結(jié)果數(shù)據(jù)。
在 MySQL 數(shù)據(jù)庫中,變量分為系統(tǒng)變量以及用戶自定義變量?!鞠嚓P(guān)推薦:mysql 視頻教程】
1.1 系統(tǒng)變量 1.1.1 系統(tǒng)變量分類
變量由系統(tǒng)定義,不是用戶定義,屬于服務(wù)器層面。啟動(dòng) MySQL 服務(wù),生成 MySQL 服務(wù)實(shí)例期間,MySQL 將為 MySQL 服務(wù)器內(nèi)存中的系統(tǒng)變量賦值,這些系統(tǒng)變量定義了當(dāng)前 MySQL 服務(wù)實(shí)例的屬性、特征。這些系統(tǒng)變量的值要么是編譯 MySQL 時(shí)參數(shù)的默認(rèn)值,要么是配置文件(例如 my.ini 等)中的參數(shù)值。大家可以通過網(wǎng)址 https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html 查看 MySQL 文檔的系統(tǒng)變量。
系統(tǒng)變量分為全局系統(tǒng)變量(需要添加 global 關(guān)鍵字)以及會(huì)話系統(tǒng)變量(需要添加 session 關(guān)鍵字),有時(shí)也把全局系統(tǒng)變量簡稱為全局變量,有時(shí)也把會(huì)話系統(tǒng)變量稱為 local 變量。如果不寫,默認(rèn)會(huì)話級(jí)別。靜態(tài)變量(在 MySQL 服務(wù)實(shí)例運(yùn)行期間它們的值不能使用 set 動(dòng)態(tài)修改)屬于特殊的全局系統(tǒng)變量。
每一個(gè) MySQL 客戶機(jī)成功連接 MySQL 服務(wù)器后,都會(huì)產(chǎn)生與之對(duì)應(yīng)的會(huì)話。會(huì)話期間,MySQL 服務(wù)實(shí)例會(huì)在 MySQL 服務(wù)器內(nèi)存中生成與該會(huì)話對(duì)應(yīng)的會(huì)話系統(tǒng)變量,這些會(huì)話系統(tǒng)變量的初始值是全局系統(tǒng)變量值的復(fù)制。如下圖:
全局系統(tǒng)變量針對(duì)于所有會(huì)話(連接)有效,但不能跨重啟
會(huì)話系統(tǒng)變量僅針對(duì)于當(dāng)前會(huì)話(連接)有效。會(huì)話期間,當(dāng)前會(huì)話對(duì)某個(gè)會(huì)話系統(tǒng)變量值的修改,不會(huì)影響其他會(huì)話同一個(gè)會(huì)話系統(tǒng)變量的值。
會(huì)話 1 對(duì)某個(gè)全局系統(tǒng)變量值的修改會(huì)導(dǎo)致會(huì)話 2 中同一個(gè)全局系統(tǒng)變量值的修改。
在 MySQL 中有些系統(tǒng)變量只能是全局的,例如 max_connections 用于限制服務(wù)器的最大連接數(shù);有些系統(tǒng)變量作用域既可以是全局又可以是會(huì)話,例如 character_set_client 用于設(shè)置客戶端的字符集;有些系統(tǒng)變量的作用域只能是當(dāng)前會(huì)話,例如 pseudo_thread_id 用于標(biāo)記當(dāng)前會(huì)話的 MySQL 連接 ID。
1.1.2 查看系統(tǒng)變量
查看所有或部分系統(tǒng)變量
# 查看所有全局變量
SHOW GLOBAL VARIABLES;
#查看所有會(huì)話變量
SHOW SESSION VARIABLES;
SHOW VARIABLES;
# 查看滿足條件的部分系統(tǒng)變量。SHOW GLOBAL VARIABLES LIKE % 標(biāo)識(shí)符 %
#查看滿足條件的部分會(huì)話變量
SHOW SESSION VARIABLES LIKE % 標(biāo)識(shí)符 %
舉例:
SHOW GLOBAL VARIABLES LIKE admin_%
查看指定系統(tǒng)變量
作為 MySQL 編碼規(guī)范,MySQL 中的系統(tǒng)變量以兩個(gè)“@”開頭,其中“@@global”僅用于標(biāo)記全局系統(tǒng)變量,“@@session”僅用于標(biāo)記會(huì)話系統(tǒng)變量?!癅@”首先標(biāo)記會(huì)話系統(tǒng)變量,如果會(huì)話系統(tǒng)變量不存在,則標(biāo)記全局系統(tǒng)變量。
# 查看指定的系統(tǒng)變量的值
SELECT @@global. 變量名;
#查看指定的會(huì)話變量的值
SELECT @@session. 變量名;
SELECT @@變量名;
修改系統(tǒng)變量的值
有些時(shí)候,數(shù)據(jù)庫管理員需要修改系統(tǒng)變量的默認(rèn)值,以便修改當(dāng)前會(huì)話或者 MySQL 服務(wù)實(shí)例的屬性、特征。具體方法:
方式 1:修改 MySQL 配置文件,繼而修改 MySQL 系統(tǒng)變量的值(該方法需要重啟 MySQL 服務(wù))
方式 2:在 MySQL 服務(wù)運(yùn)行期間,使用“set”命令重新設(shè)置系統(tǒng)變量的值
# 為某個(gè)系統(tǒng)變量賦值
#方式 1:SET @@global. 變量名 = 變量值;
#方式 2:SET GLOBAL 變量名 = 變量值;
# 方式 2:SET SESSION 變量名 = 變量值;
舉例:
SELECT @@global.autocommit;
SET GLOBAL autocommit=0;
SELECT @@session.tx_isolation;
SET @@session.tx_isolation= read-uncommitted
SET GLOBAL max_connections = 1000;
SELECT @@global.max_connections;
1.2 用戶變量 1.2.1 用戶變量分類
用戶變量是用戶自己定義的,作為 MySQL 編碼規(guī)范,MySQL 中的用戶變量以一個(gè)“@”開頭。根據(jù)作用范圍不同,又分為會(huì)話用戶變量和局部變量。
會(huì)話用戶變量:作用域和會(huì)話變量一樣,只對(duì)當(dāng)前連接會(huì)話有效。
局部變量:只在 BEGIN 和 END 語句塊中有效。局部變量只能在存儲(chǔ)過程和函數(shù)中使用。
1.2.2 會(huì)話用戶變量
變量的定義
# 方式 1:“=”或“:=”SET @用戶變量 = 值;
SET @用戶變量 := 值;
#方式 2:“:=” 或 INTO 關(guān)鍵字
SELECT @用戶變量
:= 表達(dá)式 [FROM 等子句];
SELECT 表達(dá)式 INTO @用戶變量 [FROM 等子句];
查看用戶變量的值(查看、比較、運(yùn)算等)
SELECT @用戶變量
舉例
SET @a = 1;
SELECT @a;
SELECT @num := COUNT(*) FROM employees;
SELECT @num;
SELECT AVG(salary) INTO @avgsalary FROM employees;
SELECT @avgsalary;
SELECT @big; # 查看某個(gè)未聲明的變量時(shí),將得到 NULL 值
1.2.3 局部變量
定義:可以使用 DECLARE 語句定義一個(gè)局部變量
作用域:僅僅在定義它的 BEGIN … END 中有效
位置:只能放在 BEGIN … END 中,而且只能放在第一句
BEGIN
#聲明局部變量
DECLARE 變量名 1 變量數(shù)據(jù)類型 [DEFAULT 變量默認(rèn)值];
DECLARE 變量名 2, 變量名 3,... 變量數(shù)據(jù)類型 [DEFAULT 變量默認(rèn)值];
#為局部變量賦值
SET 變量名 1 = 值;
SELECT 值 INTO 變量名 2 [FROM 子句];
#查看局部變量的值
SELECT 變量 1, 變量 2, 變量 3;
END
1. 定義變量
DECLARE 變量名 類型 [default 值]; # 如果沒有 DEFAULT 子句,初始值為 NULL
舉例:
DECLARE myparam INT DEFAULT 100;
2. 變量賦值
方式 1:一般用于賦簡單的值
SET 變量名 = 值;
SET 變量名:= 值;
方式 2:一般用于賦表中的字段值
SELECT 字段名或表達(dá)式 INTO 變量名 FROM 表;
3. 使用變量(查看、比較、運(yùn)算等)
SELECT 局部變量名;
舉例 1:聲明局部變量,并分別賦值為 employees 表中 employee_id 為 102 的 last_name 和 salary
DELIMITER //
CREATE PROCEDURE set_value()
BEGIN
DECLARE emp_name VARCHAR(25);
DECLARE sal DOUBLE(10,2);
SELECT last_name,salary INTO emp_name,sal
FROM employees
WHERE employee_id = 102;
SELECT emp_name,sal;
END //
DELIMITER ;
舉例 2:聲明兩個(gè)變量,求和并打?。ǚ謩e使用會(huì)話用戶變量、局部變量的方式實(shí)現(xiàn))
# 方式 1:使用用戶變量
SET @m=1;
SET @n=1;
SET @sum=@m+@n;
SELECT @sum;
# 方式 2:使用局部變量
DELIMITER //
CREATE PROCEDURE add_value()
BEGIN
#局部變量
DECLARE m INT DEFAULT 1;
DECLARE n INT DEFAULT 3;
DECLARE SUM INT;
SET SUM = m+n;
SELECT SUM;
END //
DELIMITER ;
舉例 3:創(chuàng)建存儲(chǔ)過程“different_salary”查詢某員工和他領(lǐng)導(dǎo)的薪資差距,并用 IN 參數(shù) emp_id 接收員工 id,用 OUT 參數(shù) dif_salary 輸出薪資差距結(jié)果。
# 聲明
DELIMITER //
CREATE PROCEDURE different_salary(IN emp_id INT,OUT dif_salary DOUBLE)
BEGIN
#聲明局部變量
DECLARE emp_sal,mgr_sal DOUBLE DEFAULT 0.0;
DECLARE mgr_id INT;
SELECT salary INTO emp_sal FROM employees WHERE employee_id = emp_id;
SELECT manager_id INTO mgr_id FROM employees WHERE employee_id = emp_id;
SELECT salary INTO mgr_sal FROM employees WHERE employee_id = mgr_id;
SET dif_salary = mgr_sal - emp_sal;
END //
DELIMITER ;
SET @emp_id = 102;
CALL different_salary(@emp_id,@diff_sal);
SELECT @diff_sal;
1.2.4 對(duì)比會(huì)話用戶變量與局部變量
作用域 定義位置 語法
會(huì)話用戶變量 當(dāng)前會(huì)話 會(huì)話的任何地方 加 @符號(hào),不用指定類型
局部變量 定義它的 BEGIN END 中 BEGIN END 的第一句話 一般不用加 @, 需要指定類型
2. 定義條件與處理程序
定義條件是事先定義程序執(zhí)行過程中可能遇到的問題,處理程序定義了在遇到問題時(shí)應(yīng)當(dāng)采取的處理方式,并且保證存儲(chǔ)過程或函數(shù)在遇到警告或錯(cuò)誤時(shí)能繼續(xù)執(zhí)行。這樣可以增強(qiáng)存儲(chǔ)程序處理問題的能力,避免程序異常停止運(yùn)行。
說明:定義條件和處理程序在存儲(chǔ)過程、存儲(chǔ)函數(shù)中都是支持的。
2.1 案例分析
案例分析:創(chuàng)建一個(gè)名稱為“UpdateDataNoCondition”的存儲(chǔ)過程。代碼如下:
DELIMITER //
CREATE PROCEDURE UpdateDataNoCondition()
BEGIN
SET @x = 1;
UPDATE employees SET email = NULL WHERE last_name = Abel
SET @x = 2;
UPDATE employees SET email = aabbel WHERE last_name = Abel
SET @x = 3;
END //
DELIMITER ;
調(diào)用存儲(chǔ)過程:
mysql CALL UpdateDataNoCondition();
ERROR 1048 (23000): Column email cannot be null
mysql SELECT @x;
+------+
| @x |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
可以看到,此時(shí) @x 變量的值為 1。結(jié)合創(chuàng)建存儲(chǔ)過程的 SQL 語句代碼可以得出:在存儲(chǔ)過程中未定義條件和處理程序,且當(dāng)存儲(chǔ)過程中執(zhí)行的 SQL 語句報(bào)錯(cuò)時(shí),MySQL 數(shù)據(jù)庫會(huì)拋出錯(cuò)誤,并退出當(dāng)前 SQL 邏輯,不再向下繼續(xù)執(zhí)行。
2.2 定義條件
定義條件就是給 MySQL 中的錯(cuò)誤碼命名,這有助于存儲(chǔ)的程序代碼更清晰。它將一個(gè)錯(cuò)誤名字和指定的錯(cuò)誤條件關(guān)聯(lián)起來。這個(gè)名字可以隨后被用在定義處理程序的 DECLARE HANDLER 語句中。
定義條件使用 DECLARE 語句,語法格式如下:
DECLARE 錯(cuò)誤名稱 CONDITION FOR 錯(cuò)誤碼(或錯(cuò)誤條件)
錯(cuò)誤碼的說明:
MySQL_error_code 和 sqlstate_value 都可以表示 MySQL 的錯(cuò)誤。
MySQL_error_code 是數(shù)值類型錯(cuò)誤代碼。
sqlstate_value 是長度為 5 的字符串類型錯(cuò)誤代碼。
例如,在 ERROR 1418 (HY000) 中,1418 是 MySQL_error_code,HY000 是 sqlstate_value。
例如,在 ERROR 1142(42000)中,1142 是 MySQL_error_code,42000 是 sqlstate_value。
舉例 1:定義“Field_Not_Be_NULL”錯(cuò)誤名與 MySQL 中違反非空約束的錯(cuò)誤類型是“ERROR 1048 (23000)”對(duì)應(yīng)。
# 使用 MySQL_error_code
DECLARE Field_Not_Be_NULL CONDITION FOR 1048;
#使用 sqlstate_value
DECLARE Field_Not_Be_NULL CONDITION FOR SQLSTATE 23000
舉例 2:定義 ERROR 1148(42000) 錯(cuò)誤,名稱為 command_not_allowed。
# 使用 MySQL_error_code
DECLARE command_not_allowed CONDITION FOR 1148;
#使用 sqlstate_value
DECLARE command_not_allowed CONDITION FOR SQLSTATE 42000
2.3 定義處理程序
可以為 SQL 執(zhí)行過程中發(fā)生的某種類型的錯(cuò)誤定義特殊的處理程序。定義處理程序時(shí),使用 DECLARE 語句的語法如下:
DECLARE 處理方式 HANDLER FOR 錯(cuò)誤類型 處理語句
處理方式:處理方式有 3 個(gè)取值:CONTINUE、EXIT、UNDO。
CONTINUE:表示遇到錯(cuò)誤不處理,繼續(xù)執(zhí)行。
EXIT:表示遇到錯(cuò)誤馬上退出。
UNDO:表示遇到錯(cuò)誤后撤回之前的操作。MySQL 中暫時(shí)不支持這樣的操作。
錯(cuò)誤類型(即條件)可以有如下取值:
SQLSTATE 字符串錯(cuò)誤碼:表示長度為 5 的 sqlstate_value 類型的錯(cuò)誤代碼;
MySQL_error_code:匹配數(shù)值類型錯(cuò)誤代碼;
錯(cuò)誤名稱:表示 DECLARE … CONDITION 定義的錯(cuò)誤條件名稱。
SQLWARNING:匹配所有以 01 開頭的 SQLSTATE 錯(cuò)誤代碼;
NOT FOUND:匹配所有以 02 開頭的 SQLSTATE 錯(cuò)誤代碼;
SQLEXCEPTION:匹配所有沒有被 SQLWARNING 或 NOT FOUND 捕獲的 SQLSTATE 錯(cuò)誤代碼;
處理語句:如果出現(xiàn)上述條件之一,則采用對(duì)應(yīng)的處理方式,并執(zhí)行指定的處理語句。語句可以是像“SET 變量 = 值”這樣的簡單語句,也可以是使用 BEGIN … END 編寫的復(fù)合語句。
定義處理程序的幾種方式,代碼如下:
# 方法 1:捕獲 sqlstate_value
DECLARE CONTINUE HANDLER FOR SQLSTATE 42S02 SET @info = NO_SUCH_TABLE
#方法 2:捕獲 mysql_error_value
DECLARE CONTINUE HANDLER FOR 1146 SET @info = NO_SUCH_TABLE
#方法 3:先定義條件,再調(diào)用
DECLARE no_such_table CONDITION FOR 1146;
DECLARE CONTINUE HANDLER FOR NO_SUCH_TABLE SET @info = NO_SUCH_TABLE
#方法 4:使用 SQLWARNING
DECLARE EXIT HANDLER FOR SQLWARNING SET @info = ERROR
#方法 5:使用 NOT FOUND
DECLARE EXIT HANDLER FOR NOT FOUND SET @info = NO_SUCH_TABLE
#方法 6:使用 SQLEXCEPTION
DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info = ERROR
2.4 案例解決
在存儲(chǔ)過程中,定義處理程序,捕獲 sqlstate_value 值,當(dāng)遇到 MySQL_error_code 值為 1048 時(shí),執(zhí)行 CONTINUE 操作,并且將 @proc_value 的值設(shè)置為 -1。
DELIMITER //
CREATE PROCEDURE UpdateDataNoCondition()
BEGIN
#定義處理程序
DECLARE CONTINUE HANDLER FOR 1048 SET @proc_value = -1;
SET @x = 1;
UPDATE employees SET email = NULL WHERE last_name = Abel
SET @x = 2;
UPDATE employees SET email = aabbel WHERE last_name = Abel
SET @x = 3;
END //
DELIMITER ;
調(diào)用過程:
mysql CALL UpdateDataWithCondition();
Query OK, 0 rows affected (0.01 sec)
mysql SELECT @x,@proc_value;
+------+-------------+
| @x | @proc_value |
+------+-------------+
| 3 | -1 |
+------+-------------+
1 row in set (0.00 sec)
舉例:
創(chuàng)建一個(gè)名稱為“InsertDataWithCondition”的存儲(chǔ)過程,代碼如下。
在存儲(chǔ)過程中,定義處理程序,捕獲 sqlstate_value 值,當(dāng)遇到 sqlstate_value 值為 23000 時(shí),執(zhí)行 EXIT 操作,并且將 @proc_value 的值設(shè)置為 -1。
# 準(zhǔn)備工作
CREATE TABLE departments
SELECT * FROM atguigudb.`departments`;
ALTER TABLE departments
ADD CONSTRAINT uk_dept_name UNIQUE(department_id);
DELIMITER //
CREATE PROCEDURE InsertDataWithCondition()
BEGIN
DECLARE duplicate_entry CONDITION FOR SQLSTATE 23000 ;
DECLARE EXIT HANDLER FOR duplicate_entry SET @proc_value = -1;
SET @x = 1;
INSERT INTO departments(department_name) VALUES( 測試
SET @x = 2;
INSERT INTO departments(department_name) VALUES( 測試
SET @x = 3;
END //
DELIMITER ;
調(diào)用存儲(chǔ)過程:
mysql CALL InsertDataWithCondition();
Query OK, 0 rows affected (0.01 sec)
mysql SELECT @x,@proc_value;
+------+-------------+
| @x | @proc_value |
+------+-------------+
| 2 | -1 |
+------+-------------+
1 row in set (0.00 sec)
3. 流程控制
解決復(fù)雜問題不可能通過一個(gè) SQL 語句完成,我們需要執(zhí)行多個(gè) SQL 操作。流程控制語句的作用就是控制存儲(chǔ)過程中 SQL 語句的執(zhí)行順序,是我們完成復(fù)雜操作必不可少的一部分。只要是執(zhí)行的程序,流程就分為三大類:
順序結(jié)構(gòu):程序從上往下依次執(zhí)行
分支結(jié)構(gòu):程序按條件進(jìn)行選擇執(zhí)行,從兩條或多條路徑中選擇一條執(zhí)行
循環(huán)結(jié)構(gòu):程序滿足一定條件下,重復(fù)執(zhí)行一組語句
針對(duì)于 MySQL 的流程控制語句主要有 3 類。注意:只能用于存儲(chǔ)程序。
條件判斷語句:IF 語句和 CASE 語句
循環(huán)語句:LOOP、WHILE 和 REPEAT 語句
跳轉(zhuǎn)語句:ITERATE 和 LEAVE 語句
3.1 分支結(jié)構(gòu)之 IF
IF 語句的語法結(jié)構(gòu)是:
IF 表達(dá)式 1 THEN 操作 1
[ELSEIF 表達(dá)式 2 THEN 操作 2]……
[ELSE 操作 N]
END IF
根據(jù)表達(dá)式的結(jié)果為 TRUE 或 FALSE 執(zhí)行相應(yīng)的語句。這里“[]”中的內(nèi)容是可選的。
特點(diǎn):① 不同的表達(dá)式對(duì)應(yīng)不同的操作 ② 使用在 begin end 中
舉例 1:
IF val IS NULL
THEN SELECT val is null
ELSE SELECT val is not null
END IF;
舉例 2:聲明存儲(chǔ)過程“update_salary_by_eid1”,定義 IN 參數(shù) emp_id,輸入員工編號(hào)。判斷該員工薪資如果低于 8000 元并且入職時(shí)間超過 5 年,就漲薪 500 元;否則就不變。
DELIMITER //
CREATE PROCEDURE update_salary_by_eid1(IN emp_id INT)
BEGIN
DECLARE emp_salary DOUBLE;
DECLARE hire_year DOUBLE;
SELECT salary INTO emp_salary FROM employees WHERE employee_id = emp_id;
SELECT DATEDIFF(CURDATE(),hire_date)/365 INTO hire_year
FROM employees WHERE employee_id = emp_id;
IF emp_salary 8000 AND hire_year 5
THEN UPDATE employees SET salary = salary + 500 WHERE employee_id = emp_id;
END IF;
END //
DELIMITER ;
舉例 3:聲明存儲(chǔ)過程“update_salary_by_eid2”,定義 IN 參數(shù) emp_id,輸入員工編號(hào)。判斷該員工薪資如果低于 9000 元并且入職時(shí)間超過 5 年,就漲薪 500 元;否則就漲薪 100 元。
DELIMITER //
CREATE PROCEDURE update_salary_by_eid2(IN emp_id INT)
BEGIN
DECLARE emp_salary DOUBLE;
DECLARE hire_year DOUBLE;
SELECT salary INTO emp_salary FROM employees WHERE employee_id = emp_id;
SELECT DATEDIFF(CURDATE(),hire_date)/365 INTO hire_year
FROM employees WHERE employee_id = emp_id;
IF emp_salary 8000 AND hire_year 5
THEN UPDATE employees SET salary = salary + 500 WHERE employee_id = emp_id;
ELSE
UPDATE employees SET salary = salary + 100 WHERE employee_id = emp_id;
END IF;
END //
DELIMITER ;
舉例 4:聲明存儲(chǔ)過程“update_salary_by_eid3”,定義 IN 參數(shù) emp_id,輸入員工編號(hào)。判斷該員工薪資如果低于 9000 元,就更新薪資為 9000 元;薪資如果大于等于 9000 元且低于 10000 的,但是獎(jiǎng)金比例為 NULL 的,就更新獎(jiǎng)金比例為 0.01;其他的漲薪 100 元。
DELIMITER //
CREATE PROCEDURE update_salary_by_eid3(IN emp_id INT)
BEGIN
DECLARE emp_salary DOUBLE;
DECLARE bonus DECIMAL(3,2);
SELECT salary INTO emp_salary FROM employees WHERE employee_id = emp_id;
SELECT commission_pct INTO bonus FROM employees WHERE employee_id = emp_id;
IF emp_salary 9000
THEN UPDATE employees SET salary = 9000 WHERE employee_id = emp_id;
ELSEIF emp_salary 10000 AND bonus IS NULL
THEN UPDATE employees SET commission_pct = 0.01 WHERE employee_id = emp_id;
ELSE
UPDATE employees SET salary = salary + 100 WHERE employee_id = emp_id;
END IF;
END //
DELIMITER ;
3.2 分支結(jié)構(gòu)之 CASE
CASE 語句的語法結(jié)構(gòu) 1:
# 情況一:類似于 switch
CASE 表達(dá)式
WHEN 值 1 THEN 結(jié)果 1 或語句 1(如果是語句,需要加分號(hào))
WHEN 值 2 THEN 結(jié)果 2 或語句 2(如果是語句,需要加分號(hào))
ELSE 結(jié)果 n 或語句 n(如果是語句,需要加分號(hào))
END [case](如果是放在 begin end 中需要加上 case,如果放在 select 后面不需要)
CASE 語句的語法結(jié)構(gòu) 2:
# 情況二:類似于多重 if
CASE
WHEN 條件 1 THEN 結(jié)果 1 或語句 1(如果是語句,需要加分號(hào))
WHEN 條件 2 THEN 結(jié)果 2 或語句 2(如果是語句,需要加分號(hào))
ELSE 結(jié)果 n 或語句 n(如果是語句,需要加分號(hào))
END [case](如果是放在 begin end 中需要加上 case,如果放在 select 后面不需要)
舉例 1:
使用 CASE 流程控制語句的第 1 種格式,判斷 val 值等于 1、等于 2,或者兩者都不等。
CASE val
WHEN 1 THEN SELECT val is 1
WHEN 2 THEN SELECT val is 2
ELSE SELECT val is not 1 or 2
END CASE;
舉例 2:
使用 CASE 流程控制語句的第 2 種格式,判斷 val 是否為空、小于 0、大于 0 或者等于 0。
CASE
WHEN val IS NULL THEN SELECT val is null
WHEN val 0 THEN SELECT val is less than 0
WHEN val 0 THEN SELECT val is greater than 0
ELSE SELECT val is 0
END CASE;
舉例 3:聲明存儲(chǔ)過程“update_salary_by_eid4”,定義 IN 參數(shù) emp_id,輸入員工編號(hào)。判斷該員工薪資如果低于 9000 元,就更新薪資為 9000 元;薪資大于等于 9000 元且低于 10000 的,但是獎(jiǎng)金比例為 NULL 的,就更新獎(jiǎng)金比例為 0.01;其他的漲薪 100 元。
DELIMITER //
CREATE PROCEDURE update_salary_by_eid4(IN emp_id INT)
BEGIN
DECLARE emp_sal DOUBLE;
DECLARE bonus DECIMAL(3,2);
SELECT salary INTO emp_sal FROM employees WHERE employee_id = emp_id;
SELECT commission_pct INTO bonus FROM employees WHERE employee_id = emp_id;
CASE
WHEN emp_sal 9000
THEN UPDATE employees SET salary=9000 WHERE employee_id = emp_id;
WHEN emp_sal 10000 AND bonus IS NULL
THEN UPDATE employees SET commission_pct=0.01 WHERE employee_id = emp_id;
ELSE
UPDATE employees SET salary=salary+100 WHERE employee_id = emp_id;
END CASE;
END //
DELIMITER ;
舉例 4:聲明存儲(chǔ)過程 update_salary_by_eid5,定義 IN 參數(shù) emp_id,輸入員工編號(hào)。判斷該員工的入職年限,如果是 0 年,薪資漲 50;如果是 1 年,薪資漲 100;如果是 2 年,薪資漲 200;如果是 3 年,薪資漲 300;如果是 4 年,薪資漲 400;其他的漲薪 500。
DELIMITER //
CREATE PROCEDURE update_salary_by_eid5(IN emp_id INT)
BEGIN
DECLARE emp_sal DOUBLE;
DECLARE hire_year DOUBLE;
SELECT salary INTO emp_sal FROM employees WHERE employee_id = emp_id;
SELECT ROUND(DATEDIFF(CURDATE(),hire_date)/365) INTO hire_year FROM employees WHERE employee_id = emp_id;
CASE hire_year
WHEN 0 THEN UPDATE employees SET salary=salary+50 WHERE employee_id = emp_id;
WHEN 1 THEN UPDATE employees SET salary=salary+100 WHERE employee_id = emp_id;
WHEN 2 THEN UPDATE employees SET salary=salary+200 WHERE employee_id = emp_id;
WHEN 3 THEN UPDATE employees SET salary=salary+300 WHERE employee_id = emp_id;
WHEN 4 THEN UPDATE employees SET salary=salary+400 WHERE employee_id = emp_id;
ELSE UPDATE employees SET salary=salary+500 WHERE employee_id = emp_id;
END CASE;
END //
DELIMITER ;
3.3 循環(huán)結(jié)構(gòu)之 LOOP
LOOP 循環(huán)語句用來重復(fù)執(zhí)行某些語句。LOOP 內(nèi)的語句一直重復(fù)執(zhí)行直到循環(huán)被退出(使用 LEAVE 子句),跳出循環(huán)過程。
LOOP 語句的基本格式如下:
[loop_label:] LOOP
循環(huán)執(zhí)行的語句
END LOOP [loop_label]
其中,loop_label 表示 LOOP 語句的標(biāo)注名稱,該參數(shù)可以省略。
舉例 1:
使用 LOOP 語句進(jìn)行循環(huán)操作,id 值小于 10 時(shí)將重復(fù)執(zhí)行循環(huán)過程。
DECLARE id INT DEFAULT 0;
add_loop:LOOP
SET id = id +1;
IF id = 10 THEN LEAVE add_loop;
END IF;
END LOOP add_loop;
舉例 2:當(dāng)市場環(huán)境變好時(shí),公司為了獎(jiǎng)勵(lì)大家,決定給大家漲工資。聲明存儲(chǔ)過程“update_salary_loop()”,聲明 OUT 參數(shù) num,輸出循環(huán)次數(shù)。存儲(chǔ)過程中實(shí)現(xiàn)循環(huán)給大家漲薪,薪資漲為原來的 1.1 倍。直到全公司的平均薪資達(dá)到 12000 結(jié)束。并統(tǒng)計(jì)循環(huán)次數(shù)。
DELIMITER //
CREATE PROCEDURE update_salary_loop(OUT num INT)
BEGIN
DECLARE avg_salary DOUBLE;
DECLARE loop_count INT DEFAULT 0;
SELECT AVG(salary) INTO avg_salary FROM employees;
label_loop:LOOP
IF avg_salary = 12000 THEN LEAVE label_loop;
END IF;
UPDATE employees SET salary = salary * 1.1;
SET loop_count = loop_count + 1;
SELECT AVG(salary) INTO avg_salary FROM employees;
END LOOP label_loop;
SET num = loop_count;
END //
DELIMITER ;
3.4 循環(huán)結(jié)構(gòu)之 WHILE
WHILE 語句創(chuàng)建一個(gè)帶條件判斷的循環(huán)過程。WHILE 在執(zhí)行語句執(zhí)行時(shí),先對(duì)指定的表達(dá)式進(jìn)行判斷,如果為真,就執(zhí)行循環(huán)內(nèi)的語句,否則退出循環(huán)。WHILE 語句的基本格式如下:
[while_label:] WHILE 循環(huán)條件 DO
END WHILE [while_label];
while_label 為 WHILE 語句的標(biāo)注名稱;如果循環(huán)條件結(jié)果為真,WHILE 語句內(nèi)的語句或語句群被執(zhí)行,直至循環(huán)條件為假,退出循環(huán)。
舉例 1:
WHILE 語句示例,i 值小于 10 時(shí),將重復(fù)執(zhí)行循環(huán)過程,代碼如下:
DELIMITER //
CREATE PROCEDURE test_while()
BEGIN
DECLARE i INT DEFAULT 0;
WHILE i 10 DO
SET i = i + 1;
END WHILE;
SELECT i;
END //
DELIMITER ;
CALL test_while();
舉例 2:市場環(huán)境不好時(shí),公司為了渡過難關(guān),決定暫時(shí)降低大家的薪資。聲明存儲(chǔ)過程“update_salary_while()”,聲明 OUT 參數(shù) num,輸出循環(huán)次數(shù)。存儲(chǔ)過程中實(shí)現(xiàn)循環(huán)給大家降薪,薪資降為原來的 90%。直到全公司的平均薪資達(dá)到 5000 結(jié)束。并統(tǒng)計(jì)循環(huán)次數(shù)。
DELIMITER //
CREATE PROCEDURE update_salary_while(OUT num INT)
BEGIN
DECLARE avg_sal DOUBLE ;
DECLARE while_count INT DEFAULT 0;
SELECT AVG(salary) INTO avg_sal FROM employees;
WHILE avg_sal 5000 DO
UPDATE employees SET salary = salary * 0.9;
SET while_count = while_count + 1;
SELECT AVG(salary) INTO avg_sal FROM employees;
END WHILE;
SET num = while_count;
END //
DELIMITER ;
3.5 循環(huán)結(jié)構(gòu)之 REPEAT
REPEAT 語句創(chuàng)建一個(gè)帶條件判斷的循環(huán)過程。與 WHILE 循環(huán)不同的是,REPEAT 循環(huán)首先會(huì)執(zhí)行一次循環(huán),然后在 UNTIL 中進(jìn)行表達(dá)式的判斷,如果滿足條件就退出,即 END REPEAT;如果條件不滿足,則會(huì)就繼續(xù)執(zhí)行循環(huán),直到滿足退出條件為止。
REPEAT 語句的基本格式如下:
[repeat_label:] REPEAT
循環(huán)體的語句
UNTIL 結(jié)束循環(huán)的條件表達(dá)式
END REPEAT [repeat_label]
repeat_label 為 REPEAT 語句的標(biāo)注名稱,該參數(shù)可以省略;REPEAT 語句內(nèi)的語句或語句群被重復(fù),直至 expr_condition 為真。
舉例 1:
DELIMITER //
CREATE PROCEDURE test_repeat()
BEGIN
DECLARE i INT DEFAULT 0;
REPEAT
SET i = i + 1;
UNTIL i = 10
END REPEAT;
SELECT i;
END //
DELIMITER ;
舉例 2:當(dāng)市場環(huán)境變好時(shí),公司為了獎(jiǎng)勵(lì)大家,決定給大家漲工資。聲明存儲(chǔ)過程“update_salary_repeat()”,聲明 OUT 參數(shù) num,輸出循環(huán)次數(shù)。存儲(chǔ)過程中實(shí)現(xiàn)循環(huán)給大家漲薪,薪資漲為原來的 1.15 倍。直到全公司的平均薪資達(dá)到 13000 結(jié)束。并統(tǒng)計(jì)循環(huán)次數(shù)。
DELIMITER //
CREATE PROCEDURE update_salary_repeat(OUT num INT)
BEGIN
DECLARE avg_sal DOUBLE ;
DECLARE repeat_count INT DEFAULT 0;
SELECT AVG(salary) INTO avg_sal FROM employees;
REPEAT
UPDATE employees SET salary = salary * 1.15;
SET repeat_count = repeat_count + 1;
SELECT AVG(salary) INTO avg_sal FROM employees;
UNTIL avg_sal = 13000
END REPEAT;
SET num = repeat_count;
END //
DELIMITER ;
對(duì)比三種循環(huán)結(jié)構(gòu):
1、這三種循環(huán)都可以省略名稱,但如果循環(huán)中添加了循環(huán)控制語句(LEAVE 或 ITERATE)則必須添加名稱。
LOOP:一般用于實(shí)現(xiàn)簡單的 死 循環(huán)
WHILE:先判斷后執(zhí)行
REPEAT:先執(zhí)行后判斷,無條件至少執(zhí)行一次
3.6 跳轉(zhuǎn)語句之 LEAVE 語句
LEAVE 語句:可以用在循環(huán)語句內(nèi),或者以 BEGIN 和 END 包裹起來的程序體內(nèi),表示跳出循環(huán)或者跳出程序體的操作。如果你有面向過程的編程語言的使用經(jīng)驗(yàn),你可以把 LEAVE 理解為 break。
基本格式如下:
LEAVE 標(biāo)記名
其中,label 參數(shù)表示循環(huán)的標(biāo)志。LEAVE 和 BEGIN … END 或循環(huán)一起被使用。
** 舉例 1:** 創(chuàng)建存儲(chǔ)過程“l(fā)eave_begin()”,聲明 INT 類型的 IN 參數(shù) num。給 BEGIN…END 加標(biāo)記名,并在 BEGIN…END 中使用 IF 語句判斷 num 參數(shù)的值。
如果 num =0,則使用 LEAVE 語句退出 BEGIN…END;
如果 num=1,則查詢“employees”表的平均薪資;
如果 num=2,則查詢“employees”表的最低薪資;
如果 num 2,則查詢“employees”表的最高薪資。
IF 語句結(jié)束后查詢“employees”表的總?cè)藬?shù)。
DELIMITER //
CREATE PROCEDURE leave_begin(IN num INT)
begin_label: BEGIN
IF num =0
THEN LEAVE begin_label;
ELSEIF num=1
THEN SELECT AVG(salary) FROM employees;
ELSEIF num=2
THEN SELECT MIN(salary) FROM employees;
ELSE
SELECT MAX(salary) FROM employees;
END IF;
SELECT COUNT(*) FROM employees;
END //
DELIMITER ;
舉例 2:
當(dāng)市場環(huán)境不好時(shí),公司為了渡過難關(guān),決定暫時(shí)降低大家的薪資。聲明存儲(chǔ)過程“l(fā)eave_while()”,聲明 OUT 參數(shù) num,輸出循環(huán)次數(shù),存儲(chǔ)過程中使用 WHILE 循環(huán)給大家降低薪資為原來薪資的 90%,直到全公司的平均薪資小于等于 10000,并統(tǒng)計(jì)循環(huán)次數(shù)。
DELIMITER //
CREATE PROCEDURE leave_while(OUT num INT)
BEGIN
DECLARE avg_sal DOUBLE;# 記錄平均工資
DECLARE while_count INT DEFAULT 0; # 記錄循環(huán)次數(shù)
SELECT AVG(salary) INTO avg_sal FROM employees; #① 初始化條件
while_label:WHILE TRUE DO #② 循環(huán)條件
#③ 循環(huán)體
IF avg_sal = 10000 THEN
LEAVE while_label;
END IF;
UPDATE employees SET salary = salary * 0.9;
SET while_count = while_count + 1;
#④ 迭代條件
SELECT AVG(salary) INTO avg_sal FROM employees;
END WHILE;
SET num = while_count;
END //
DELIMITER ;
3.7 跳轉(zhuǎn)語句之 ITERATE 語句
ITERATE 語句:只能用在循環(huán)語句(LOOP、REPEAT 和 WHILE 語句)內(nèi),表示重新開始循環(huán),將執(zhí)行順序轉(zhuǎn)到語句段開頭處。如果你有面向過程的編程語言的使用經(jīng)驗(yàn),你可以把 ITERATE 理解為 continue,意思為“再次循環(huán)”。
語句基本格式如下:
ITERATE label
label 參數(shù)表示循環(huán)的標(biāo)志。ITERATE 語句必須跟在循環(huán)標(biāo)志前面。
舉例: 定義局部變量 num,初始值為 0。循環(huán)結(jié)構(gòu)中執(zhí)行 num + 1 操作。
如果 num 10,則繼續(xù)執(zhí)行循環(huán);
如果 num 15,則退出循環(huán)結(jié)構(gòu);
DELIMITER //
CREATE PROCEDURE test_iterate()
BEGIN
DECLARE num INT DEFAULT 0;
my_loop:LOOP
SET num = num + 1;
IF num 10
THEN ITERATE my_loop;
ELSEIF num 15
THEN LEAVE my_loop;
END IF;
SELECT 尚硅谷:讓天下沒有難學(xué)的技術(shù)
END LOOP my_loop;
END //
DELIMITER ;
4. 游標(biāo) 4.1 什么是游標(biāo)(或光標(biāo))
雖然我們也可以通過篩選條件 WHERE 和 HAVING,或者是限定返回記錄的關(guān)鍵字 LIMIT 返回一條記錄,但是,卻無法在結(jié)果集中像指針一樣,向前定位一條記錄、向后定位一條記錄,或者是隨意定位到某一條記錄,并對(duì)記錄的數(shù)據(jù)進(jìn)行處理。
這個(gè)時(shí)候,就可以用到游標(biāo)。游標(biāo),提供了一種靈活的操作方式,讓我們能夠?qū)Y(jié)果集中的每一條記錄進(jìn)行定位,并對(duì)指向的記錄中的數(shù)據(jù)進(jìn)行操作的數(shù)據(jù)結(jié)構(gòu)。游標(biāo)讓 SQL 這種面向集合的語言有了面向過程開發(fā)的能力。
在 SQL 中,游標(biāo)是一種臨時(shí)的數(shù)據(jù)庫對(duì)象,可以指向存儲(chǔ)在數(shù)據(jù)庫表中的數(shù)據(jù)行指針。這里游標(biāo)充當(dāng)了指針的作用,我們可以通過操作游標(biāo)來對(duì)數(shù)據(jù)行進(jìn)行操作。
MySQL 中游標(biāo)可以在存儲(chǔ)過程和函數(shù)中使用。
比如,我們查詢了 employees 數(shù)據(jù)表中工資高于 15000 的員工都有哪些:
SELECT employee_id,last_name,salary FROM employees
WHERE salary 15000;
這里我們就可以通過游標(biāo)來操作數(shù)據(jù)行,如圖所示此時(shí)游標(biāo)所在的行是“108”的記錄,我們也可以在結(jié)果集上滾動(dòng)游標(biāo),指向結(jié)果集中的任意一行。
4.2 使用游標(biāo)步驟
游標(biāo)必須在聲明處理程序之前被聲明,并且變量和條件還必須在聲明游標(biāo)或處理程序之前被聲明。
如果我們想要使用游標(biāo),一般需要經(jīng)歷四個(gè)步驟。不同的 DBMS 中,使用游標(biāo)的語法可能略有不同。
第一步,聲明游標(biāo)
在 MySQL 中,使用 DECLARE 關(guān)鍵字來聲明游標(biāo),其語法的基本形式如下:
DECLARE cursor_name CURSOR FOR select_statement;
這個(gè)語法適用于 MySQL,SQL Server,DB2 和 MariaDB。如果是用 Oracle 或者 PostgreSQL,需要寫成:
DECLARE cursor_name CURSOR IS select_statement;
要使用 SELECT 語句來獲取數(shù)據(jù)結(jié)果集,而此時(shí)還沒有開始遍歷數(shù)據(jù),這里 select_statement 代表的是 SELECT 語句,返回一個(gè)用于創(chuàng)建游標(biāo)的結(jié)果集。
比如:
DECLARE cur_emp CURSOR FOR
SELECT employee_id,salary FROM employees;
DECLARE cursor_fruit CURSOR FOR
SELECT f_name, f_price FROM fruits ;
第二步,打開游標(biāo)
打開游標(biāo)的語法如下:
OPEN cursor_name
當(dāng)我們定義好游標(biāo)之后,如果想要使用游標(biāo),必須先打開游標(biāo)。打開游標(biāo)的時(shí)候 SELECT 語句的查詢結(jié)果集就會(huì)送到游標(biāo)工作區(qū),為后面游標(biāo)的逐條讀取結(jié)果集中的記錄做準(zhǔn)備。
OPEN cur_emp ;
第三步,使用游標(biāo)(從游標(biāo)中取得數(shù)據(jù))
語法如下:
FETCH cursor_name INTO var_name [, var_name] ...
這句的作用是使用 cursor_name 這個(gè)游標(biāo)來讀取當(dāng)前行,并且將數(shù)據(jù)保存到 var_name 這個(gè)變量中,游標(biāo)指針指到下一行。如果游標(biāo)讀取的數(shù)據(jù)行有多個(gè)列名,則在 INTO 關(guān)鍵字后面賦值給多個(gè)變量名即可。
注意:var_name 必須在聲明游標(biāo)之前就定義好。
FETCH cur_emp INTO emp_id, emp_sal ;
注意:游標(biāo)的查詢結(jié)果集中的字段數(shù),必須跟 INTO 后面的變量數(shù)一致,否則,在存儲(chǔ)過程執(zhí)行的時(shí)候,MySQL 會(huì)提示錯(cuò)誤。
第四步,關(guān)閉游標(biāo)
CLOSE cursor_name
有 OPEN 就會(huì)有 CLOSE,也就是打開和關(guān)閉游標(biāo)。當(dāng)我們使用完游標(biāo)后需要關(guān)閉掉該游標(biāo)。因?yàn)橛螛?biāo)會(huì)占用系統(tǒng)資源,如果不及時(shí)關(guān)閉,游標(biāo)會(huì)一直保持到存儲(chǔ)過程結(jié)束,影響系統(tǒng)運(yùn)行的效率。而關(guān)閉游標(biāo)的操作,會(huì)釋放游標(biāo)占用的系統(tǒng)資源。
關(guān)閉游標(biāo)之后,我們就不能再檢索查詢結(jié)果中的數(shù)據(jù)行,如果需要檢索只能再次打開游標(biāo)。
CLOSE cur_emp;
4.3 舉例
創(chuàng)建存儲(chǔ)過程“get_count_by_limit_total_salary()”,聲明 IN 參數(shù) limit_total_salary,DOUBLE 類型;聲明 OUT 參數(shù) total_count,INT 類型。函數(shù)的功能可以實(shí)現(xiàn)累加薪資最高的幾個(gè)員工的薪資值,直到薪資總和達(dá)到 limit_total_salary 參數(shù)的值,返回累加的人數(shù)給 total_count。
DELIMITER //
CREATE PROCEDURE get_count_by_limit_total_salary(IN limit_total_salary DOUBLE,OUT total_count INT)
BEGIN
DECLARE sum_salary DOUBLE DEFAULT 0; # 記錄累加的總工資
DECLARE cursor_salary DOUBLE DEFAULT 0; # 記錄某一個(gè)工資值
DECLARE emp_count INT DEFAULT 0; # 記錄循環(huán)個(gè)數(shù)
#定義游標(biāo)
DECLARE emp_cursor CURSOR FOR SELECT salary FROM employees ORDER BY salary DESC;
#打開游標(biāo)
OPEN emp_cursor;
REPEAT
#使用游標(biāo)(從游標(biāo)中獲取數(shù)據(jù))FETCH emp_cursor INTO cursor_salary;
SET sum_salary = sum_salary + cursor_salary;
SET emp_count = emp_count + 1;
UNTIL sum_salary = limit_total_salary
END REPEAT;
SET total_count = emp_count;
#關(guān)閉游標(biāo)
CLOSE emp_cursor;
END //
DELIMITER ;
4.5 小結(jié)
游標(biāo)是 MySQL 的一個(gè)重要的功能,為逐條讀取結(jié)果集中的數(shù)據(jù),提供了完美的解決方案。跟在應(yīng)用層面實(shí)現(xiàn)相同的功能相比,游標(biāo)可以在存儲(chǔ)程序中使用,效率高,程序也更加簡潔。
但同時(shí)也會(huì)帶來一些性能問題,比如在使用游標(biāo)的過程中,會(huì)對(duì)數(shù)據(jù)行進(jìn)行加鎖,這樣在業(yè)務(wù)并發(fā)量大的時(shí)候,不僅會(huì)影響業(yè)務(wù)之間的效率,還會(huì)消耗系統(tǒng)資源,造成內(nèi)存不足,這是因?yàn)橛螛?biāo)是在內(nèi)存中進(jìn)行的處理。
建議:養(yǎng)成用完之后就關(guān)閉的習(xí)慣,這樣才能提高系統(tǒng)的整體效率。
補(bǔ)充:MySQL 8.0 的新特性—全局變量的持久化
在 MySQL 數(shù)據(jù)庫中,全局變量可以通過 SET GLOBAL 語句來設(shè)置。例如,設(shè)置服務(wù)器語句超時(shí)的限制,可以通過設(shè)置系統(tǒng)變量 max_execution_time 來實(shí)現(xiàn):
SET GLOBAL MAX_EXECUTION_TIME=2000;
使用 SET GLOBAL 語句設(shè)置的變量值只會(huì)臨時(shí)生效。數(shù)據(jù)庫重啟后,服務(wù)器又會(huì)從 MySQL 配置文件中讀取變量的默認(rèn)值。
MySQL 8.0 版本新增了 SET PERSIST 命令。例如,設(shè)置服務(wù)器的最大連接數(shù)為 1000:
SET PERSIST global max_connections = 1000;
MySQL 會(huì)將該命令的配置保存到數(shù)據(jù)目錄下的 mysqld-auto.cnf 文件中,下次啟動(dòng)時(shí)會(huì)讀取該文件,用其中的配置來覆蓋默認(rèn)的配置文件。
舉例:
查看全局變量 max_connections 的值,結(jié)果如下:
mysql show variables like %max_connections%
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| max_connections | 151 |
| mysqlx_max_connections | 100 |
+------------------------+-------+
2 rows in set, 1 warning (0.00 sec)
設(shè)置全局變量 max_connections 的值:
mysql set persist max_connections=1000;
Query OK, 0 rows affected (0.00 sec)
重啟 MySQL 服務(wù)器,再次查詢 max_connections 的值:
mysql show variables like %max_connections%
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| max_connections | 1000 |
| mysqlx_max_connections | 100 |
+------------------------+-------+
2 rows in set, 1 warning (0.00 sec)
以上就是“MySQL 中的變量、流程控制與游標(biāo)怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,丸趣 TV 小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注丸趣 TV 行業(yè)資訊頻道。