視圖是存儲(chǔ),在調(diào)用的時(shí)候產(chǎn)生一個(gè)結(jié)果集的查詢。一個(gè)視圖作為一個(gè)虛擬表。
簡(jiǎn)單理解:視圖是一種 虛擬表 ,本身是 不具有數(shù)據(jù) 的,占用很少的內(nèi)存空間,它是 SQL 中的一個(gè)重要概念。視圖建立在已有表的基礎(chǔ)上, 視圖賴以建立的這些表稱為基表。
?
前言
?視圖優(yōu)點(diǎn)
1. 操作簡(jiǎn)單
將經(jīng)常使用的查詢操作定義為視圖,可以使開發(fā)人員不需要關(guān)心視圖對(duì)應(yīng)的數(shù)據(jù)表的結(jié)構(gòu)、表與表之間的關(guān)聯(lián)關(guān)系,也不需要關(guān)心數(shù)據(jù)表之間的業(yè)務(wù)邏輯和查詢條件,而只需要簡(jiǎn)單地操作視圖即可,極大簡(jiǎn)化了開發(fā)人員對(duì)數(shù)據(jù)庫(kù)的操作。
2. 減少數(shù)據(jù)冗余
視圖跟實(shí)際數(shù)據(jù)表不一樣,它存儲(chǔ)的是查詢語(yǔ)句。所以,在使用的時(shí)候,我們要通過定義視圖的查詢語(yǔ)句來獲取結(jié)果集。而視圖本身不存儲(chǔ)數(shù)據(jù),不占用數(shù)據(jù)存儲(chǔ)的資源,減少了數(shù)據(jù)冗余。
3. 數(shù)據(jù)安全
MySQL將用戶對(duì)數(shù)據(jù)的 訪問限制 在某些數(shù)據(jù)的結(jié)果集上,而這些數(shù)據(jù)的結(jié)果集可以使用視圖來實(shí)現(xiàn)。用戶不必直接查詢或操作數(shù)據(jù)表。這也可以理解為視圖具有 隔離性 。視圖相當(dāng)于在用戶和實(shí)際的數(shù)據(jù)表之間加了一層虛擬表。同時(shí),MySQL可以根據(jù)權(quán)限將用戶對(duì)數(shù)據(jù)的訪問限制在某些視圖上,用戶不需要查詢數(shù)據(jù)表,可以直接通過視圖獲取數(shù)據(jù)表中的信息。這在一定程度上保障了數(shù)據(jù)表中數(shù)據(jù)的安全性。
4. 適應(yīng)靈活多變的需求
當(dāng)業(yè)務(wù)系統(tǒng)的需求發(fā)生變化后,如果需要改動(dòng)數(shù)據(jù)表的結(jié)構(gòu),則工作量相對(duì)較大,可以使用視圖來減少改動(dòng)的工作量。這種方式在實(shí)際工作中使用得比較多。
5. 能夠分解復(fù)雜的查詢邏輯
數(shù)據(jù)庫(kù)中如果存在復(fù)雜的查詢邏輯,則可以將問題進(jìn)行分解,創(chuàng)建多個(gè)視圖獲取數(shù)據(jù),再將創(chuàng)建的多個(gè)視圖結(jié)合起來,完成復(fù)雜的查詢邏輯。
?
一、創(chuàng)建視圖{單表,多表,視圖中創(chuàng)建視圖}
這個(gè)CREATE VIEW
語(yǔ)句創(chuàng)建新的視圖。改變視圖的定義或刪除視圖,使用ALTER VIEW
,或DROP VIEW
一個(gè)視圖可以從多種創(chuàng)建SELECT
聲明.它可以指基表或其他視圖。它可以使用聯(lián)接,UNION
和子查詢。theSELECT
甚至不需要參考任何表。下面的示例定義一個(gè)視圖,選擇從另一桌兩列,以及從這些列的計(jì)算表達(dá)式:
CREATE [OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW 視圖名稱 [(字段列表)]
AS 查詢語(yǔ)句
[WITH [CASCADED|LOCAL] CHECK OPTION]
?簡(jiǎn)單表達(dá)式:
CREATE VIEW 視圖名稱
AS 查詢語(yǔ)句
?創(chuàng)建多表聯(lián)合視圖:
就是在視圖中的查詢語(yǔ)句添加多表查詢,自然連接或者USING連接,函數(shù)等。
類如:WHERE
CREATE VIEW empview
AS
SELECT employee_id emp_id,last_name NAME,department_name
FROM employees e,departments d
WHERE e.department_id = d.department_id;
左外連接
CREATE VIEW emp_dept
AS
SELECT ename,dname
FROM t_employee LEFT JOIN t_department
ON t_employee.did = t_department.did;
?聚合函數(shù)
CREATE VIEW dept_sum_vu
(name, minsal, maxsal, avgsal)
AS
SELECT d.department_name, MIN(e.salary), MAX(e.salary),AVG(e.salary)
FROM employees e, departments d
WHERE e.department_id = d.department_id
GROUP BY d.department_name;
?利用視圖對(duì)數(shù)據(jù)進(jìn)行格式化:
我們經(jīng)常需要輸出某個(gè)格式的內(nèi)容,比如我們想輸出員工姓名和對(duì)應(yīng)的部門名,對(duì)應(yīng)格式為
emp_name(department_name),就可以使用視圖來完成數(shù)據(jù)格式化的操作:
CREATE VIEW emp_depart
AS
SELECT CONCAT(last_name,'(',department_name,')') AS emp_dept
FROM employees e JOIN departments d
WHERE e.department_id = d.department_id
?運(yùn)行后:
二、查看視圖
????????語(yǔ)法1:查看數(shù)據(jù)庫(kù)的表對(duì)象、視圖對(duì)象
SHOW TABLES;
????????語(yǔ)法2:查看視圖的結(jié)構(gòu)
DESC / DESCRIBE 視圖名稱;
????????語(yǔ)法3:查看視圖的屬性信息
# 查看視圖信息(顯示數(shù)據(jù)表的存儲(chǔ)引擎、版本、數(shù)據(jù)行數(shù)和數(shù)據(jù)大小等)
SHOW TABLE STATUS LIKE '視圖名稱'\G
1.更新視圖的數(shù)據(jù)
*一般情況*
MySQL支持使用INSERT、UPDATE和DELETE語(yǔ)句對(duì)視圖中的數(shù)據(jù)進(jìn)行插入、更新和刪除操作。當(dāng)視圖中的數(shù)據(jù)發(fā)生變化時(shí),數(shù)據(jù)表中的數(shù)據(jù)也會(huì)發(fā)生變化,反之亦然。
更新和插入的觀點(diǎn):
一些視圖是可更新的,對(duì)它們的引用可以用來指定要更新的表中數(shù)據(jù)變化報(bào)表。那就是,你可以使用它們的報(bào)表等UPDATE
,DELETE
,或INSERT
更新基礎(chǔ)表的內(nèi)容。派生表、公用表表達(dá)式也可以在多個(gè)表中指定的UPDATE
和DELETE
報(bào)表,但只能用于讀取數(shù)據(jù)指定要更新或刪除的行。一般來說,視圖的引用必須是可更新的,這意味著他們可以合并和不實(shí)。復(fù)合視圖有更復(fù)雜的規(guī)則。
一個(gè)視圖是可更新的,必須有一個(gè)一對(duì)一的關(guān)系排在視圖和基礎(chǔ)表中的行。也有一些其他的結(jié)構(gòu),使視圖nonupdatable。更具體的,如果它包含下列視圖是不可更新的:
-
聚合函數(shù)和窗口函數(shù)(
SUM()
,MIN()
,MAX()
,COUNT()
我知道,和四) -
DISTINCT
-
GROUP BY
-
HAVING
-
UNION
或UNION ALL
-
選擇列表中的子查詢
獨(dú)立的子查詢選擇列表中的失敗
INSERT
,但都好UPDATE
,DELETE
。相關(guān)子查詢的選擇列表中,沒有數(shù)據(jù)變化報(bào)表允許。 -
某些連接(見附加在本節(jié)稍后加入討論)
-
參考在nonupdatable觀
FROM
條款 -
子查詢中的
WHERE
條款,是指一個(gè)表中從
條款 -
僅指文字值(在這種情況下,沒有基本表的更新)
-
ALGORITHM = TEMPTABLE
(使用一個(gè)臨時(shí)表總是認(rèn)為nonupdatable) -
多個(gè)引用任何一個(gè)基表列(失敗
INSERT
,好了UPDATE
,DELETE
) -
對(duì)于多表視圖是可更新,它有時(shí)是可能的,假設(shè)它可以處理的
MERGE
算法.對(duì)于這個(gè)工作,視圖必須使用內(nèi)部聯(lián)接(不是外部聯(lián)接或UNION
)。另外,在視圖定義中只有一個(gè)表可以被更新,所以配置
條款名稱僅列必須從一個(gè)視圖中的表。視圖的使用UNION ALL
不允許他們雖然在理論上可能更新。 -
關(guān)于嵌入性(被更新與
INSERT
語(yǔ)句),如果它也滿足這些額外的要求可更新視圖的視圖列插入: -
不能有重復(fù)的視圖列的名字。
-
視圖必須包含在基表中,沒有默認(rèn)值的所有列。
-
視圖的列必須是簡(jiǎn)單的列引用。
2.修改、刪除視圖
修改視圖
方式1:使用CREATE OR REPLACE VIEW 子句修改視圖
CREATE OR REPLACE VIEW empvu80
(id_number, name, sal, department_id)
AS
SELECT employee_id, first_name || ' ' || last_name, salary, department_id
FROM employees
WHERE department_id = 80;
說明:CREATE VIEW 子句中各列的別名應(yīng)和子查詢中各列相對(duì)應(yīng)。
?方式2:ALTER VIEW
修改視圖的語(yǔ)法是:
ALTER VIEW 視圖名稱
AS
查詢語(yǔ)句
刪除視圖:
????????刪除視圖只是刪除視圖的定義,并不會(huì)刪除基表的數(shù)據(jù)。文章來源:http://www.zghlxwxcb.cn/news/detail-471310.html
DROP VIEW IF EXISTS 視圖名稱;
總結(jié)
點(diǎn)贊加收藏是我最大的動(dòng)力!文章來源地址http://www.zghlxwxcb.cn/news/detail-471310.html
到了這里,關(guān)于【MySQL視圖】視圖處理算法 , 創(chuàng)建 {單表,多表,視圖中創(chuàng)建視圖},查看,和修改。最詳細(xì)來這里!的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!