視圖


視圖

1.1 概述

視圖是指計算機數據庫中的視圖,是一個虛擬表,其內容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。但是,視圖並不在數據庫中以存儲的數據值集形式存在。行和列數據來自由定義視圖的查詢所引用的表,並且在引用視圖時動態生成。——百度百科

關系型數據庫中的數據是由一張一張的二維關系表所組成,簡單的單表查詢只需要遍歷一個表,而復雜的多表查詢需要將多個表連接起來進行查詢任務。對於復雜的查詢事件,每次查詢都需要編寫MySQL代碼效率低下。為了解決這個問題,數據庫提供了視圖(view)功能。

視圖是虛擬表,本身不存儲數據,而是按照指定的方式進行查詢。

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;

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM