視圖、觸發器、存儲過程、函數、流程控制

 

1、視圖sql

  視圖就是經過查詢獲得一張虛擬表,而後保存下來,下次用的直接使用便可。使用視圖咱們能夠把查詢過程當中的臨時表摘出來,用視圖去實現,這樣之後再想操做該臨時表的數據時就無需重寫複雜的 SQL 語句了,直接去視圖中查找便可,但視圖有明顯地效率問題,而且視圖是存放在數據庫中的,若是咱們程序中使用的 SQL 過度依賴數據庫中的視圖,即強耦合,那就意味着擴展 SQL 極爲不便,所以並不推薦使用。數據庫

-- 1. -- 視圖是一個虛擬表(非正式存在),其本質是其本質是 -- 【根據SQL語句獲取動態的數據集,併爲其命名】, -- 用戶使用時只需使用【名稱】便可獲取結果集, -- 能夠將該結果集當作表來使用。 -- 2. -- 有了視圖之後你是否是以爲寫SQL語句就很簡單了,可是你儘可能不要這樣作 -- 由於MySQL是DBA管着呢,那麼你告訴DBA建一堆視圖,你寫程序的時候是方便了, -- 可是你要是修改呢,那麼你就得修改視圖了,你就得找到DBA修改你的視圖了, -- 那麼這樣聯繫別人會很麻煩的。說不定人家還很忙呢。仍是推薦本身去寫SQL語句。

-- 注意: -- 若是是一個單表的就能夠修改或者刪除或者插入 -- 若是是幾個表關聯的時候是不能夠修改或者刪除或者插入的(這點也是不肯定的,有的能夠改,有的不能夠改)

強調:編程

  一、在硬盤中,視圖只有表結構文件,沒有表數據文件安全

  二、視圖一般是用於查詢,儘可能不要修改視圖中的數據網絡

一、建立視圖ide

  建立視圖須要具備 create view 的權限,同時應該具備查詢涉及列的 select 權限。函數

語法格式:spa

create [algorithm = {undefined | merge | temptable}]
view 視圖名 [(視圖列表)]
as 查詢語句 [with [cascaded | local] check option] 

【例1】下面在 student 表上建立一個簡單的視圖,視圖名爲 student_view13d

【例2】下面在 student 表上建立一個名爲 student_view2 的視圖,包含學生的姓名、課程名以及對應的成績。rest

【例3】當咱們在查詢史琴雪的全部已修課程的成績時,就能夠藉助視圖很方便地完成查詢。

建立視圖時要注意如下幾點: 1、運行建立視圖的語句須要用戶具備建立視圖(crate view)的權限。 2select 語句不能包含 from 子句中的子查詢。 3select 語句不能引用系統或用戶變量。 4select 語句不能引用預處理語句參數。 5、在存儲子程序內,定義不能引用子程序參數或局部變量。 6、在定義中引用的表或視圖必須存在。 7、在定義中不能引用 temporary 表,不能建立 temporary 視圖。 8、在視圖定義中命名的表必須已存在。 9、不能將觸發程序與視圖關聯在一塊兒。 10、在視圖定義中容許使用 order by。
注意

二、刪除視圖

刪除視圖時,只能刪除視圖的定義,不會刪除數據。其次用戶必須擁有 drop 權限。

語法格式:

drop view [if exists] view_name[, view_name2]restrict | cascade] 

【例4】下面將刪除視圖 student_view1

三、查看視圖定義

  查看視圖是指查看數據庫中已存在的視圖的定義。查看視圖必需要有 show view 的權限。

  查看視圖的方法包括如下幾條語句,它們從不一樣的角度顯示視圖的相關信息

1)describe 語句,語法格式:describe 視圖名稱;  或者 desc 視圖名稱; 2)show table status 語句,語法格式: show table status like '視圖名'
3)show create view 語句,語法格式:show create view '視圖名'
4)查詢 information_schem 數據庫下的 views 表 語法格式:select * from information_schema.views where table_name = '視圖名'

【例5】查看 student_view2 視圖信息

方式一:describe

方式二:show table status

方式三:show create view

方式四:information_schema.views

四、修改視圖定義

  修改視圖是指修改數據庫中已經存在表的定義

(1)create or replace view 語句格式

create or replace  [algorithm = {undefined | merge | temptable}]
    view 視圖名[ { 屬性清單 } ]
    as select 語句 [ with [ cascaded | local ] check option];

【例6】修改視圖 student_view2 的列名爲姓名、選修課、成績

(2)alter 語句格式

