?1 存儲過程
存儲過程是事先編寫好、存儲在數據庫中的一組SQL命令集合。用來完成對數據庫的指定操作。
1.1 優缺點
優點:
1)提高系統性能。創建時進行編譯,隨后存放在數據庫服務器的過程高速緩存中,之后不需要再次執行分析和編譯操作,節省了分析、解析和優化SQL代碼所需的時間。
2)可自動完成需要預先執行的任務。
缺點:
1)每個連接的內存使用量將增加。
2)開發和維護困難、可移植性差。
1.2 mysql變量
sql變量按范圍可劃分為三類:
1)全局變量(系統變量),對所有會話生效,需具備super權限才能設置。SET GLOBAL 變量名。
注意:全局變量不能被定義只能修改,只能設置已存在的系統變量,否則報錯
2)會話變量,對當前會話生效。SET @變量名或者SET @@變量名。
3)局部變量,作用返回在BEGIN與END之間。
DECLARE | 1)設置局部變量。 2)不能以@開始 |
SET | 1)可以以@開始 2)定義會話變量或設置全局變量。 |
表DECLARE 與 SET的區別
DROP VARIABLE 變量名,刪除變量。
1.2.1 變量賦值
1)使用set。 set @變量名 = 變量值 或 set @變量名 := 變量值;
SET @val1 = "123";
SET @val2 := "abc";
2)使用SELECT。必須使用 “:=”,不能使用 “=”(其此時代表比較是否相等)。 注意:SELECT賦值變量時,變量前面一定要是@。
SELECT @變量名 := 變量值;
SELECT @val3 := "edf";
SELECT @變量名:= 字段名 FROM table_name WHERE ... LIMIT 0,1; (如果查詢結果不止一個,則取結果的最后一個)
SELECT @money := money FROM student WHERE money > 0 LIMIT 0,1;
1.3 定義
存儲過程有三種類型變量:1)IN,輸入參數;2)OUT,輸出參數;3)INOUT,輸入/輸出參數。
其基本語法如下;
1)語句必須在BEGIN與END之間。
2)DECLARE 來聲明變量,默認值在其后面加DEFAULT 值。
3)改變變量值,使用SET 變量=值。
4)調用使用CALL。
5)mysql 不支持 CREATE OR REPLACE PROCEDURE 語法,可以用DROP PROCEDURE IF EXISTS 存儲過程名;來刪除特定的存儲過程。
DROP PROCEDURE IF EXISTS demo;CREATE PROCEDURE demo(IN p_age INT,OUT p_count INT)BEGINSELECT @count := COUNT(*) FROM student WHERE age > p_age;SET p_count = @count;END;CALL demo(18,@count);SELECT @count;
1.3.1 條件控制 IF ELSE 與 CASE
只能在BEGIN 及 END 之間使用IF ELSE。需要以 END IF 結尾。
DROP PROCEDURE IF EXISTS demo;CREATE PROCEDURE demo(IN p_num INT)BEGINDECLARE tempChar CHAR(24);IF p_num = 1 THEN SET tempChar = '一';ELSEIF p_num = 2 THEN SET tempChar = '二';ELSE SET tempChar = "其他";END IF;SELECT tempChar;END;CALL demo(1);CALL demo(5);
注意:不能在SELECT 中直接使用IF ELSE,下面代碼是錯誤的:
SELECTIF p_num = 1 THEN '一';ELSE '其他';END IF;CASE WHEN使用范圍更廣,可在SELECT中直接使用,需要以END結尾。SELECTCASE ageWHEN 17 THEN '十七'WHEN 18 THEN '十八'ELSE '其他'END AS ageFROM student ??????
1.3.2 循環 LEAVE與ITERATE
循環需要有個標簽,LEVAE相當于Java的break,而ITERATE相當于continue。循環體位于 標簽名:LOOP 與 END LOOP 標簽名之間。
DROP PROCEDURE IF EXISTS demo;CREATE PROCEDURE demo(IN p_num INT)BEGINDECLARE p_count INT DEFAULT 0;DECLARE p_pos INT DEFAULT 0;myLabel: LOOPSET p_pos = p_pos + 1;IF p_pos > p_num THENLEAVE myLabel;END IF;IF MOD(p_pos,2) = 1 THENITERATE myLabel;END IF;SET p_count = p_count + 1;END LOOP myLabel;SELECT p_count;END;
1.4 與函數對比
存儲過程 | 函數 | |
返回值 | 返回0個、一個或多個結果集 | 有且只有一個結果值。 |
調用方式 | call調用 | 可以直接在SELECT中使用。 |
參數 | 有三種類型 IN、OUT、INOUT | 只有類似IN類型參數 |
其他限制 | 可以用臨時表 | 不能用臨時表 |
表 存儲過程與函數的對比
2 視圖
視圖是一種虛擬表(邏輯表),本身并不包含數據,作為一個SELECT語句保存在數據字典中。由一個或多個表(報告視圖)查詢而動態生成的表。
2.1 優缺點
優點:
簡單、安全、數據獨立。
缺點:
1)性能較低。
2)維護復雜,每當修改與視圖相關的基表的表結構時,都必須進行視圖更改操作。
3)修改限制,當用戶試圖修改視圖信息時,數據庫必須把它轉化為對基表的某些信息的修改。對于比較復雜的試圖,可能就不能進行修改了。
2.2 定義
簡單創建視圖的語法為:
CREATE VIEW 視圖名 AS SELECT 查詢語句;
對于單表的視圖,我們可以像對待基表一樣對其進行增刪改操作(結果最終會作用于基表)。
2.2.1 創建語法
CREATE[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]?[DEFINER = { user | CURRENT_USER }]?[SQL SECURITY { DEFINER | INVOKER }]VIEW view_name [(column_list)]AS select_statement?[WITH [CASCADED | LOCAL] CHECK OPTION]
ALGORITHM:創建視圖使用的算法。UNDEFINED,默認值,不指定算法(沒指定時一般采用merge算法);MERGE,合并算法,在基于視圖創建新的視圖時,將創建舊視圖所使用的SELECT語句與將要創建新的視圖的SELECT語句進行合并處理,效率更高;TEMPTABLE,臨時表算法,在基于視圖創建新的視圖時,先執行舊視圖的SELECT語句,然后再執行新視圖的SELECT語句,效率較低。
DEFINER:視圖創建者。user 為指定創建的用戶;CURRENT_USER為當前登錄用戶。
SQL SECURITY:視圖的安全策略。DEFINER 默認值,驗證是否擁有對視圖本身的權限;INVOKER,驗證對視圖的權限及對視圖所涉及到的表的權限。
WITH:更改視圖數據時,對更改的數據進行檢查。基本檢查策略是,當更改視圖中的數據時,如更改之后的結果不符合創建該視圖的權限,則不允許。CASCADED和LOCAL都具備基礎檢查策略。LOCAL,如果該視圖關聯了其他視圖,對視圖進行數據操作時,只需滿足當前視圖的創建條件即可。CASCADED,既要符合當前視圖的條件,也要符合關聯視圖的條件。
CREATEALGORITHM=MERGEDEFINER=CURRENT_USERSQL SECURITY INVOKERVIEW student_viewAS SELECT * FROM studentWITH CASCADED CHECK OPTION;
通過GRANT <權限> ON <數據對象> TO <數據庫用戶> 來進行授權:
GRANT SELECT,UPDATE ON study.student_view TO 'root'@'localhost';
通過REVOKE <權限> ON <數據對象> FROM <數據庫用戶> 來移除授權:
REVOKE SELECT ON study.student_view FROM 'root'@'localhost';