1.1 概述
視圖是指計算機數據庫中的視圖,是一個虛擬表,其內容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。但是,視圖並不在數據庫中以存儲的數據值集形式存在。行和列數據來自由定義視圖的查詢所引用的表,並且在引用視圖時動態生成。——百度百科
視圖是虛擬表,本身不存儲數據,而是按照指定的方式進行查詢。
1.2 視圖的基本使用
| 操作指令 | 代碼 |
|---|---|
| 創建視圖 | CREATE VIEW 視圖名(列1,列2...) AS SELECT (列1,列2...) FROM ...; |
| 使用視圖 | 當成表使用就好 |
| 修改視圖 | CREATE OR REPLACE VIEW 視圖名 AS SELECT [...] FROM [...]; |
| 查看數據庫已有視圖 | >SHOW TABLES [like...];(可以使用模糊查找) |
| 查看視圖詳情 | DESC 視圖名或者SHOW FIELDS FROM 視圖名 |
| 視圖條件限制 | [WITH CHECK OPTION] |
| 刪除視圖 | DROP VIEW [IF EXISTS] 視圖名1 |
1.3 創建視圖
創建視圖:
CREATE VIEW 視圖名 AS;
-- 准備一張表 SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for sys_job -- ---------------------------- DROP TABLE IF EXISTS `sys_job`; CREATE TABLE `sys_job` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '崗位ID', `name` varchar(255) NOT NULL COMMENT '崗位名稱', `enabled` bit(1) NOT NULL COMMENT '崗位狀態', `job_sort` int(5) DEFAULT NULL COMMENT '排序', `is_deleted` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '邏輯刪除 1(true)已刪除, 0(false)未刪除', `create_time` datetime NOT NULL COMMENT '創建日期', `create_by` varchar(20) NOT NULL COMMENT '創建人', `update_time` datetime NOT NULL COMMENT '更新時間', `update_by` varchar(20) NOT NULL COMMENT '更新人', `version` bigint(32) NOT NULL COMMENT '版本', PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `uniq_name` (`name`), KEY `inx_enabled` (`enabled`) ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='崗位'; -- ###################################################################### -- 創建視圖 CREATE VIEW v_job AS SELECT * FROM sys_job; -- 查詢結果 SELECT * FROM v_job;

總結: 使用視圖和使用表完全一樣,只需要把視圖當成一張表就OK了。視圖是一張虛擬表。
1.4 修改視圖
修改和創建視圖可以使用代碼 :
CREATE OR REPLACE VIEW 視圖名 AS SELECT [...] FROM [...];
-- 修改視圖(只需要查詢id、name) CREATE OR REPLACE VIEW v_job AS SELECT id,name FROM sys_job; -- 查詢結果 SELECT * FROM v_job;

1.5 查看視圖
-- 查看數據庫已有視圖(可以使用模糊查找) SHOW TABLES; -- 得到所有的表和視圖 SHOW TABLES LIKE 'v_%'; -- 查看視圖詳情{(desc 視圖名)/(show fields from 視圖名)} DESC v_job; SHOW FIELDS FROM v_job;
總結: 通過
show tables;反饋得到所有的表和視圖。同樣的,我們可以通過模糊檢索的方式專門查看視圖,這個時候,視圖的命令統一采用v視圖名v視圖名的優勢就體現出來了。
1.6 視圖與數據變更
1.6.1 表格數據變更
將表 v_job 中的數據進行更新,在通過視圖檢索:
-- 表格數據變更 UPDATE v_job SET name = '視圖修改' WHERE id = 16; SELECT * FROM v_job;

總結:
視圖不是表,不保存數據,只是一張虛擬表;
1.6.2 表格數據插入

1.6.3 WITH CHECK OPTION約束
如果在創建視圖的時候制定了“WITH CHECK OPTION”,那么更新數據時不能插入或更新不符合視圖限制條件的記錄。
作用:對視圖所做的DML操作的結果,不能違反視圖的WHERE條件的限制。

總結:因為違反了視圖中的
where author_id = 1子句,所以拋出異常; 利用with check option約束限制,保證更新視圖是在該視圖的權限范圍之內。 使用WITH CHECK OPTION約束時,(不指定選項則默認是CASCADED) 可以使用CASCADED或者LOCAL選項指定檢查的程度:CASCADED:檢查所有的視圖,會檢查嵌套視圖及其底層的視圖LOCAL:只檢查將要更新的視圖本身,嵌套視圖不檢查其底層的視圖
1.7 刪除視圖
刪除視圖是指刪除數據庫中已存在的視圖,刪除視圖時,只能刪除視圖的定義,不會刪除數據,也就是說不會影響基表
DROP VIEW IF EXISTS v_job;