create or replace  [algorithm = {undefined | merge | temptable}]
    view 視圖名[ { 屬性清單 } ]
    as select 語句 [ with [ cascaded | local ] check option];

【例7】把 student_view2 列的名稱再改成 sname,cname,grade

五、更新視圖數據

  原則:儘可能不要更新視圖

  對視圖的更新其實就是對錶的更新,更新視圖是指經過視圖來插入(insert)、更新(update)和刪除(delete)表中的數據。

  經過視圖更新時,都是轉換到基本表來更新。更新視圖時,只能更新權限範圍內的數據。

【例8】經過視圖對 student 表進行更新

2、觸發器

一、概念

  觸發器是一種特殊的存儲過程,它在插入,刪除或修改特定表中的數據時觸發執行,它比數據庫自己標準的功能有更精細和更復雜的數據控制能力。 

二、建立使用觸發器

  觸發程序是與表有關的命名數據庫對象,當表上出現特定事件時,將激活該對象。

語法格式:

# 針對插入, 在插入一條記錄以後會自動觸發一個觸發器的執行 create trigger tri_after_insert_t1 after insert on 表名 for each row begin sql代碼。。。 end

create trigger tri_after_insert_t2 before insert on 表名 for each row begin sql代碼。。。 end

================================================== # 針對刪除 create trigger tri_after_delete_t1 after delete on 表名 for each row begin sql代碼。。。 end

create trigger tri_after_delete_t2 before delete on 表名 for each row begin sql代碼。。。 end

================================================== # 針對修改 create trigger tri_after_update_t1 after update on 表名 for each row begin sql代碼。。。 end

create trigger tri_after_update_t2 before update on 表名 for each row begin sql代碼。。。 end
View Code

案例:

# 準備表 CREATE TABLE cmd ( id INT PRIMARY KEY auto_increment, USER CHAR (32), priv CHAR (10), cmd CHAR (64), sub_time datetime, # 提交時間 success enum ('yes', 'no') # 0表明執行失敗 ); CREATE TABLE errlog ( id INT PRIMARY KEY auto_increment, err_cmd CHAR (64), err_time datetime ); ============================================== delimiter $$ create trigger tri_after_insert cmd after insert on cmd for each now begin
    if NEW.success = 'no' then
        insert into errlog(err_cmd, err_time) values (NEW.cmd, NEW.sub_time); end if; end $$ delimiter ; -- delimiter 是用來改變SQL語句的結束,由於一條SQL語句的結束標誌是分號,在建立觸發器寫SQL代碼時,一條判斷語句的結束是用分號,但MySQL會把它看成是整個SQL語句的結束,因此會報錯
View Code

3、存儲過程與函數

一、概念

  一個存儲過程是一個可編程的函數,它在數據庫中建立並保存。它能夠有 SQL 語句和一些特殊的控制結構組成。

  存儲過程優勢:

    存儲過程加強了 SQL 語言的功能和靈活性

    存儲過程容許標準組件是編程

    存儲過程能實現較快的執行速度

    存儲過程能過減小網絡流量

    存儲過程可被做爲一種安全機制來充分利用

二、存儲過程和函數的區別

  1)通常來講,存儲過程實現的功能要複雜一點,而函數的實現的功能針對性比較強。

  2)對於存儲過程來講能夠返回參數,如記錄集,而函數只能返回值或者表對象。

  3)存儲過程,可使用非肯定函數,不容許在用戶定義函數主體中內置非肯定函數。

  4)存儲過程通常是做爲一個獨立的部分來執行,而函數能夠做爲查詢語句的一個部分來調用。

三、建立和使用存儲過程與函數

(1)存儲過程

建立存儲過程語法格式:

create procedure sp_name ([proc_parameter[,..]]) [characteristic ..] routine_body 

調用存儲過程語法格式:

call sp_name([parameter[, ...]])

說明:sp_name 爲存儲過程的名稱,若是要調用某個特定數據庫的存儲過程,則須要在前面加上該數據庫的名稱。

(2)建立函數

語法格式:

create function sp_name ([func_parameter[,..]]) returns type [characteristic ..] routine_body 

說明:在 MySQL 中,存儲函數的使用方法與 MySQL 內部函數的使用方法是同樣的。換言之,用戶本身定義的存儲函數與 MySQL 內部函數是一個性質的。

(3)delimiter 命令

能夠用 delimiter 來改變默認的結束標誌

【例1】把結束符改成 ##,執行 select 1+1##

四、變量

相關文章
相關標籤/搜索