SQL基礎隨記2 視圖 存盤程序
View
-
CREATE/ALTER/DROP VIEW ViewName as SELECT(...) -
可以在視圖的基礎上繼續創建視圖,即,將之前創建的視圖當做表名放在新視圖的select陳述句中
-
利用視圖進行資料格式化(就是對欄位進行重新組合與拼接)
CREATE VIEW View_player_team AS SELECT CONCAT(player_name, '(' , team.team_name , ')') AS player_team FROM player JOIN team WHERE player.team_id = team.team_id -
視圖具有安全性,因為視圖是虛擬表,即使對視圖做出了修改,也不會影響底層資料,
PROCEDURE
-
存盤程序就像“自定義函式”,它是SQL陳述句和流控制陳述句的集合,它可以接受引數,也可以回傳引數,
-
存盤程序可以(不是一定)直接對底層資料表進行操作
-
CREATE PROCEDURE name(引數) BEGIN 需要執行的程序 END舉例1,
DELIMITER // CREATE PROCEDURE `存盤程序名`(形參) BEGIN 回圈體 END // DELIMITER;呼叫存盤程序舉例
CALL `存盤程序名`(實參); select @(out引數)-
DELIMITER是將分隔符變為
//(也可以使用其他的),因為流控制陳述句中的陳述句需要;分割,此舉是避免混淆 -
開頭和結尾的
DELIMITER都是另起一行mysql shell -
存盤程序名用的不是單引號,是反引號,也可以不加
-
流控制陳述句
DECLIARE --- 宣告變數 SET --- 初始化,賦值 IF...THEN...;END IF; REPEAT...UNTIL...END REPEAT --- 滿足UNTIL后面的運算式則退出回圈 WHILE...DO...END WHILE --- 先判斷條件,滿足則回圈 labelName:LOOP...(IF...THEN...LEAVE labelName;END IF;)...END LOOP labelName; CONTINUT; BREAK; RETURN; GOTO (label) WAITFOR TIME 'time' --- 在某個時刻執行 WAITFOR DELAY 'time' --- 延遲某個時間執行 SELECT...INTO... --- 將查詢表中的結果放入變數中
-
-
引數型別
- IN --- 傳入引數,無法回傳,不寫引數型別默認為IN
- OUT --- 將存盤程序的計算結果放入OUT引數中并用于回傳
- INOUT --- 既用于傳入引數又可以將結果存入該引數中用于回傳
-
PROCEDURE的優點
- 安全性強,設定存盤程序的時候可以設定對用戶的使用權限
- 執行效率快,在MySQL資料庫服務器端執行
- 通過封裝,減少網路傳輸量
-
PROCEDURE的缺點 --- 阿里等公司不推薦使用的原因
- 除錯困難,僅少部分DBMS支持除錯
- 可移植性差
- 版本管理困難
- 不適合高并發場景 --- 高并發需要減小資料庫壓力,可能會采用分庫分表的方式且對拓展性要求高,在這種情況下,存盤程序變得難以維護且會增加資料庫的壓力
procedure 舉例1 按某個欄位對表進行查詢
-
查看已有測驗表
mysql> SELECT * FROM t; +----+------+ | Id | nums | +----+------+ | 1 | 2 | +----+------+ 1 row in set (0.00 sec)創建存盤程序
mysql> DELIMITER // mysql> CREATE PROCEDURE `findByNums`(IN n int) -> BEGIN -> SELECT * FROM t WHERE nums = n; -> END // Query OK, 0 rows affected (0.03 sec)檢驗
mysql> DELIMITER ; mysql> CALL findByNums(2); +----+------+ | Id | nums | +----+------+ | 1 | 2 | +----+------+ 1 row in set (0.03 sec) Query OK, 0 rows affected (0.03 sec)(傳入不同引數)
mysql> CALL findByNums(1); Empty set (0.00 sec) Query OK, 0 rows affected (0.00 sec) -
查詢存盤程序
mysql> SELECT * FROM mysql.proc WHERE db = 'test' AND type = 'procedure';
procedure 舉例2 計算累和結果
-
使用存盤程序傳入/傳出引數,查詢輸出
mysql> delimiter // mysql> create procedure `add_sum`(in n int, out result int) -> begin -> declare i int; -> declare sum int; -> set i = 1; -> set sum = 0; -> while i < n do -> set sum = sum + i; -> set i = i + 1; -> end while; -> end // Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> call add_sum(50,@result); Query OK, 0 rows affected (0.00 sec) mysql> select @result; +---------+ | @result | +---------+ | 1225 | +---------+ 1 row in set (0.00 sec) -
無法直接@存盤程序中的變數
mysql> create procedure `add_sum_procedure`(in n int) -> begin -> declare i int; -> declare sum int; -> set i = 1; -> set sum = 0; -> while i < n do -> set sum = sum + i; -> set i = i + 1; -> end while; -> end // Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> call add_sum_procedure(10); Query OK, 0 rows affected (0.01 sec) mysql> select @sum; +------+ | @sum | +------+ | NULL | +------+ 1 row in set (0.01 sec)
查詢所有存盤程序/視圖 等等
- https://www.cnblogs.com/G-Aurora/p/13196812.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/22867.html
標籤:MySQL
