目錄
- 一、什么是視圖?
- 二、使用視圖的優勢
- 三、視圖的創建與使用
- 四、不能更新視圖的場景
- 五、刪除視圖
- 六、總結
一、什么是視圖?
視圖(View)是一種虛擬表,不存儲實際數據,而是通過執行預定義的查詢動態生成數據。用戶可以像操作普通表一樣對視圖進行查詢、更新和管理,但其數據完全依賴于基礎表。視圖的核心價值在于:
- 封裝復雜查詢,簡化數據訪問。
- 隱藏敏感字段(如密碼、余額)。
- 對外提供一致的列名和結構,避免業務代碼頻繁修改。
-- 示例:創建學生成績視圖
create view v_student_score as
selects.id, s.name, s.sno, cls.name as class_name, c.name as course_name, sco.score
from
student s,
class cls,
score sco,
course c
where s.class_id = cls.id,
and sco.student_id = s.id,
and sco.course_id = c.id;
二、使用視圖的優勢
- 隱藏敏感字段
例如賬戶表 account(id, name, balance, password) 中,通過視圖僅暴露非敏感字段,將敏感字段balance,password隱藏:
create view v_account as
select id, name from account;
- 統一訪問規范
當表結構變更時,假如 DBA 修改了 student 表,將列 sno 重命名為 number,如果不使用視圖,那么就需要大量改動業務代碼,將列 sno 重命名為 number,但是如果使用視圖,則只需調整視圖定義,業務代碼不需要改動,只需要將查詢語句的 sno 改為 number 即可,對外訪問的“接口”依舊是 sno:
-- 舊視圖
create view v_student (id, name, sno) as
select id, name, sno from student;-- 新視圖(適應列名變更)
create view v_student (id, name, sno) as
select id, name, number from student;
三、視圖的創建與使用
- 創建語法
create view view_name [(列別名1, 列別名2, ...)] as
select 語句; // 任意的查詢語句都可以
- 視圖與表連接查詢
視圖可像普通表一樣參與連接操作:
select * from v_student2 s
join class c on s.class_id = c.id;
- 通過視圖更新數據
注意:更新視圖會影響基礎表,但需滿足特定條件:
-- 更新視圖(會影響基礎表score)
update v_student_score1 set score = 95 where id = 1;
四、不能更新視圖的場景
以下類型的視圖不支持更新操作:
- 使用聚合函數(如 SUM(), COUNT())。
- 使用 distinct 或 group by / having。
- 使用 union 或 union all。
- 包含子查詢的 select 列表。
- from 子句中引用不可更新視圖。
- 包含 order by 子句,可能導致更新失敗。
五、刪除視圖
-- 可以刪除單個視圖
drop view v_student;-- 可以批量刪除視圖
drop view v_student2, v_student_score;
六、總結
特性 | 說明 |
---|---|
存儲 | 不存儲數據,依賴基礎表動態生成 |
核心用途 | 簡化復雜查詢、隱藏敏感字段、統一數據接口 |
更新限制 | 避免聚合、分組、排序等場景 |
性能影響 | 查詢性能與底層SQL復雜度相關,無額外存儲開銷 |
維護建議 | 視圖嵌套不超過兩層,避免過度封裝 |