前言
?歡迎來到小K的MySQL專欄,本節(jié)將為大家?guī)鞰ySQL視圖概述 | 創(chuàng)建 | 查看 | 更新 | 修改 | 刪除的分享?
1.視圖概述
1.1 為什么使用視圖?
視圖一方面可以幫我們使用表的一部分而不是整個(gè)表,另一方面也可以針對(duì)不同的用戶頂置不同的查詢視圖。比如,針對(duì)公司的銷售人員,我們只想給他看部分?jǐn)?shù)據(jù),而某些特殊的數(shù)據(jù),比如采購價(jià)格,則不會(huì)提供給他。再比如,員工薪資是個(gè)敏感字段,那么只給某個(gè)級(jí)別以上的人員開放,其他人的查詢視圖中則不提供這個(gè)字段。
1.2 視圖的理解
- 視圖是一種
虛擬表
,本身是不具有數(shù)據(jù)
的,占用很少的內(nèi)存空間,它是 SQL 中的一個(gè)重要概念。 - 視圖建立在已有表的基礎(chǔ)上, 視圖賴以建立的這些表稱為基表。
- 視圖的創(chuàng)建和刪除只影響視圖本身,不影響對(duì)應(yīng)的基表。但是當(dāng)對(duì)視圖中的數(shù)據(jù)進(jìn)行增加、刪除和修改操作時(shí),基表中的數(shù)據(jù)會(huì)相應(yīng)地發(fā)生變化,反之亦然。
- 向視圖提供數(shù)據(jù)內(nèi)容的語句為
SELECT
語句,可以將視圖理解為存儲(chǔ)起來的SELECT
語句 - 視圖,是向用戶提供基表數(shù)據(jù)的另一種表現(xiàn)形式。通常情況下,小型項(xiàng)目的數(shù)據(jù)庫可以不使用視圖,但是在大型項(xiàng)目中,以及數(shù)據(jù)表比較復(fù)雜的情況下,視圖的價(jià)值就凸顯出來了,它可以幫助我們把經(jīng)常查詢的結(jié)果集放到虛擬表中,提升使用效率。理解和使用起來都非常方便。
2.創(chuàng)建視圖
2.1 視圖語法
- 完整的創(chuàng)建視圖語法
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW 視圖名稱 [(字段列表)]
AS 查詢語句
[WITH [CASCADED|LOCAL] CHECK OPTION]
CREATE [OR REPLACE]:
創(chuàng)建視圖。可以選擇使用``OR REPLACE`來替換同名的已存在的視圖。[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]:
可選參數(shù),用于指定視圖的算法。UNDEFINED
表示讓MySQL自動(dòng)選擇算法,MERGE
表示使用合并算法,TEMPTABLE
表示使用臨時(shí)表算法。- VIEW 視圖名稱:指定要?jiǎng)?chuàng)建的視圖的名稱。
- [(字段列表)]:可選參數(shù),指定視圖中要顯示的列名。如果不指定,則視圖將包含所有查詢結(jié)果的列。
- AS 查詢語句:指定用于創(chuàng)建視圖的查詢語句。該查詢語句可以包含JOIN、WHERE、GROUP BY等操作,用于篩選和連接數(shù)據(jù)。
[WITH [CASCADED|LOCAL] CHECK OPTION]:
可選參數(shù),用于指定視圖的檢查選項(xiàng)。CASCADED表示檢查所有相關(guān)視圖,LOCAL表示只檢查當(dāng)前視圖。
- 超簡(jiǎn)版本
CREATE VIEW 視圖名稱
AS 查詢語句
2.2 創(chuàng)建單表視圖
范例:創(chuàng)建視圖“v_emp1”,顯示員工的姓名,工作以及薪資。
CREATE VIEW v_emp1
AS
SELECT ename,job,sal FROM emps;
查詢視圖:
SELECT * FROM v_emp1;
針對(duì)別名的處理,可以在創(chuàng)建視圖的子查詢中指定對(duì)應(yīng)的別名
CREATE VIEW v_emp1_1
AS
SELECT ename 姓名,job 工作,sal 薪資 FROM emps;
也可以在創(chuàng)建視圖的視圖名稱后添加對(duì)應(yīng)的別名字段
CREATE OR REPLACE VIEW v_emp1_2(姓名,工作,薪資)
AS
SELECT ename,job,sal FROM emps;
我們?cè)趧?chuàng)建視圖的時(shí)候還可以封裝不是基表中存在的字段的情況
范例:創(chuàng)建視圖“v_emp2”,顯示每個(gè)部門的編號(hào),以及平均工資
CREATE VIEW v_emp2(deptno,avg_sal)
AS
SELECT deptno,AVG(sal) FROM emps GROUP BY deptno;
2.2 創(chuàng)建多表視圖
上面是基于單表創(chuàng)建的視圖,當(dāng)然我們也可以基于多表查詢的結(jié)果來封裝為對(duì)應(yīng)的視圖。
范例:創(chuàng)建視圖“v_emp_dept”,顯示部門編號(hào)以及部門人數(shù)
CREATE VIEW v_emp_dept
AS
SELECT d.deptno,COUNT(d.deptno)
FROM emps e JOIN depts d
ON e.deptno=d.deptno GROUP BY d.deptno;
查詢視圖
SELECT * FROM v_emp_dept;
當(dāng)然別名的處理方式在多表中同樣的適用。
2.3 基于視圖創(chuàng)建視圖
當(dāng)我們創(chuàng)建好一張視圖之后,還可以在它的基礎(chǔ)上繼續(xù)創(chuàng)建視圖。
CREATE VIEW v_sal_personNum
AS
SELECT v1.deptno,v1.avg_sal,v2.dPersonNum FROM v_emp2 v1 JOIN v_emp_dept v2 ON v1.deptno=v2.deptno;
查看視圖
select * from v_sal_personNum;
到這其實(shí)我們能夠發(fā)現(xiàn),視圖的創(chuàng)建還是非常靈活的。
3.查看視圖
語法1:查看數(shù)據(jù)庫的表對(duì)象、視圖對(duì)象
SHOW TABLES;
語法2:查看視圖的結(jié)構(gòu)
DESC/DESCRIBE 視圖名稱;
語法3:查看視圖的屬性信息
# 查看視圖信息(顯示數(shù)據(jù)表的存儲(chǔ)引擎、版本、數(shù)據(jù)行數(shù)和數(shù)據(jù)大小等)
SHOW TABLE STATUS LIKE '視圖名稱';
執(zhí)行結(jié)果顯示,注釋Comment為VIEW,說明該表為視圖,其他的信息為NULL,說明這是一個(gè)虛表。
語法4:查看視圖的詳細(xì)定義信息
SHOW CREATE VIEW 視圖名稱;
4.更新視圖數(shù)據(jù)
4.1 一般情況
MySQL支持使用INSERT、UPDATE和DELETE語句對(duì)視圖中的數(shù)據(jù)進(jìn)行插入、更新和刪除操作。當(dāng)視圖中的數(shù)據(jù)發(fā)生變化時(shí),數(shù)據(jù)表中的數(shù)據(jù)也會(huì)發(fā)生變化,反之亦然。
范例:通過視圖v_emp1,把姓名為’WARD‘的員工的薪資改為1234。
#更新視圖的數(shù)據(jù),基表中的數(shù)據(jù)也會(huì)修改
UPDATE v_emp1 SET sal=1234 WHERE name='WARD';
#更新基本中的數(shù)據(jù),視圖中的數(shù)據(jù)也會(huì)修改
UPDATE emps SET sal=1000 WHERE name='WARD';
范例:通過視圖v_emp1,把姓名為’WARD‘的員工刪掉
DELETE FROM v_emp1 WHERE name='WARD';
4.2 不可更新的視圖
要使視圖可更新,視圖中的行和底層基本表中的行之間必須存在 一對(duì)一 的關(guān)系。另外當(dāng)視圖定義出現(xiàn)如下情況時(shí),視圖不支持更新操作:
- 在定義視圖的時(shí)候指定了“ALGORITHM = TEMPTABLE”,視圖將不支持INSERT和DELETE操作;
- 視圖中不包含基表中所有被定義為非空又未指定默認(rèn)值的列,視圖將不支持INSERT操作;
- 在定義視圖的SELECT語句中使用了 JOIN聯(lián)合查詢 ,視圖將不支持INSERT和DELETE操作;
- 在定義視圖的SELECT語句后的字段列表中使用了 數(shù)學(xué)表達(dá)式 或 子查詢 ,視圖將不支持INSERT,也不支持UPDATE使用了數(shù)學(xué)表達(dá)式、子查詢的字段值;
- 在定義視圖的SELECT語句后的字段列表中使用 DISTINCT 、 聚合函數(shù) 、 GROUP BY 、 HAVING 、 UNION 等,視圖將不支持INSERT、UPDATE、DELETE;
- 在定義視圖的SELECT語句中包含了子查詢,而子查詢中引用了FROM后面的表,視圖將不支持 INSERT、UPDATE、DELETE;
范例:通過視圖v_emp2(統(tǒng)計(jì)平均薪資的視圖),把20號(hào)部門平均薪資改為5000
UPDATE v_emp2 SET avg_sal=5000 WHERE deptno=20;
-- The target table v_emp2 of the UPDATE is not updatable
DELETE FROM v_emp2 WHERE deptno=10;
-- The target table v_emp2 of the DELETE is not updatable
注意:雖然可以更新視圖數(shù)據(jù),但總的來說,視圖作為虛擬表 ,主要用于方便查詢 ,不建議更新視圖的數(shù)據(jù)。對(duì)視圖數(shù)據(jù)的更改,都是通過對(duì)實(shí)際數(shù)據(jù)表里數(shù)據(jù)的操作來完成的。
5.修改視圖
方式1:使用CREATE OR REPLACE VIEW 子句修改視圖
CREATE OR REPLACE VIEW v_emp1
AS
SELECT ename,job,sal FROM emps WHERE deptno=20;
方式2:ALTER VIEW
ALTER VIEW v_emp1
AS
SELECT ename,job,sal FROM emps WHERE deptno=10;
6.刪除視圖
刪除視圖只是刪除視圖的定義,并不會(huì)刪除基表的數(shù)據(jù)。
刪除視圖的語法是:
DROP VIEW IF EXISTS 視圖名稱;
DROP VIEW IF EXISTS 視圖名稱1,視圖名稱2,視圖名稱3,...;
舉例:
DROP VIEW v_emp1;
說明:基于視圖a、b創(chuàng)建了新的視圖c,如果將視圖a或者視圖b刪除,會(huì)導(dǎo)致視圖c的查詢失敗。這樣的視圖c需要手動(dòng)刪除或修改,否則影響使用。文章來源:http://www.zghlxwxcb.cn/news/detail-676705.html
總結(jié)
總的來說,MySQL中的視圖提供了一種方便、靈活和安全的方式來處理復(fù)雜的查詢操作,并提供了數(shù)據(jù)保護(hù)和性能優(yōu)化的好處~ 下節(jié)帶來存儲(chǔ)過程與函數(shù)的分享文章來源地址http://www.zghlxwxcb.cn/news/detail-676705.html
到了這里,關(guān)于【?MySQL | 視圖】概述 | 創(chuàng)建 | 查看 | 更新 | 修改 | 刪除的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!