MySQL中數(shù)據(jù)視圖操作詳解
1.視圖概述
視圖是從一個(gè)或多個(gè)表(或視圖)導(dǎo)出的表。視圖與表(有時(shí)為與視圖區(qū)別,也稱表為基本表)不同,視圖是一個(gè)虛表,即視圖所對(duì)應(yīng)的數(shù)據(jù)不進(jìn)行實(shí)際存儲(chǔ),數(shù)據(jù)庫(kù)中只存儲(chǔ)視圖的定義,對(duì)視圖的數(shù)據(jù)進(jìn)行操作時(shí),系統(tǒng)根據(jù)視圖的定義去操作與視圖相關(guān)聯(lián)的基本表。
視圖一經(jīng)定義,就可以像表一樣被查詢、修改、刪除和更新。使用視圖有下列優(yōu)點(diǎn):
1、為用戶集中數(shù)據(jù),簡(jiǎn)化用戶的數(shù)據(jù)查詢和處理。有時(shí)用戶所需要的數(shù)據(jù)分散在多個(gè)表中,定義視圖可將它們集中在一起,從而方便用戶的數(shù)據(jù)查詢和處理。
2、屏蔽數(shù)據(jù)庫(kù)的復(fù)雜性。用戶不必了解復(fù)雜的數(shù)據(jù)庫(kù)中的表結(jié)構(gòu),并且數(shù)據(jù)庫(kù)表的更改也不影響用戶對(duì)數(shù)據(jù)庫(kù)的使用。
3、簡(jiǎn)化用戶權(quán)限的管理。只須授予用戶使用視圖的權(quán)限,而不必指定用戶只能使用表的特定列,也增加了安全性。
4、便于數(shù)據(jù)共享。各用戶不必都定義和存儲(chǔ)自己所需的數(shù)據(jù),可共享數(shù)據(jù)庫(kù)的數(shù)據(jù),這樣同樣的數(shù)據(jù)只需存儲(chǔ)一次。
5、可以重新組織數(shù)據(jù)以便輸出到其他應(yīng)用程序中。
使用視圖時(shí),要注意下列事項(xiàng):
1、 在默認(rèn)情況下,將在當(dāng)前數(shù)據(jù)庫(kù)創(chuàng)建新視圖。要想在給定數(shù)據(jù)庫(kù)中明確創(chuàng)建視圖,創(chuàng)建時(shí)應(yīng)將名稱指定為db_name.view_name
2、視圖的命名必須遵循標(biāo)志符命名規(guī)則,不能與表同名,且對(duì)每個(gè)用戶視圖名必須是唯一的,即對(duì)不同用戶,即使是定義相同的視圖,也必須使用不同的名字。
3、不能把規(guī)則、默認(rèn)值或觸發(fā)器與視圖相關(guān)聯(lián)
4、不能在視圖上建立任何索引,包括全文索引
5、視圖中使用SELECT語(yǔ)句有以下的限制:
5.1、定義視圖的用戶必須對(duì)所參照的表或視圖有查詢(即可執(zhí)行SELECT語(yǔ)句)的權(quán)限,在定義中引用的表或視圖必須存在
5.2、不能包含F(xiàn)ROM子句中的子查詢,不能引用系統(tǒng)或用戶變量,不能引用預(yù)處理語(yǔ)句參數(shù)
5.3、在視圖定義中允許使用ORDER BY子句,但是,如果從特定視圖進(jìn)行了選擇,而該視圖使用了具有自己ORDER BY的語(yǔ)句,則視圖定義中的ORDER BY將被忽略。
1.1創(chuàng)建視圖
視圖的創(chuàng)建語(yǔ)法格式:
CREATE [ OR REPLACE ] VIEW 視圖名 [ ( 列名列表 ) ]
AS SELECT 語(yǔ)句
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
例:創(chuàng)建Bookstore數(shù)據(jù)庫(kù)上的jsj_sell視圖,包括計(jì)算機(jī)類圖書銷售的訂單號(hào)、圖書編號(hào)、書名等情況。其中要保證對(duì)該視圖的訂單修改都要符合計(jì)算機(jī)類這個(gè)條件
CREATE OR REPLACE VIEW jsj_sell AS SELECT 訂單號(hào),Sell.圖書編號(hào),書名 FROM Book,Sell WHERE Book.圖書編號(hào)=Sell.圖書編號(hào) AND Book.圖書類別='計(jì)算機(jī)' WITH CHECK OPTION;
例:創(chuàng)建Bookstore數(shù)據(jù)庫(kù)中計(jì)算機(jī)類圖書銷售視圖sale_avg,包括書名(在視圖中列名為name)和該圖書的平均訂購(gòu)冊(cè)數(shù)(在視圖中列名為sale_avg)
CREATE VIEW sale_avg(name,sale_avg) AS SELECT 書名,avg(訂購(gòu)冊(cè)數(shù)) FROM jsj_sell GROUP BY 書名;
上面創(chuàng)建了計(jì)算機(jī)類圖書銷售視圖jsj_sell,可以直接從jsj_sell視圖中查詢信息生成新視圖。
1.2視圖的查詢
視圖定義后,就可以像查詢基本表那樣對(duì)視圖進(jìn)行查詢
例:在視圖jsj_sell中查找計(jì)算機(jī)類圖書的訂單號(hào)和訂購(gòu)冊(cè)數(shù)
SELECT 訂單號(hào),訂購(gòu)冊(cè)數(shù) FROM jsj_sell;
例:查找平均訂購(gòu)冊(cè)數(shù)大于5本的訂購(gòu)客戶的身份證號(hào)和平均訂購(gòu)冊(cè)數(shù)
1、創(chuàng)建客戶平均訂購(gòu)視圖kh_avg,包括客戶身份證號(hào)和平均訂購(gòu)冊(cè)數(shù)
CREATE VIEW kh_avg(sfz,order_avg) AS SELECT 身份證號(hào),AVG(訂購(gòu)冊(cè)數(shù)) FROM Sell GROUP BY 身份證號(hào);
2、對(duì)kh_avg視圖進(jìn)行查詢
SELECT * FROM kh_avg WHERE order_avg>5;
注意:使用視圖查詢時(shí),若其關(guān)聯(lián)的基本表中添加了新字段,則該視圖將不包含新字段。如果與視圖相關(guān)聯(lián)的表或視圖被刪除,則該視圖將不能再使用。
2.操作視圖
2.1通過視圖操作數(shù)據(jù)
2.1.1可更新視圖
要通過視圖更新基本表數(shù)據(jù),必須保證視圖是可更新視圖,即可以在INSET、UPDATE或DELETE等語(yǔ)句中使用它們。對(duì)于可更新的視圖,在視圖中的行和基表中的行之間必須具有一對(duì)一的關(guān)系。有一些特定的其他結(jié)構(gòu),這類結(jié)構(gòu)會(huì)使得視圖不可更新。若視圖包含以下結(jié)構(gòu)中的任何一種,其就是不可更新的:
1、聚合函數(shù)
2、DISTINCT關(guān)鍵字
3、GROUP BY子句
4、ORDER BY子句
5、HAVING子句
6、UNION運(yùn)算符
7、位于選擇列表中的子查詢
8、FROM子句中包含多個(gè)表
9、SELECT語(yǔ)句中引用了不可更新視圖
10、WHERE子句中的子查詢,引用FROM子句中的表
MySQL在多表上創(chuàng)建視圖方法
2.1.2插入數(shù)據(jù)
當(dāng)使用視圖插入數(shù)據(jù)時(shí),如果在創(chuàng)建視圖時(shí)加上WITH CHECK OPTION子句,WITH CHECK OPTION子句會(huì)在更新數(shù)據(jù)時(shí)檢查新數(shù)據(jù)是否符合視圖定義中WHERE子句的條件。
WITH CHECK OPTION子句只能和可更新視圖一起使用。
例:創(chuàng)建視圖jsj_book,視圖中包含計(jì)算機(jī)類圖書的信息,并向jsj_book視圖中插入一條記錄:('IS-01','計(jì)算機(jī)','計(jì)算機(jī)基礎(chǔ)')
1、創(chuàng)建視圖jsj_book
CREATE OR REPLACE VIEW jsj_book AS SELECT * FROM Book WHERE 圖書類別='計(jì)算機(jī)' WITH CHECK OPTION;
2、插入記錄
INSERT INTO jsj_book VALUES('IS-01','計(jì)算機(jī)','計(jì)算機(jī)基礎(chǔ)');
當(dāng)視圖所依賴的基本表有多個(gè)時(shí),不能向該視圖插入數(shù)據(jù),因?yàn)檫@將會(huì)影響多個(gè)基本表。
對(duì)INSERT語(yǔ)句還有一個(gè)限制:SELECT語(yǔ)句中必須包含F(xiàn)ROM子句中指定表的所有不能為空的列。例如,若jsj_book視圖定義時(shí)不加上“書名”字段,則插入數(shù)據(jù)時(shí)會(huì)出錯(cuò)。
2.1.3修改數(shù)據(jù)
使用UPDATE語(yǔ)句可以實(shí)現(xiàn)通過視圖修改基本表數(shù)據(jù)。
例:將jsj_sell視圖中的圖書編號(hào)為IS-01的書名改為“MySQL基礎(chǔ)”
UPDATE jsj_sell SET 書名='MySQL基礎(chǔ)' WHERE 圖書編號(hào)='IS-01';
2.1.4刪除數(shù)據(jù)
如果視圖來源于單個(gè)基本表,可以使用DELETE語(yǔ)句通過視圖來刪除基本表數(shù)據(jù),對(duì)于依賴多個(gè)基本表的視圖,不能使用DELETE語(yǔ)句。
例:刪除jsj_book中“中國(guó)青年出版社”的記錄
DELETE FROM jsj_book WHERE 出版社='中國(guó)青年出版社';
2.2修改視圖定義
可以使用ALTER VIEW語(yǔ)句對(duì)已有視圖的定義進(jìn)行修改
語(yǔ)法格式:
ALTER VIEW 視圖名[ ( 列名列表 ) ]
AS select語(yǔ)句
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
例:將jsj_book視圖修改為只包含計(jì)算機(jī)類圖書的圖書編號(hào)、書名和單價(jià)
ALTER VIEW jsj_book AS SELECT 圖書編號(hào),書名,單價(jià) FROM Book WHERE 圖書類別='計(jì)算機(jī)';
2.3刪除視圖
語(yǔ)法格式:DROP VIEW [ IF EXISTS ] 視圖名1 [, 視圖名2 ]...
若聲明了IF EXISTS,則視圖不存在的話也不會(huì)報(bào)錯(cuò)。使用DROP VIEW 一次可以刪除多個(gè)視圖。例:一次性刪除jsj_book和jsj_sell
DROP VIEW jsj_book,jsj_sell;
到此這篇關(guān)于MySQL中數(shù)據(jù)視圖操作詳解的文章就介紹到這了,更多相關(guān)MySQL數(shù)據(jù)視圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Windows(x86,64bit)升級(jí)MySQL 5.7.17免安裝版的詳細(xì)教程
這篇文章主要介紹了Windows(x86,64bit)升級(jí)MySQL 5.7.17免安裝版的詳細(xì)教程,需要的朋友可以參考下2017-02-02DBeaver連接本地MySQL并創(chuàng)建數(shù)據(jù)庫(kù)/表的基礎(chǔ)操作教程
DBeaver是一款功能強(qiáng)大的數(shù)據(jù)庫(kù)管理工具,支持創(chuàng)建多種數(shù)據(jù)庫(kù),包括達(dá)夢(mèng)數(shù)據(jù)庫(kù),這篇文章主要給大家介紹了關(guān)于DBeaver連接本地MySQL并創(chuàng)建數(shù)據(jù)庫(kù)/表的基礎(chǔ)操作教程,需要的朋友可以參考下2024-02-02MySQL?Flink實(shí)時(shí)流處理的核心技術(shù)之窗口機(jī)制
Flink是一款流處理框架,窗口機(jī)制是其核心技術(shù)之一。Flink的窗口機(jī)制可以將無(wú)限的數(shù)據(jù)流劃分為有限的窗口,并對(duì)窗口內(nèi)的數(shù)據(jù)進(jìn)行處理。Flink的窗口機(jī)制支持時(shí)間、計(jì)數(shù)、會(huì)話等多種窗口類型,并且可以在不同的窗口之間進(jìn)行流轉(zhuǎn)換和數(shù)據(jù)聚合,是實(shí)時(shí)流處理中非常重要的技術(shù)2023-05-05