日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

史上最简单MySQL教程详解(进阶篇)之存储过程(一)

發布時間:2024/1/17 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 史上最简单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 條件表達式1TRUE時執行的命令 [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教程详解(进阶篇)之存储过程(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。