MySql基礎(儲存過程)
為什麼使用儲存過程
儲存過程可以帶引數,也可以返回結果
可以包含資料操縱語句、變數、邏輯控制語句等。
儲存過程的優點:
- 執行速度更快
- 允許模組化程式設計
- 提高系統安全性
- 減少網路流通量
儲存過程語法
建立儲存過程
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();