MySQL中的视图操作
文章目錄
- 1 為什么要使用視圖
- 2 創建視圖
- 3 查看視圖
- 4 更新視圖數據
- 5 修改視圖
- 6 刪除視圖
1 為什么要使用視圖
小學的時候,每年都會舉辦一次抽考活動,意思是從每一個班級里面篩選出幾個優秀的同學去參加考試。這時候很多班級篩選出來的這些同學就可以臨時組成一個班級,如果我們把每一個班級都當做是一張真實的表,這個臨時的班級在數據庫里就可以當做一個視圖,也就是說,這個臨時的班級其實不是真實存在的,當考試過后,這些學生還是各回各家各找各媽。
視圖是從一個或多個表中導出來的表,是一種虛擬存在的表。視圖就像一個窗口,通過這個窗口可以看到系統專門提供的數據,這樣用戶可以不看整個數據庫表中的數據,而只關心對自己有用的數據。視圖可以使用戶的操作更方便,而且可以保障數據庫系統的安全性。
為什么要使用視圖?
通過前面章節的知識可以發現,數據庫中關于數據的查詢有時非常復雜,例如表連接、子查詢等,這種查詢會讓程序員感到非常痛苦,因為它的邏輯太復雜、編寫語句比較多,當這種查詢需要重復使用時,很難每次都編寫正確,從而降低了數據庫的實用性。
在具體操作表之前,有時候要求只能操作部分字段,而不是全部字段。例如,在學校里,學生的智商測試結果一般都是保密的,如果因為一時疏忽向查詢中多寫了關于“智商”的字段,則會讓學生的智商顯示給所有能夠查看該查詢結果的人,這時就需要限制使用者操作的字段。
為了提高復雜的SQL語句的復用性和表的操作的安全性,MySQL數據庫管理系統提供了視圖特性。所謂視圖,本質上是一種虛擬表,其內容與真實的表相似,包含一系列帶有名稱的列和行數據。但是,視圖并不在數據庫中以存儲數據值的形式存在,行和列數據來自定義視圖的查詢所引用的基本表,并且在具體引用視圖時動態生成。
視圖使程序員只關心感興趣的某些特定數據和他們所負責的特定任務。這樣程序員只能看到視圖中所定義的數據,而不是視圖所引用表中的數據,從而提高數據庫中數據的安全性。
2 創建視圖
雖然視圖可以被看成是一種虛擬表,但是其物理上是不存在的,即MySQL并沒有專門的位置為視圖存儲數據。根據視圖的概念可以發現其數據來源于查詢語句,因此創建視圖的基本語法為:
CREATE[OR REPLACE] VIEW viewname[columnlist] AS SELECT statement其中,CREATE表示創建新的視圖;REPLACE表示替換已經創建的視圖;viewname為視圖的名稱;columnlist為屬性列;SELECT statement表示SELECT語句;
注意:創建視圖需要登陸用戶有相應的權限,查看權限方法:
mysql> use school; #選擇數據庫school mysql> select user, Select_priv, Create_view_priv FROM mysql.user;#查詢數據庫用戶創建和選擇視圖權限在單表上創建視圖:
mysql> use school; #選擇數據庫school mysql> alter table student add privacy varchar(64);# 增加私隱列 mysql> ;#查詢數據庫用戶創建和選擇視圖權限 mysql> CREATE VIEW view_student AS select id, class_id, name from student ;#為學生表創建視圖 mysql> desc view_student;#查看視圖 mysql> select * from view_student; #根據視圖進行查詢在多表上創建視圖:
CREATE[OR REPLACE] VIEW viewname[columnlist] AS SELECT statement其中,CREATE表示創建新的視圖;REPLACE表示替換已經創建的視圖;viewname為視圖的名稱;columnlist為屬性列;SELECT statement表示SELECT語句;與單表上創建視圖不同的是,SELECT子句是涉及到多表的聯合查詢語句。
mysql> use school; #選擇數據庫school mysql> alter table student add privacy varchar(64);# 增加私隱列 mysql> ;#查詢數據庫用戶創建和選擇視圖權限 mysql> CREATE VIEW view_student_class AS select student.id, student.name, class.name, class.teacher from class inner join student on class.id = student.class_id;#為學生表創建視圖 mysql> desc view_student_class;#查看視圖 mysql> select * from view_student_class; #根據視圖進行查詢3 查看視圖
創建完視圖后,像表一樣,我們經常需要查看視圖信息。在MySQL中,有許多可以實現查看視圖的語句,如DESCRIBE、SHOW TABLES、SHOW CREATE VIEW。如果要使用這些語句,首先要確保擁有SHOW VIEW的權限。本節將詳細講解查看視圖的方法。
使用DESCRIBE | DESC語句查看視圖基本信息:
前面我們已經詳細講解過使用DESCRIBE語句來查看表的基本定義。因為視圖也是一張表,只是這張表比較特殊,是一張虛擬的表,所以同樣可以使用DESCRIBE語句來查看視圖的基本定義。DESCRIBE語句查看視圖的語法如下:
在上述語句中,參數viewname表示所要查看設計信息的視圖名稱。
使用SHOW TABLES語句查看視圖基本信息:
從MySQL 5.1版本開始,執行SHOW TABLES語句時不僅會顯示表的名字,同時也會顯示視圖的名字。
下面演示通過SHOW TABLES語句查看數據庫school中的視圖和表的功能,具體SQL語句如下,執行結果如下圖所示。
使用 show create view/table 語句查看視圖創建信息:
SHOW CREATE TABLE或VIEW viewname;4 更新視圖數據
更新視圖是指通過視圖來插入(INSERT)、更新(UPDATE)和刪除(DELETE)表中的數據。因為視圖實質是一個虛擬表,其中沒有數據,通過視圖更新時都是轉換到基本表更新。更新視圖時,只能更新權限范圍內的數據,超出范圍就不能更新了。
mysql> use school; #選擇數據庫school mysql> alter table student add privacy varchar(64);# 增加私隱列 mysql> ;#查詢數據庫用戶創建和選擇視圖權限 mysql> CREATE VIEW view_student AS select id, class_id, name from student ;#為學生表創建視圖 mysql> desc view_student;#查看視圖 mysql> select * from view_student; #根據視圖進行查詢 mysql> update view_student set name='小花花' where name='小花'; #通過視圖更新小花為小花花不能更新的情況:
5 修改視圖
修改視圖是指修改數據庫中存在的視圖,當基本表的某些字段發生變化的時候,可以通過修改視圖來保持與基本表的一致性。ALTER語句來修改視圖。
使用ALTER語句修改視圖:
ALTER VIEW viewname[columnlist] AS SELECT statement這個語法中的所有關鍵字和參數除了alter 外,其他都和創建視圖是一樣的,因此不再贅述。
對于上面中創建的視圖view_student_class,使用一段時間后需要將表示編號的字段id加進去。步驟如下:
mysql> use school; #選擇數據庫school mysql> alter table student add privacy varchar(64);# 增加私隱列 mysql> ;#查詢數據庫用戶創建和選擇視圖權限 mysql> ALTER VIEW view_student_class AS select student.id, student.name, class.name, class.id as class_id, class.teacher from class inner join student on class.id = student.class_id;#為學生班級表視圖增加 class_id 字段 mysql> desc view_student_class;#查看視圖 mysql> select * from view_student_class; #根據視圖進行查詢6 刪除視圖
刪除視圖是指刪除數據庫中已存在的視圖。刪除視圖時,只能刪除視圖的定義,不會刪除數據。
在MySQL中,可使用DROP VIEW語句來刪除視圖,但是用戶必須擁有DROP權限。刪除視圖的語法如下:
DROP VIEW viewname [,viewnamen];在上述語句中,參數viewname表示所要刪除視圖的名稱,可同時指定刪除多個視圖。
mysql> use school; #選擇數據庫school mysql> ;#查詢數據庫用戶創建和選擇視圖權限 mysql> CREATE VIEW view_student_class AS select student.id, student.name, class.name, class.id as class_id, class.teacher from class inner join student on class.id = student.class_id;#為學生表創建視圖 mysql> drop view view_student_class;#刪除視圖參考資料:
總結
以上是生活随笔為你收集整理的MySQL中的视图操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL中的数据查询
- 下一篇: DynamicArray