mysql存儲過程總結

N年沒寫過存儲過程了,突然要寫存儲一下都忘記完了,現在回顧總結。
先廢話的說下mysql中的變量有1.系統變量 和 2.自定義變量

  1. 系統變量:變量由系統提供,不是用戶定義,屬於服務器層面
    a.查看所有的系統變量: show global | session variables;
    b.查看滿足條件的部分系統變量: show global | 【session】 variables like '%char%';
    c.查看指定的某哥系統變量的值:
    select @@global | 【session】.系統變量名;
    d.爲某個系統變量賦值
    方法一:
    set global | 【session】 系統變量名 = 值;
    方法二:
    set @@global | 【session】.系統變量名 = 值;
    e.全局變量
    1.查看所有的全局變量:
    SHOW GLOBAL VARIABLES;

    1. 查看部分的全局變量:
      SHOW GLOBAL VARIABLES LIKE '%char%';
      3.查看指定的全局變量的值:
      SELECT @@global.autocommit;
      SELECT @@tx_isolation;
      4.爲某個指定的全局變量賦值:
      SET @@global.autocommit=0;
      f.會話變量
      1.查看所有的會話變量
      SHOW VARIABLES;
      SHOW SESSION VARIABLES;
      2.查看部分的會話變量
      SHOW VARIABLES LIKE '%char%';
      SHOW SESSION VARIABLES LIKE '%char%';
      3.查看指定的某個會話變量
      SELECT @@tx_isolation;
      SELECT @@session.tx_isolation;
      4.爲某個會話變量賦值
      方式一:
      SET @@tx_isolation='read-uncommitted';
      方式二:
      SET SESSION tx_isolation='read-committed';
  2. 自定義變量: 變量是用戶自定義的,不是系統的
    作用域: 針對於當前會話(連接)有效,同於會話變量的作用域。應用在任何 地方,也就是begin end裏面或begin end外面
    2.1用戶變量
    賦值的操作符: = 或 :=
    a.聲明並初始化
    SET @用戶變量名=值;
    或 SET @用戶變量名:=值;
    或 SELECT @用戶變量名:=值
    b.賦值(更新用戶變量的值)
    方式一: 通過SET 或 SELECT
    SET @用戶變量名=值;
    或 SET @用戶變量名:=值;
    或 SELECT @用戶變量名:=值;
    方式二: 通過SELECT INTO
    SELECT 字段 INTO @變量名 FROM 表;
    c.使用(查看用戶變量的值)
    SELECT @用戶變量名;

例子:
#聲明並初始化
SET @name='john';
SET @name=100;
SET @count=1;
#賦值
SELECT COUNT( * ) INTO @count FROM 表名
#查看
SELECT @count;

        2.2 局部變量
         作用域: 僅僅在定義它的begin end 中有效,應用在begin end中的第一句                      話
  a.聲明
          DECLARE 變量名 類型;
            DECLARE 變量名 類型 DEFAULT 值;
      b.賦值
           方式一: 通過SET 或 SELECT
                         SET 局部變量名=值;
                   或  SET 局部變量名:=值;
                   或  SELECT @局部變量名:=值;
             方式二: 通過SELECT INTO
                  SELECT 字段 INTO 局部變量名 FROM 表
         c.使用
            SELECT 局部變量名;

對比用戶變量和局部變量
用戶變量:
作用域: 當前會話
定義和使用的位置: 會話中的任何地方
語法: 必須加@符合,不用限定類型
局部變量:
作用域: BEGIN END中
定義和使用的位置: 只能在BEGIN END中,且爲第一句話
語法: 一般不用加@符合,需要限定類型

例如: 聲明兩個變量並賦初始值,求和,並打印
SET @m=1;
SET @n=2;
SET @sum = @m + @n;
SELECT @sum;

存儲過程:
使用存儲過程的好處: 1.提高代碼的重用性; 2.簡化操作; 3.減少了編譯次數並減少了和數據庫服務器的連接次數,提高了效率
含義: 一組預先編譯好的SQL語句的集合,理解成批處理語句
一. 創建語法:
CREATE PROCEDURE 存儲過程名(參數列表)
BEGIN
存儲過程體(一組合法的SQL語句)
END
注意: 1.參數列表包含三部分:參數模式(IN、OUT、INOUT) , 參數名,參數類型
例如: IN stuname VARCHAR(20)
參數模式:
IN:該參數可以作爲輸入,也就是該參數需要調用方法入值
OUT:該參數可以作爲輸出,也就是該參數可以作爲返回值
INOUT:該參數即可以作爲輸入又可以作爲輸出,也就是該參數即需要傳入 值,又可以返回值
2.如果存儲過程體僅僅只有一句話,BEGIN END可以省略
存儲過程體中的每條SQL語句的結尾要求必須加分號。
存儲過程的結尾可以使用DELMITER重新設置,語法:
DELIMITER 結束標記
例如: DELIMITER $
二.調用語句
CALL 存儲過程名(實參列表);

     例如:
        1.空參列表
           #例:插入到admin表中五個記錄
                 DELIMITER $
                 CREATE PROCEDURE myp1()
                 BEGIN
                      INSERT INTO admin(username, password)
                            VALUES('name1','1111'),('name2','1111'),('name3','1111'),('name4','1111'),('name5','1111');
                 END $

                 調用: CALL myp1() $
    2.創建帶IN模式參數的存儲過程
     例如: 創建存儲過程實現 根據名字查詢對應的信息
        CREATE PROCEDURE myp2(IN beautyName VARCHAR(20))
            BEGIN
                 SELECT tb1.*
                     FROM table1 tb1
                     RIGHT JOIN table2 tb2 on tb1.id = tb2.nameId
                     WHERE tb1.name = tb2.name
            END $
            調用: CALL myp2('姓名') $

    例如:創建存儲過程實現,用戶是否登陸成功
    CREATE PROCEDURE myp3(IN username VARCHAR(20), IN password VARCHAR(20))
    BEGIN
         DECLARE result INT DEFAULT 0;  #聲明並初始化
             SELECT COUNT(*) INTO result #賦值
             FROM admin
             WHERE admin.username = username
             AND admin.password = password;

             SELECT IF(result>0, '成功', '失敗');  #使用
    END $
    調用:  CALL myp3('name','password') $

    3.帶返回值的
    例如:根據gril姓名,返回對應的boy姓名
    CREATE PROCEDURE myp5(IN grilName VARCHAR(20), OUT boyName VARCHAR(20))
    BEGIN
         SELECT b.boyName INTO boyName
             FROM boys b
             INNER JOIN gril g ON b.id = g.boy_id
             WHERE g.name = grilName;
    END $
    調用: CALL myp5('name', @bName) $
    輸出: SELECT @bName$

    例如: 根據gril姓名,返回對應的boy的姓名和魅力值
    CREATE PROCEDURE myp6(IN gName VARCHAR(20),  OUT bName VARCHAR(20), OUT bCp INT)
    BEGIN
        SELECT b.boyname, b.userCp INTO bName, bCp
            FROM boys b
            INNER JOIN gril g on b.id = g.boy_id
            WHERE g.name = gName
    END $
    調用: CALL myp6(‘name’, @bName, @usercp)$
    輸出: SELECT @bName, @usercp

    4.創建帶INOUT模式參數的存儲過程
    例如: 傳入a和b兩個值,最終a和b都翻倍並返回
    CREATE PROCEDURE myp8(INOUT a INT, INOUT b INT )
    BEGIN
         SET a=a*2;
             SET b=b*2;
    END $
    調用:
        SET @m=10$
            SET @n=20$
            CALL myp8(@m, @n)$
            SELECT @m,@n

#一、創建存儲過程實現傳入用戶名和密碼,插入到admin表中
CREATE PROCEDURE test_pro1(IN username VARCHAR(20), IN loginPwd VARCHAR(20))
BEGIN
       INSERT INTO admin(admin.username, admin.password)
             VALUES(username, loginPwd);
END $
#二、創建存儲過程實現傳入女神編號,返回女神名稱和女神電話
CREATE PROCEDURE test_pro2(IN id INT, OUT name VARCHAR(20), OUT phone VARCHAR(20))
BEGIN
        SELECT b.name, b.phone INTO name,phone
                FROM gril b
                WHERE b.id = id
END $
#三、創建存儲過程實現傳入兩個生日,返回大小
 CREATE PROCEDURE test_pro3(IN birth1 DATETIME, IN birth2 DATETIME, OUT result INT)
 BEGIN
       SELECT DATEDIFF(birth1, birth2) INTO result;
 END $
    #四、創建存儲過程實現傳入一個日期,格式化成爲YYYY年MM月DD日並返回
    CREATE PROCEDURE test_pro4(IN mydate DATETIME, OUT strDate VARCHAR(50))
    BEGIN
       SELECT DATE_FORMAT(mydate, '%y年%m月%d日') INTO strDate;
    END $
 CALL test_pro4(NOW(), @str)$
 SELECT @str $

    #五、創建存儲過程實現分頁的效果
    CREATE PROCEDURE test_pro6(IN startIndex INT, IN size INT)
    BEGIN
       SELECT * FROM admin LIMIT  startIndex, size;
    END $

 3.刪除存儲過程
 語法: DROP PROCEDURE 存儲過程名
 ![](https://s1.51cto.com/images/blog/201912/11/0dd990e41b7c87c4d79badb99502788b.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

 4.查看存儲過程
 SHOW CREATE PROCEDURE 存儲名稱;

函數:
函數和存儲過程的區別:
存儲過程:可以有0個返回,也可以有多個返回,適合做批量插入、批量更新
函數:有且僅有1個返回,適合做處理數據後返回一個結果

一、創建語法
CREATE FUNCTION 函數名(參數列表) RETURNS 返回類型
BEGIN
          函數體
END
注意: 
1.參數列表   包含兩個部分:參數名     參數類型
2.函數體:肯定會有return語句,如果沒有會報錯
如果return語句沒有放在函數體的最後也不報錯,不建議
return 值;
3.函數體中僅有一句話,則可以省略BEGIN END
4.使用DELIMITER語句設置結束標記

二、調用語法
SELECT 函數名(參數列表)

例如:
  #1.無參有返回
    CREATE FUNCTION my1() RETURNS INT
    BEGIN
              DECLARE c INT DEFAULT 0; #定義變量
                        SELECT COUNT(*) INTO c; #賦值
                        FROM employees;
                        RETURN c;
    END $
    調用: SELECT myf1()$

    #2.有參有返回
    CREATE FUNCTION myf2(empName VARCHAR(20)) RETURNS DOUBLE
    BEGIN
          SET @sal=0; #定義用戶變量
                SELECT salary INTO @sal #賦值
                FROM employees
                WHERE last_name = empName;
                RETURN @sal;
    END $

    SELECT myf2('k-ing') $

    CREATE FUNCTION myf3(deptName VARCHAR(20)) RETURNS DOUBLE
    BEGIN
        DECLARE sal DOUBLE;
            SELECT AVG(salary) INTO sal
            FROM employees e
            JOIN departments d ON e.department_id = d.department_id
            WHERE d.department_name = deptName;
            RETURN sal;
    END $

    SELECT myf3('IT')$

二、查看函數
SHOW CREATE FUNCTION 函數名;

三、刪除函數
DROP FUNCTION 函數名;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章