內容來源: http://www.cnblogs.com/cac2020/p/6026511.htmlhtml
表:裏面存儲的都是真實的數據 視圖:就是一個表或者多個表的一個映射,通常只作查詢使用。好比你想要的數據存在兩個表裏,但你查詢時不想每次都寫關聯,那麼你建立一個視圖,之後只查詢這個視圖就能夠(查詢時視圖與查詢表語法同樣)。 觸發器:作數據庫操做的時候,還但願相關的數據同步操做就用觸發器,好比想要向A表插入數據的時候,同時向B表插入,這樣寫過觸發器每次向A表插入數據以後就會自動向B表插入。 存儲過程:這個通常是沉澱數據使用的,當你須要查詢的數據不能用一個sql語句查出或者sql語句查詢速度特別慢,想要提升效率,就會用到存儲過程,先把須要的數據沉澱到結果表裏而後直接查詢結果表就能提升效率。
1、自定義函數mysql
mysql自定義函數就是實現程序員須要sql邏輯處理,參數是IN參數,含有RETURNS字句用來指定函數的返回類型,並且函數體必須包含一個RETURN value語句。linux
語法:程序員
建立:CREATE FUNCTION 函數名稱(參數列表)sql
RETURNS 返回值類型數據庫
函數體安全
修改: ALTER FUNCTION 函數名稱 [characteristic ...]服務器
刪除:DROP FUNCTION [IF EXISTS] 函數名稱函數
調用:SELECT 函數名稱(參數列表)操作系統
2、存儲過程
一組爲了完成特定功能的SQL 語句集,存儲在數據庫中,通過第一次編譯後再次調用不須要再次編譯,比一個個執行sql語句效率高,用戶經過指定存儲過程的名字並給出參數來執行它。參數能夠爲IN, OUT, 或INOUT
語法:
建立:CREATE PROCEDURE 過程名 (參數列表) [characteristic ...]
函數體
修改: ALTER PROCEDURE 過程名 [characteristic ...]
刪除:DROP PROCEDURE [IF EXISTS] 過程名
調用:CALL 過程名(參數列表)
注意:存儲過程和自定義函數的區別:
1.存儲過程,功能強大,能夠執行包括修改表等一系列數據庫操做,也能夠建立爲數據庫啓動時自動運行的存儲過程。
自定義函數,用戶定義函數不能用於執行一組修改全局數據庫狀態的操做。
2.對於sql server: 存儲過程,可使用非肯定函數。自定義函數,不容許在用戶定義函數主體中內置非肯定函數。
3.存儲過程,可返回記錄集。
自定義函數,能夠返回表變量。
4.存儲過程,其返回值不能被直接引用。
自定義函數,其返回值能夠被直接引用。
5.存儲過程,用 CALL 語句執行。
自定義函數,在查詢語句中調用。
三、觸發器
與表事件相關的特殊的存儲過程,它的執行不是由程序調用,也不是手工啓動,而是由事件來觸發,好比當對一個表進行操做( 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 方案名稱.觸發器名稱
四、事件
事件調度器是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
五、視圖
視圖是一個虛擬表,其內容由查詢定義。同真實的表同樣,視圖包含一系列帶有名稱的列和行數據。可是,視圖並不在數據庫中以存儲的數據值集形式存在。行和列數據來自由定義視圖的查詢所引用的表,而且在引用視圖時動態生成。對其中所引用的基礎表來講,視圖的做用相似於篩選。定義視圖的篩選能夠來自當前或其它數據庫的一個或多個表,或者其它視圖。經過視圖進行查詢沒有任何限制,經過它們進行數據修改時的限制也不多。視圖是存儲在數據庫中的查詢的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]