一、自定義函數
mysql自定義函數就是實現程序員需要sql邏輯處理,參數是IN參數,含有RETURNS字句用來指定函數的返回類型,而且函數體必須包含一個RETURN value語句。
語法:
創建:CREATE FUNCTION 函數名稱(參數列表)
RETURNS 返回值類型
函數體
修改: ALTER FUNCTION 函數名稱 [characteristic ...]
刪除:DROP FUNCTION [IF EXISTS] 函數名稱
調用:SELECT 函數名稱(參數列表)
二、存儲過程
一組為了完成特定功能的SQL 語句集,存儲在數據庫中,經過第一次編譯后再次調用不需要再次編譯,比一個個執行sql語句效率高,用戶通過指定存儲過程的名字並給出參數來執行它。參數可以為IN, OUT, 或INOUT
語法:
創建:CREATE PROCEDURE 過程名 (參數列表) [characteristic ...]
函數體
修改: ALTER PROCEDURE 過程名 [characteristic ...]
刪除:DROP PROCEDURE [IF EXISTS] 過程名
調用:CALL 過程名(參數列表)
注意:存儲過程和自定義函數的區別:
1.存儲過程,功能強大,可以執行包括修改表等一系列數據庫操作,也可以創建為數據庫啟動時自動運行的存儲過程。
自定義函數,用戶定義函數不能用於執行一組修改全局數據庫狀態的操作。
2.對於sql server: 存儲過程,可以使用非確定函數。自定義函數,不允許在用戶定義函數主體中內置非確定函數。
3.存儲過程,可返回記錄集。
自定義函數,可以返回表變量。
4.存儲過程,其返回值不能被直接引用。
自定義函數,其返回值可以被直接引用。
5.存儲過程,用 CALL 語句執行。
自定義函數,在查詢語句中調用。
3、觸發器
與表事件相關的特殊的存儲過程,它的執行不是由程序調用,也不是手工啟動,而是由事件來觸發,比如當對一個表進行操作( insert,delete, update)時就會激活它執行。觸發器經常用於加強數據的完整性約束和業務規則等。
語法:
創建:
CREATE TRIGGER <觸發器名稱> --觸發器必須有名字,最多64個字符,可能后面會附有分隔符.它和MySQL中其他對象的命名方式基本相象.
{ BEFORE | AFTER } --觸發器有執行的時間設置:可以設置為事件發生前或后。
{ INSERT | UPDATE | DELETE } --同樣也能設定觸發的事件:它們可以在執行insert、update或delete的過程中觸發。
ON <表名稱> --觸發器是屬於某一個表的:當在這個表上執行插入、 更新或刪除操作的時候就導致觸發器的激活. 我們不能給同一張表的同一個事件安排兩個觸發器。
FOR EACH ROW --觸發器的執行間隔:FOR EACH ROW子句通知觸發器 每隔一行執行一次動作,而不是對整個表執行一次。
<觸發器SQL語句> --觸發器包含所要觸發的SQL語句:這里的語句可以是任何合法的語句, 包括復合語句,但是這里的語句受的限制和函數的一樣。
--創建觸發器(CREATE TRIGGER),需要SUPER權限。
eg:
CREATE TRIGGER testref BEFORE INSERT ON test1 FOR EACH ROW BEGIN INSERT INTO test2 SET a2 = NEW.a1; DELETE FROM test3 WHERE a3 = NEW.a1; UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; END
刪除:DROP TRIGGER 方案名稱.觸發器名稱
4、事件
事件調度器是MySQL5.1后新增的功能,可以將數據庫按自定義的時間周期觸發某種操作,可以理解為時間觸發器,類似於linux系統下面的任務調度器crontab,或者類似與window下面的計划任務。值得一提的是MySQL的事件調度器可以精確到每秒鍾執行一個任務,而操作系統的計划任務(如:Linux下的CRON或Windows下的任務計划)只能精確到每分鍾執行一次。
語法:
創建:
CREATE [DEFINER = { user | CURRENT_USER }] --定義事件執行的時候檢查權限的用戶。 EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule --定義執行的時間和時間間隔。 [ON COMPLETION [NOT] PRESERVE] --定義事件是一次執行還是永久執行,默認為一次執行,即NOT PRESERVE。 [ENABLE | DISABLE | DISABLE ON SLAVE] --定義事件創建以后是開啟還是關閉,以及在從上關閉。如果是從服務器自動同步主上的創建事件的語句的話,會自動加上DISABLE ON SLAVE [COMMENT 'comment'] -- 注釋 DO event_body; schedule: AT timestamp [+ INTERVAL interval] ... | EVERY interval [STARTS timestamp [+ INTERVAL interval]...] [ENDS timestamp [+ INTERVAL interval] ...] interval: quantity {YEAR | QUARTER | MONTH | DAY | HOUR| MINUTE | WEEK | SECOND | YEAR_MONTH |DAY_HOUR | DAY_MINUTE |DAY_SECOND| HOUR_MINUTE | HOUR_SECOND| MINUTE_SECOND}
刪除:
DROP EVENT [IF EXISTS] event_name
修改:
ALTER [DEFINER = { user | CURRENT_USER }] EVENT event_name [ON SCHEDULE schedule] [ON COMPLETION [NOT] PRESERVE] [RENAME TO new_event_name] [ENABLE | DISABLE | DISABLE ON SLAVE] [COMMENT 'comment'] [DO event_body]
查看事件是否開啟,使用如下命令查看:
SHOW VARIABLES LIKE 'event_scheduler';
SELECT @@event_scheduler;
SHOW PROCESSLIST;
如果看到event_scheduler為on或者PROCESSLIST中顯示有event_scheduler的信息說明就已經開啟了事件。如果顯示為off或者在PROCESSLIST中查看不到event_scheduler的信息,那么就說明事件沒有開啟,我們需要開啟它。
開啟事件:
開啟mysql的事件,通過如下三種方式開啟:
Ø 通過動態參數修改
SET GLOBAL event_scheduler = ON; 更改完這個參數就立刻生效了
注意:還是要在my.ini中添加event_scheduler=ON。因為如果沒有添加的話,mysql重啟事件又會回到原來的狀態了。
Ø 更改配置文件然后重啟
在my.ini中的[mysqld]部分添加如下內容,然后重啟mysql。
event_scheduler=ON
Ø 通過制定事件參數啟動
mysqld ... --event_scheduler=ON
5、視圖
視圖是一個虛擬表,其內容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。但是,視圖並不在數據庫中以存儲的數據值集形式存在。行和列數據來自由定義視圖的查詢所引用的表,並且在引用視圖時動態生成。對其中所引用的基礎表來說,視圖的作用類似於篩選。定義視圖的篩選可以來自當前或其它數據庫的一個或多個表,或者其它視圖。通過視圖進行查詢沒有任何限制,通過它們進行數據修改時的限制也很少。視圖是存儲在數據庫中的查詢的SQL 語句,它主要出於兩種原因:安全原因, 視圖可以隱藏一些數據,如:社會保險基金表,可以用視圖只顯示姓名,地址,而不顯示社會保險號和工資數等,另一原因是可使復雜的查詢易於理解和使用。這個視圖就像一個“窗口”,從中只能看到你想看的數據列。這意味着你可以在這個視圖上使用SELECT *,而你看到的將是你在視圖定義里給出的那些數據列:
語法:
創建:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(列名列表)]
AS 查詢語句
[WITH [CASCADED | LOCAL] CHECK OPTION]
修改:
ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
刪除:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]