視圖
??視圖是一個虛擬表,其內容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。但是,視圖并不在數據庫中以存儲的數據值集形式存在。行和列數據來自由定義視圖的查詢所引用的表,并且在引用視圖時動態生成。視圖具有表結構文件,但不存在數據文件。
??對其中所引用的基礎表來說,視圖的作用類似于篩選。定義視圖的篩選可以來自當前或其它數據庫的一個或多個表,或者其它視圖。通過視圖進行查詢沒有任何限制,通過它們進行數據修改時的限制也很少。
??視圖是存儲在數據庫中的查詢的sql語句,它主要出于兩種原因:安全原因,視圖可以隱藏一些數據,如:用戶銀行卡信息,可以用視圖只顯示姓名,用戶手機號,而不顯示銀行卡賬號、金額等,另一原因是可使復雜的查詢易于理解和使用。
- 創建視圖
命令格式:create [or replace] [algorithm = {undefined | merge | temptable}] [definer = {用戶名| current_user}] [sql security {definer | invoker }] view 視圖名稱 [(column_list)] as select_statment [with [cascaded | local] check option];
ex:
#登錄mysql
mysql -uroot -proot
#使用數據庫
use demo;
#為student表創建名為student_view的視圖
create algorithm = temptable definer=current_user sql security definer view sudent_view(name,age,gender) as select name,age,gender from student;
#查看student_view視圖結構
show create view student_view;
ps:視圖名必須唯一,同時不能與表重名。 視圖可以使用select語句查詢到的列名,也可以自己指定相應的列名。可以指定視圖執行的算法,通過algorithm指定。column_list如果存在,則數目必須等于select語句檢索的列數
- 查看視圖結構
命令格式: show create view 視圖名稱
ex:
#查看student_view結構
show create view student_view;
#查看數據庫中有哪些視圖,table_type中類型是view
show full tables;
- 刪除視圖
命令格式: drop view [if exists] 視圖名稱,.....
??刪除視圖后,數據依然存在。可同時刪除多個視圖。
#刪除student_view,teacher_view
drop view if exists student_view,teacher_view;
- 修改視圖結構
命令格式: alter view 視圖名稱 [(字段列表)] as select_statement;
ex:
#創建student視圖
create view student_view as select * from student;
#修改視圖結構
alter view student_view as select id,name,age,gender from student;
ps: 一般不修改視圖,因為不是所有的更新視圖都會映射到表上。
-
視圖作用
- 簡化業務邏輯
- 對客戶端隱藏真實的表結構
視圖算法(algorithm)
算法 | 名稱 | 解釋 |
---|---|---|
merge | 合并 | 將視圖的查詢語句,與外部查詢需要先合并再執行! |
temptable | 臨時表 | 將視圖執行完畢后,形成臨時表,再做外層查詢! |
undefined | 未定義(默認) | 指的是MySQL自主去選擇相應的算法。 |