1. 程式人生 > >MySql基礎(儲存過程)

MySql基礎(儲存過程)

為什麼使用儲存過程
在這裡插入圖片描述
儲存過程可以帶引數,也可以返回結果
可以包含資料操縱語句、變數、邏輯控制語句等。
儲存過程的優點:

  1. 執行速度更快
  2. 允許模組化程式設計
  3. 提高系統安全性
  4. 減少網路流通量
    儲存過程語法
    建立儲存過程

CREATE PROCEDURE
儲存過程名( 引數1,引數2… )
[儲存過程選項]
Begin
Sql語句

End

建立儲存過程usp_pname:查詢某個產品的供應商姓名、供應商地址、郵政編碼,產品名稱,產品價格

CREATE PROCEDURE usp_pname()
BEGIN
	SELECT DISTINCT vname,vaddress,vzip,pname,pprice FROM product INNER JOIN recruit 
	ON recruit.pid=product.pid INNER JOIN vendor 
	ON recruit.vid=vendor.vid ; 
END

呼叫儲存過程

CALL  儲存過程名稱( 引數1,引數2... );

CALL usp_pname('小米Note2');

刪除儲存過程

DROP PROCEDURE 儲存過程名;
DROP PROCEDURE usp_pname;

儲存過程的引數
• 和Java語言的方法一樣,引數可選
• 引數分為輸入引數、輸出引數 、輸入輸出引數
• 輸入引數允許有預設值

儲存過程的引數分三種:

輸入引數
輸出引數
輸入輸出引數

輸入引數(in):

向儲存過程傳入值

CREATE PROCEDURE usp_pname(in name VARCHAR(20))
BEGIN
	SELECT DISTINCT vname,vaddress,vzip,pname,pprice FROM product INNER JOIN recruit 
	ON recruit.pid=product.pid INNER JOIN vendor 
	ON recruit.vid=vendor.vid WHERE pname=name; 
END

CALL usp_pname('小米Note2');

輸出引數(out):

呼叫儲存過程後,傳出執行結果

建立查詢指定科目的最高分 輸入引數科目,輸出引數分數
CREATE PROCEDURE usp_maxScore(IN suname VARCHAR(10),OUT maxSc INT)
BEGIN
	-- 查詢指定科目的最高分
	SELECT MAX(socre) FROM score INNER JOIN `subject` ON score.subid=`subject`.subid
	WHERE subname=suname INTO maxSc;
  -- 把查詢的結果賦值給maxSc
END

-- 成員變數 語法: @變數名 @max
CALL usp_maxScore('MySQL',@max);

-- 查詢最高分
SELECT @max;

輸入輸出引數(inout):

把資料傳遞給儲存過程和將儲存過程的返回值傳遞給外部使用者

CREATE PROCEDURE usp_age(INOUT age INT)
BEGIN
 SET age=age+10;
END

-- 定一個變數
SET @age=10;

CALL usp_age(@age);

SELECT @age;

儲存過程變數

常用的儲存過程變數分為兩種:使用者變數和區域性變數。

(1)使用者變數:使用者定義的變數就叫使用者變數,以"@“開始,形式為”@變數名"。使用者變數跟mysql客戶端是繫結的,設定的變數,只對當前使用者使用的客戶端生效
(2)區域性變數:作用範圍在begin到end語句塊之間。在該語句塊裡設定的變數。declare語句專門用於定義區域性變數。 DECLARE
變數名 [,…] 變數型別[DEFAULT value]

變數之間的區別
區域性變數與使用者變數的區分在於兩點:

使用者變數是以"@"開頭的。區域性變數沒有這個符號。 定義變數不同,區域性變數使用declare語句定義 。
作用範圍。區域性變數只在begin-end語句塊之間有效。在begin-end語句塊執行完之後,區域性變數就消失了。

變數賦值

SET 變數名=expr[va_name=expr]...

區域性變數

set t1=0;

使用者變數

SET @t1=0;
SELECT @t1=0;

變數賦值,SELECT語句

SELECT ... INTO語句
SELECT col_name[,...] INTO var_name[,...] table_expr

儲存過程管理

描述 格式
檢視儲存過程定義 SHOW PROCEDURE STATUS;
檢視指定儲存過程定義 SHOW CREATE PROCEDURE 儲存過程名稱
呼叫儲存過程 CREATE PROCEDURE 儲存過程名稱(引數);
刪除儲存過程 DROP PROCEDURE 儲存過程名;

流程控制語句
MySQL流程控制語句有以下幾種:

順序結構控制語句:BENGIN…END語句。
分支結構控制語句:IF-ELSE和CASE-END語句。
迴圈結構控制語句:WHILE語句。

IF-ELSE

 IF  條件  THEN 輸出結果 
    [ELSE IF   條件 THEN 輸出結果 ... 
    [ELSE   輸出結果 ] 
    END IF

mysql平均分,大於60分,成績優秀
CREATE PROCEDURE usp_avgScore()
BEGIN
DECLARE str1 VARCHAR(20);

-- 查詢平均成績
SELECT AVG(socre) FROM score INNER JOIN `subject` ON score.subid=`subject`.subid
WHERE subname='MySQL' INTO @avgScore;

-- 判斷
IF @avgScore>60 THEN 
SET str1='成績優秀';
ELSE 
set str1='成績差';
END IF;
	SELECT str1 AS 結果;
END

CALL usp_avgScore();

CASE-END

CASE case_value 
WHEN 條件1 THEN 結果1
[WHEN 條件2 THEN 條件2] ... 
[ELSE 其他結果1] 
 END CASE

  CREATE  PROCEDURE usp_bonus(IN bonus INT)
    BEGIN 
        	DECLARE str VARCHAR(30);
        	CASE bonus 
        	WHEN 500 THEN SET str='真少';
        	WHEN 2000 THEN SET str='給點力';	
          WHEN 10000 THEN SET str='夠嗨皮的了';	
        	ELSE SET str='真好';
        	END CASE;
        	SELECT str;
    END
    CALL usp_bonus(500);

WHILE語句

WHILE 條件  DO 
sql語句
END WHILE 

使用迴圈顯示1-10之間的奇數
CREATE PROCEDURE even()
BEGIN
	DECLARE num INT;
	SET num=1;
	WHILE num<=10 DO
	SELECT num;
	SET num=num+2;
	END WHILE;
END

CALL even();