一、什么是視圖?
(1)在 SQL 中,視圖是基於 SQL 語句的結果集的可視化的表。視圖包含行和列,就像一個真實的表。
(2)視圖是一種不存在的虛擬表: 類似表但是不是表。
- 類似表: 視圖有表結構;
- 不是表: 沒有數據, 視圖的數據來源都是基表;
(3)視圖中的字段是來自一個或多個數據庫中的真實的表中的字段。
- 單表視圖: 基表只有一個;
- 多表視圖: 基表至少兩個以上;
(4)我們可以向視圖添加 SQL 函數、WHERE 以及 JOIN 語句,我們也可以提交數據,就像這些來自於某個單一的表。
(5)數據庫的設計和結構不會受到視圖中的函數、where 或 join 語句的影響。
(6)視圖總是顯示最近的數據。每當用戶查詢視圖時,數據庫引擎通過使用 SQL 語句來重建數據。
(7)可以從某個查詢內部、某個存儲過程內部,或者從另一個視圖內部來使用視圖。通過向視圖添加函數、join 等等,我們可以向用戶精確地提交我們希望提交的數據。
SQL CREATE VIEW 實例
SQL CREATE VIEW 語法:
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
--創建視圖--
create or replace view v_student as
select Sno,Sname
from student;
--從視圖中檢索數據,即查詢上面這個視圖--
select * from v_student;
--也可以向查詢添加條件--
select *
from v_student
where Sname like '%雲‘;
--刪除視圖--
drop view v_student;
二、視圖的作用
(1)簡化了操作,把經常使用的數據定義為視圖,可以將復雜的SQL查詢語句進行封裝。
如在實際工作中,不同的人員只關注與其相關的數據,而與他無關的數據,對他沒有任何意義。根據這一情況,可以專門為其創建一個視圖,定制用戶數據,聚焦特定的數據。此后當他查詢數據時,只需 select * from view_name; 就可以了。
(2)安全性,用戶只能查詢和修改能看到的數據。
使用視圖,基表中的數據就有了一定的安全性。因為視圖是虛擬的,物理上是不存在的,只是存儲了數據的集合,我們可以不通過視圖將基表中重要的字段信息給用戶。視圖是動態的數據的集合,數據是隨着基表的更新而更新的。同時,用戶對視圖,不可以隨意的更改和刪除,可以保證數據的安全性。
方便了權限管理,讓用戶對視圖有權限而不是對底層表有權限進一步加強了安全性
(3)邏輯上的獨立性,屏蔽了真實表的結構帶來的影響。
視圖的存在: 主要是為了對外提供數據支持(外部系統);隱藏了基表字段(隱私);保證了數據庫的數據安全(保護數據庫內部的數據結構);可以靈活的控制對外的數據: 保證針對每個接口都有一個單獨的數據支持,增強了用戶友好性。
三、視圖的缺點:
(1)性能差
- 數據庫必須把視圖查詢轉化成對基本表的查詢,如果這個視圖是由一個復雜的多表查詢所定義,那么即使是視圖的一個簡單查詢,數據庫也要把它變成一個復雜的結合體,需要花費一定的時間。
(2)修改限制
- 當用戶試圖修改視圖的某些信息時,數據庫必須把它轉化為對基本表的某些信息的修改,對於簡單的視圖來說,這是很方便的,但是,對於比較復雜的試圖,可能是不可修改的。
- 在定義數據庫對象時,不能不加選擇地來定義視圖,應該權衡視圖的優點和缺點,合理地定義視圖。
- 對視圖的修改:(1)單表視圖操作: 可以進行增刪改, 但是要實現新增: 前提是視圖必須包含基表的所有不能為空的字段。(2)多表視圖(基表來源兩個以上)不能插入數據, 也不能刪除數據,但是可以修改數據。
使用視圖還是有很多局限性的,並沒有像直接使用表那么方便。如果視圖定義中包含了group by、union、聚合函數以及其他一些特殊情況,就不能被更新了;更新視圖的查詢也可以是一個關聯語句,但是被更新的列必須來自同一張表;而且所有使用臨時表算法實現的視圖都無法被更新。