CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
10年的融安網(wǎng)站建設經(jīng)驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。網(wǎng)絡營銷推廣的優(yōu)勢是能夠根據(jù)用戶設備顯示端的尺寸不同,自動調(diào)整融安建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)公司從事“融安網(wǎng)站設計”,“融安網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
該語句能創(chuàng)建新的視圖,如果給定了OR REPLACE子句,該語句還能替換已有的視圖。select_statement是一種SELECT語句,它給出了視圖的定義。該語句可從基表或其他視圖進行選擇。
該語句要求具有針對視圖的CREATE VIEW權限,以及針對由SELECT語句選擇的每一列上的某些權限。對于在SELECT語句中其他地方使用的列,必須具有SELECT權限。如果還有OR REPLACE子句,必須在視圖上具有DROP權限。
視圖屬于數(shù)據(jù)庫。在默認情況下,將在當前數(shù)據(jù)庫創(chuàng)建新視圖。要想在給定數(shù)據(jù)庫中明確創(chuàng)建視圖,創(chuàng)建時,應將名稱指定為db_name.view_name。
mysql CREATE VIEW test.v AS SELECT * FROM t;
表和視圖共享數(shù)據(jù)庫中相同的名稱空間,因此,數(shù)據(jù)庫不能包含具有相同名稱的表和視圖。
視圖必須具有唯一的列名,不得有重復,就像基表那樣。默認情況下,由SELECT語句檢索的列名將用作視圖列名。要想為視圖列定義明確的名稱,可使用可選的column_list子句,列出由逗號隔開的ID。column_list中的名稱數(shù)目必須等于SELECT語句檢索的列數(shù)。
SELECT語句檢索的列可以是對表列的簡單引用。也可以是使用函數(shù)、常量值、操作符等的表達式。
對于SELECT語句中不合格的表或視圖,將根據(jù)默認的數(shù)據(jù)庫進行解釋。通過用恰當?shù)臄?shù)據(jù)庫名稱限定表或視圖名,視圖能夠引用表或其他數(shù)據(jù)庫中的視圖。
能夠使用多種SELECT語句創(chuàng)建視圖。視圖能夠引用基表或其他視圖。它能使用聯(lián)合、UNION和子查詢。SELECT甚至不需引用任何表。在下面的示例中,定義了從另一表選擇兩列的視圖,并給出了根據(jù)這些列計算的表達式:
mysql CREATE TABLE t (qty INT, price INT);
mysql INSERT INTO t VALUES(3, 50);
mysql CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
mysql SELECT * FROM v;
+------+-------+-------+
| qty | price | value |
+------+-------+-------+
| 3 | 50 | 150 |
+------+-------+-------+
視圖定義服從下述限制:
· SELECT語句不能包含F(xiàn)ROM子句中的子查詢。
· SELECT語句不能引用系統(tǒng)或用戶變量。
· SELECT語句不能引用預處理語句參數(shù)。
· 在存儲子程序內(nèi),定義不能引用子程序參數(shù)或局部變量。
· 在定義中引用的表或視圖必須存在。但是,創(chuàng)建了視圖后,能夠舍棄定義引用的表或視圖。要想檢查視圖定義是否存在這類問題,可使用CHECK TABLE語句。
· 在定義中不能引用TEMPORARY表,不能創(chuàng)建TEMPORARY視圖。
· 在視圖定義中命名的表必須已存在。
· 不能將觸發(fā)程序與視圖關聯(lián)在一起。
在視圖定義中允許使用ORDER BY,但是,如果從特定視圖進行了選擇,而該視圖使用了具有自己ORDER BY的語句,它將被忽略。
對于定義中的其他選項或子句,它們將被增加到引用視圖的語句的選項或子句中,但效果未定義。例如,如果在視圖定義中包含LIMIT子句,而且從特定視圖進行了選擇,而該視圖使用了具有自己LIMIT子句的語句,那么對使用哪個LIMIT未作定義。相同的原理也適用于其他選項,如跟在SELECT關鍵字后的ALL、DISTINCT或SQL_SMALL_RESULT,并適用于其他子句,如INTO、FOR UPDATE、LOCK IN SHARE MODE、以及PROCEDURE。
如果創(chuàng)建了視圖,并通過更改系統(tǒng)變量更改了查詢處理環(huán)境,會影響從視圖獲得的結(jié)果:
mysql CREATE VIEW v AS SELECT CHARSET(CHAR(65)), COLLATION(CHAR(65));
Query OK, 0 rows affected (0.00 sec)
mysql SET NAMES 'latin1';
Query OK, 0 rows affected (0.00 sec)
mysql SELECT * FROM v;
+-------------------+---------------------+
| CHARSET(CHAR(65)) | COLLATION(CHAR(65)) |
+-------------------+---------------------+
| latin1 | latin1_swedish_ci |
+-------------------+---------------------+
1 row in set (0.00 sec)
mysql SET NAMES 'utf8';
Query OK, 0 rows affected (0.00 sec)
mysql SELECT * FROM v;
+-------------------+---------------------+
| CHARSET(CHAR(65)) | COLLATION(CHAR(65)) |
+-------------------+---------------------+
| utf8 | utf8_general_ci |
+-------------------+---------------------+
1 row in set (0.00 sec)
可選的ALGORITHM子句是對標準SQL的MySQL擴展。ALGORITHM可取三個值:MERGE、TEMPTABLE或UNDEFINED。如果沒有ALGORITHM子句,默認算法是UNDEFINED(未定義的)。算法會影響MySQL處理視圖的方式。
對于MERGE,會將引用視圖的語句的文本與視圖定義合并起來,使得視圖定義的某一部分取代語句的對應部分。
對于TEMPTABLE,視圖的結(jié)果將被置于臨時表中,然后使用它執(zhí)行語句。
對于UNDEFINED,MySQL將選擇所要使用的算法。如果可能,它傾向于MERGE而不是TEMPTABLE,這是因為MERGE通常更有效,而且如果使用了臨時表,視圖是不可更新的。
明確選擇TEMPTABLE的1個原因在于,創(chuàng)建臨時表之后、并在完成語句處理之前,能夠釋放基表上的鎖定。與MERGE算法相比,鎖定釋放的速度更快,這樣,使用視圖的其他客戶端不會被屏蔽過長時間。
視圖算法可以是UNDEFINED,有三種方式:
· 在CREATE VIEW語句中沒有ALGORITHM子句。
· CREATE VIEW語句有1個顯式ALGORITHM = UNDEFINED子句。
· 為僅能用臨時表處理的視圖指定ALGORITHM = MERGE。在這種情況下,MySQL將生成告警,并將算法設置為UNDEFINED。
正如前面所介紹的那樣,通過將視圖定義中的對應部分合并到引用視圖的語句中,對MERGE進行處理。在下面的示例中,簡要介紹了MERGE的工作方式。在該示例中,假定有1個具有下述定義的視圖v_merge:
CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS
SELECT c1, c2 FROM t WHERE c3 100;
示例1:假定發(fā)出了下述語句:
SELECT * FROM v_merge;
MySQL以下述方式處理語句:
· v_merge成為t
· *成為vc1、vc2,與c1、c2對應
· 增加視圖WHERE子句
所產(chǎn)生的將執(zhí)行的語句為:
SELECT c1, c2 FROM t WHERE c3 100;
示例2:假定發(fā)出了下述語句:
SELECT * FROM v_merge WHERE vc1 100;
該語句的處理方式與前面介紹的類似,但vc1 100變?yōu)閏1 100,并使用AND連接詞將視圖的WHERE子句添加到語句的WHERE子句中(增加了圓括號以確保以正確的優(yōu)先順序執(zhí)行子句部分)。所得的將要執(zhí)行的語句變?yōu)椋?/p>
SELECT c1, c2 FROM t WHERE (c3 100) AND (c1 100);
事實上,將要執(zhí)行的語句是具有下述形式的WHERE子句:
WHERE (select WHERE) AND (view WHERE)
MERGE算法要求視圖中的行和基表中的行具有一對一的關系。如果不具有該關系。必須使用臨時表取而代之。如果視圖包含下述結(jié)構中的任何一種,將失去一對一的關系:
· 聚合函數(shù)(SUM(), MIN(), MAX(), COUNT()等)。
· DISTINCT
· GROUP BY
· HAVING
· UNION或UNION ALL
· 僅引用文字值(在該情況下,沒有基本表)。
某些視圖是可更新的。也就是說,可以在諸如UPDATE、DELETE或INSERT等語句中使用它們,以更新基表的內(nèi)容。對于可更新的視圖,在視圖中的行和基表中的行之間必須具有一對一的關系。還有一些特定的其他結(jié)構,這類結(jié)構會使得視圖不可更新。更具體地講,如果視圖包含下述結(jié)構中的任何一種,那么它就是不可更新的:
· 聚合函數(shù)(SUM(), MIN(), MAX(), COUNT()等)。
· DISTINCT
· GROUP BY
· HAVING
· UNION或UNION ALL
· 位于選擇列表中的子查詢
· Join
· FROM子句中的不可更新視圖
· WHERE子句中的子查詢,引用FROM子句中的表。
· 僅引用文字值(在該情況下,沒有要更新的基本表)。
· ALGORITHM = TEMPTABLE(使用臨時表總會使視圖成為不可更新的)。
關于可插入性(可用INSERT語句更新),如果它也滿足關于視圖列的下述額外要求,可更新的視圖也是可插入的:
· 不得有重復的視圖列名稱。
· 視圖必須包含沒有默認值的基表中的所有列。
· 視圖列必須是簡單的列引用而不是導出列。導出列不是簡單的列引用,而是從表達式導出的。下面給出了一些導出列示例:
· 3.14159
· col1 + 3
· UPPER(col2)
· col3 / col4
· (subquery)
混合了簡單列引用和導出列的視圖是不可插入的,但是,如果僅更新非導出列,視圖是可更新的。考慮下述視圖:
CREATE VIEW v AS SELECT col1, 1 AS col2 FROM t;
該視圖是不可插入的,這是因為col2是從表達式導出的。但是,如果更新時不更新col2,它是可更新的。這類更新是允許的:
UPDATE v SET col1 = 0;
下述更新是不允許的,原因在于,它試圖更新導出列:
UPDATE v SET col2 = 0;
在某些情況下,能夠更新多表視圖,假定它能使用MERGE算法進行處理。為此,視圖必須使用內(nèi)部聯(lián)合(而不是外部聯(lián)合或UNION)。此外,僅能更新視圖定義中的單個表,因此,SET子句必須僅命名視圖中某一表的列。即使從理論上講也是可更新的,不允許使用UNION ALL的視圖,這是因為,在實施中將使用臨時表來處理它們。
對于多表可更新視圖,如果是將其插入單個表中,INSERT能夠工作。不支持DELETE。
對于可更新視圖,可給定WITH CHECK OPTION子句來防止插入或更新行,除非作用在行上的select_statement中的WHERE子句為“真”。
在關于可更新視圖的WITH CHECK OPTION子句中,當視圖是根據(jù)另一個視圖定義的時,LOCAL和CASCADED關鍵字決定了檢查測試的范圍。LOCAL關鍵字對CHECK OPTION進行了限制,使其僅作用在定義的視圖上,CASCADED會對將進行評估的基表進行檢查。如果未給定任一關鍵字,默認值為CASCADED。
在查詢頁面用語句創(chuàng)建就可以。
1、打開Navicat for MySQL,并登錄到指定數(shù)據(jù)庫。
2、點擊上方查詢。
3、點擊新建查詢。
4、在空白處寫上視圖創(chuàng)建語句,點擊左上方執(zhí)行即可。
create or replace view v_name\x0d\x0aas\x0d\x0aselect t1.*,t2.*,t3.*\x0d\x0afrom A表 t1, B表 t2, C表 t3\x0d\x0awhere t1.a=t2.b and t2.b1=t3.c
在 SQL 中,視圖是基于 SQL 語句的結(jié)果集的可視化的表。
視圖包含行和列,就像一個真實的表。視圖中的字段就是來自一個或多個數(shù)據(jù)庫中的真實的表中的字段。我們可以向視圖添加 SQL 函數(shù)、WHERE 以及 JOIN 語句,我們也可以提交數(shù)據(jù),就像這些來自于某個單一的表。
例子
創(chuàng)建視圖
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]\x0d\x0a VIEW view_name [(column_list)]\x0d\x0a AS select_statement\x0d\x0a [WITH [CASCADED | LOCAL] CHECK OPTION]\x0d\x0a\x0d\x0a該語句能創(chuàng)建新的視圖,如果給定了OR REPLACE子句,該語句還能替換已有的視圖。select_statement是一種SELECT語句,它給出了視圖的定義。該語句可從基表或其他視圖進行選擇。\x0d\x0a該語句要求具有針對視圖的CREATE VIEW權限,以及針對由SELECT語句選擇的每一列上的某些權限。對于在SELECT語句中其他地方使用的列,必須具有SELECT權限。如果還有OR REPLACE子句,必須在視圖上具有DROP權限。\x0d\x0a視圖屬于數(shù)據(jù)庫。在默認情況下,將在當前數(shù)據(jù)庫創(chuàng)建新視圖。要想在給定數(shù)據(jù)庫中明確創(chuàng)建視圖,創(chuàng)建時,應將名稱指定為db_name.view_name。\x0d\x0amysql CREATE VIEW test.v AS SELECT * FROM t;\x0d\x0a\x0d\x0a表和視圖共享數(shù)據(jù)庫中相同的名稱空間,因此,數(shù)據(jù)庫不能包含具有相同名稱的表和視圖。\x0d\x0a視圖必須具有唯一的列名,不得有重復,就像基表那樣。默認情況下,由SELECT語句檢索的列名將用作視圖列名。要想為視圖列定義明確的名稱,可使用可選的column_list子句,列出由逗號隔開的ID。column_list中的名稱數(shù)目必須等于SELECT語句檢索的列數(shù)。\x0d\x0aSELECT語句檢索的列可以是對表列的簡單引用。也可以是使用函數(shù)、常量值、操作符等的表達式。\x0d\x0a對于SELECT語句中不合格的表或視圖,將根據(jù)默認的數(shù)據(jù)庫進行解釋。通過用恰當?shù)臄?shù)據(jù)庫名稱限定表或視圖名,視圖能夠引用表或其他數(shù)據(jù)庫中的視圖。\x0d\x0a能夠使用多種SELECT語句創(chuàng)建視圖。視圖能夠引用基表或其他視圖。它能使用聯(lián)合、UNION和子查詢。SELECT甚至不需引用任何表。在下面的示例中,定義了從另一表選擇兩列的視圖,并給出了根據(jù)這些列計算的表達式:\x0d\x0amysql CREATE TABLE t (qty INT, price INT);\x0d\x0amysql INSERT INTO t VALUES(3, 50);\x0d\x0amysql CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;\x0d\x0amysql SELECT * FROM v;\x0d\x0a+------+-------+-------+\x0d\x0a| qty | price | value |\x0d\x0a+------+-------+-------+\x0d\x0a| 3 | 50 | 150 |\x0d\x0a+------+-------+-------+\x0d\x0a\x0d\x0a視圖定義服從下述限制:\x0d\x0a· SELECT語句不能包含F(xiàn)ROM子句中的子查詢。\x0d\x0a· SELECT語句不能引用系統(tǒng)或用戶變量。\x0d\x0a· SELECT語句不能引用預處理語句參數(shù)。\x0d\x0a· 在存儲子程序內(nèi),定義不能引用子程序參數(shù)或局部變量。\x0d\x0a· 在定義中引用的表或視圖必須存在。但是,創(chuàng)建了視圖后,能夠舍棄定義引用的表或視圖。要想檢查視圖定義是否存在這類問題,可使用CHECK TABLE語句。\x0d\x0a· 在定義中不能引用TEMPORARY表,不能創(chuàng)建TEMPORARY視圖。\x0d\x0a· 在視圖定義中命名的表必須已存在。\x0d\x0a· 不能將觸發(fā)程序與視圖關聯(lián)在一起。\x0d\x0a在視圖定義中允許使用ORDER BY,但是,如果從特定視圖進行了選擇,而該視圖使用了具有自己ORDER BY的語句,它將被忽略。\x0d\x0a對于定義中的其他選項或子句,它們將被增加到引用視圖的語句的選項或子句中,但效果未定義。例如,如果在視圖定義中包含LIMIT子句,而且從特定視圖進行了選擇,而該視圖使用了具有自己LIMIT子句的語句,那么對使用哪個LIMIT未作定義。相同的原理也適用于其他選項,如跟在SELECT關鍵字后的ALL、DISTINCT或SQL_SMALL_RESULT,并適用于其他子句,如INTO、FOR UPDATE、LOCK IN SHARE MODE、以及PROCEDURE。\x0d\x0a如果創(chuàng)建了視圖,并通過更改系統(tǒng)變量更改了查詢處理環(huán)境,會影響從視圖獲得的結(jié)果:\x0d\x0amysql CREATE VIEW v AS SELECT CHARSET(CHAR(65)), COLLATION(CHAR(65));\x0d\x0aQuery OK, 0 rows affected (0.00 sec)\x0d\x0a \x0d\x0amysql SET NAMES 'latin1';\x0d\x0aQuery OK, 0 rows affected (0.00 sec)\x0d\x0a \x0d\x0amysql SELECT * FROM v;\x0d\x0a+-------------------+---------------------+\x0d\x0a| CHARSET(CHAR(65)) | COLLATION(CHAR(65)) |\x0d\x0a+-------------------+---------------------+\x0d\x0a| latin1 | latin1_swedish_ci |\x0d\x0a+-------------------+---------------------+\x0d\x0a1 row in set (0.00 sec)\x0d\x0a \x0d\x0amysql SET NAMES 'utf8';\x0d\x0aQuery OK, 0 rows affected (0.00 sec)\x0d\x0a \x0d\x0amysql SELECT * FROM v;\x0d\x0a+-------------------+---------------------+\x0d\x0a| CHARSET(CHAR(65)) | COLLATION(CHAR(65)) |\x0d\x0a+-------------------+---------------------+\x0d\x0a| utf8 | utf8_general_ci |\x0d\x0a+-------------------+---------------------+\x0d\x0a1 row in set (0.00 sec)\x0d\x0a\x0d\x0a可選的ALGORITHM子句是對標準SQL的MySQL擴展。ALGORITHM可取三個值:MERGE、TEMPTABLE或UNDEFINED。如果沒有ALGORITHM子句,默認算法是UNDEFINED(未定義的)。算法會影響MySQL處理視圖的方式。\x0d\x0a對于MERGE,會將引用視圖的語句的文本與視圖定義合并起來,使得視圖定義的某一部分取代語句的對應部分。\x0d\x0a對于TEMPTABLE,視圖的結(jié)果將被置于臨時表中,然后使用它執(zhí)行語句。\x0d\x0a對于UNDEFINED,MySQL將選擇所要使用的算法。如果可能,它傾向于MERGE而不是TEMPTABLE,這是因為MERGE通常更有效,而且如果使用了臨時表,視圖是不可更新的。\x0d\x0a明確選擇TEMPTABLE的1個原因在于,創(chuàng)建臨時表之后、并在完成語句處理之前,能夠釋放基表上的鎖定。與MERGE算法相比,鎖定釋放的速度更快,這樣,使用視圖的其他客戶端不會被屏蔽過長時間。\x0d\x0a視圖算法可以是UNDEFINED,有三種方式:\x0d\x0a· 在CREATE VIEW語句中沒有ALGORITHM子句。\x0d\x0a· CREATE VIEW語句有1個顯式ALGORITHM = UNDEFINED子句。\x0d\x0a· 為僅能用臨時表處理的視圖指定ALGORITHM = MERGE。在這種情況下,MySQL將生成告警,并將算法設置為UNDEFINED。\x0d\x0a正如前面所介紹的那樣,通過將視圖定義中的對應部分合并到引用視圖的語句中,對MERGE進行處理。在下面的示例中,簡要介紹了MERGE的工作方式。在該示例中,假定有1個具有下述定義的視圖v_merge:\x0d\x0aCREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS\x0d\x0aSELECT c1, c2 FROM t WHERE c3 100;\x0d\x0a\x0d\x0a示例1:假定發(fā)出了下述語句:\x0d\x0aSELECT * FROM v_merge;\x0d\x0a\x0d\x0aMySQL以下述方式處理語句:\x0d\x0a· v_merge成為t\x0d\x0a· *成為vc1、vc2,與c1、c2對應\x0d\x0a· 增加視圖WHERE子句\x0d\x0a所產(chǎn)生的將執(zhí)行的語句為:\x0d\x0aSELECT c1, c2 FROM t WHERE c3 100;\x0d\x0a\x0d\x0a示例2:假定發(fā)出了下述語句:\x0d\x0aSELECT * FROM v_merge WHERE vc1 100) AND (c1
回答于?2022-11-16
名稱欄目:mysql視圖怎么設計 mysql視圖使用
鏈接地址:http://jinyejixie.com/article32/doscdsc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設計、靜態(tài)網(wǎng)站、網(wǎng)站排名、小程序開發(fā)、品牌網(wǎng)站建設、營銷型網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)