史上最简单MySQL教程详解(进阶篇)之存储过程(一)
史上最簡單MySQL教程詳解(進階篇)之存儲過程(一)
- 史上最簡單MySQL教程詳解(進階篇)之存儲過程(一)
- 什么是存儲過程
- 存儲過程的作用
- 如何使用存儲過程
- 創建存儲過程
- DELIMITER改變分隔符
- 可使用的控制語句
- 開始創建存儲過程
- 確認存儲過程
- 使用存儲過程
- 刪除存儲過程
- 創建存儲過程
什么是存儲過程
SQL基本是一個命令實現一個處理的,是不能編寫處理流程的。雖然通過子查詢、多表連接等方式能實現一些高級的功能,但是具有很大的局限性。對于SQL本身是很難實現針對不同條件進行不同的處理或者循環等功能。即使能夠實現,也是十分復雜或者對于性能有極大的影響。存儲過程(Stored Procedure)就應運而生,它可以由SQL語句和各種條件判斷、循環控制等語句組成,簡單的說:存儲過程像相互之間有聯系的SQL語句組成的“小程序”。因為SQL的執行是需要經歷一個:解析->編譯->執行的過程的。存儲過程是提前經過解析和編譯存儲在數據庫中的,用戶通過指定存儲過程的名字并給定參數(如果該存儲過程帶有參數)來調用執行它。
存儲過程的作用
提高執行性能:
因為存儲過程是提前創建并保存在數據庫中的,當執行命令時,就能免去解析和編譯的過程,能減輕數據庫的負擔,提高執行性能。
可減輕網絡負擔:
因為存儲過程的執行,只需要客戶端傳遞對應的參數即可,并不需要多次傳遞SQL命令本身,可以大大的減輕網絡負擔,減少彼此之間的通信量,整體提高數據庫性能。
提高數據庫的安全性:
存儲過程禁止了對表本身的訪問,只賦予用戶對相關存儲過程的訪問權限。同時存儲過程將數據處理部分“黑匣子化”后,程序本身的可讀性和簡潔性都會有所增加。用戶不需要考慮存儲過程的內部實現,只需要知道應該調用哪個存儲過程即可。
如何使用存儲過程
創建存儲過程
創建存儲過程使用的是【CREATE】語句,具體語法如下:
CREATE PROCEDURE 存儲過程名(參數1的種類 參數名1 參數1的數據類型,參數2的種類 參數名2 參數2的數據類型 ) BEGIN 數據處理過程 END上面提到的參數種類,主要分為下面三種類型:
| IN | 輸入參數(可省略) |
| OUT | 輸出參數 |
| INOUT | 既是輸出參數,也是輸入參數 |
對于參數的數據類型,可參考這篇博文: 史上最簡單MySQL教程詳解(基礎篇)之常用表操作和表參數介紹
在創建存儲過程之前呢,還有下面幾個要點需要掌握。
DELIMITER改變分隔符
【DELIMITER】是MySQL用來改變監視器中分離符的命令。默認的分隔符是【;】,但是,存儲過程本身就是命令的集合,所以一定還會含有其他的分隔符。那么它們彼此之間沖突和混淆,所以在創建存儲過程之前,我們需要將默認符換成一個完全無關的符號,只要不與其他關鍵字發生歧義即可,通常使用的是【//】。在完成創建之后,我們再將其回復即可。但需要提醒的是:分隔符的改變只會在啟動期間有效,重新啟動后,會自動恢復到默認狀態。
可使用的控制語句
簡單分支
IF 條件表達式1 條件表達式1為TRUE時執行的命令 [ELSEIF 條件表達式N條件表達式N為TRUE時執行的命令 ] [ELSE全部為False時執行的命令 ] END IF多重分支
CASE 表達式1 WHEN 值1 THEN 表達式1 = 值1時執行的命令 ... WHEN 值N THEN 表達式1 = 值N時執行的命令 [ELSE 上述所有值以外執行的命令] END CASE循環控制(后置判斷)
REPEAT 直至條件表達式為True時執行的命令 UNTIL 條件表達式 END REPEAT循環控制(前置判斷)
WHILE 條件表達式 DO 系列命令 END WHILE開始創建存儲過程
mysql> DELIMITER //-> CREATE PROCEDURE sp_student (IN p_name VARCHAR(20))-> BEGIN-> IF p_name IS NULL OR p_name = "" THEN -> SELECT * FROM student ;-> ELSE -> SELECT * FROM student WHERE studentName LIKE p_name;-> END IF ;-> END -> // Query OK, 0 rows affected mysql> DELIMITER ;這樣我們就創建了一個【sp_student】的存儲過程。如果我們傳入參數【p_name】,那么他就會進行模糊查詢,否則就無條件查詢。
確認存儲過程
我們確認存儲過程使用的是【SHOW】語句,具體語法如下:
SHOW PROCEDURE STATUS \G例如:
mysql> SHOW PROCEDURE STATUS \G *************************** 27. row ***************************Db: test1Name: sp_studentType: PROCEDUREDefiner: root@localhostModified: 2018-09-13 12:03:13Created: 2018-09-13 12:03:13Security_type: DEFINERComment: character_set_client: utf8 collation_connection: utf8_general_ciDatabase Collation: utf8_unicode_ci 27 rows in set (0.00 sec)結果集參數解釋:
| Db | 所屬數據庫名 |
| Name | 存儲過程名 |
| Type | 種類(PROCEDURE:存儲過程/FUNCTION:函數) |
| Definer | 創建者 |
| Modified | 最終更新時間 |
| Created | 創建時間 |
| Security_type | 安全種類(DEFINER:存儲過程權限與創建用戶權限一致) |
| Comment | 備注 |
| character_set_client | 從客戶端發送過來查詢的字符編碼 |
| collation_connection | 當前連接中使用的校對順序 |
| Database Collation | 數據庫的校對順序 |
除此之外,還能使用下面的語句確認:
SHOW CREATE PROCEDURE 存儲過程名\G例如:
mysql> SHOW CREATE PROCEDURE sp_student\G *************************** 1. row *************************** Procedure: sp_student sql_mode: STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USERCreate Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_student`(IN p_name VARCHAR(20)) BEGINIF p_name IS NULL OR p_name = "" THENSELECT * FROM student ;ELSESELECT * FROM studnet WHERE studentName LIKE p_name;END IF ;END character_set_client: utf8 collation_connection: utf8_general_ci Database Collation: utf8_unicode_ci 1 row in set (0.00 sec)這個會返回一些安全的設置信息,并且名稱都會被單引號(‘ ’)括起來。
使用存儲過程
使用存儲過程,使用的是【CALL】命令,具體語法如下:
CALL 存儲過程名(參數1,...);例如:
mysql> CALL sp_student('路人%'); //提交了參數 +-----------+-------------+--------------+----------------+ | studentId | studentName | studentPhone | studentAddress | +-----------+-------------+--------------+----------------+ | 4 | 路人甲 | 132 | 廣州 | | 5 | 路人乙 | 118 | 深圳 | +-----------+-------------+--------------+----------------+ 2 rows in setQuery OK, 0 rows affectedmysql> CALL sp_student(''); //未提交參數 +-----------+-------------+--------------+----------------+ | studentId | studentName | studentPhone | studentAddress | +-----------+-------------+--------------+----------------+ | 1 | 張三 | 140 | 重慶 | | 2 | 李四 | 137 | 北京 | | 3 | 王五 | 135 | 上海 | | 4 | 路人甲 | 132 | 廣州 | | 5 | 路人乙 | 118 | 深圳 | +-----------+-------------+--------------+----------------+ 5 rows in set Query OK, 0 rows affected刪除存儲過程
刪除已經創建的存儲過程使用【DROP】語句,具體語法如下:
DROP PROCEDURE 存儲過程名;例如:
mysql> DROP PROCEDURE sp_student; Query OK, 0 rows affected (0.00 sec)參考文獻:
MySQL存儲過程詳解
《MySQL高效編程》
別忘了關注博主的個人公眾號,有更多精彩內容、資源分享~轉載于:https://www.cnblogs.com/newtol/p/10159087.html
總結
以上是生活随笔為你收集整理的史上最简单MySQL教程详解(进阶篇)之存储过程(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用WeexSDK,网络请求信任证书的问
- 下一篇: selective gaussian b