CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括新榮網(wǎng)站建設(shè)、新榮網(wǎng)站制作、新榮網(wǎng)頁(yè)制作以及新榮網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,新榮網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶(hù)以成都為中心已經(jīng)輻射到新榮省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶(hù)的支持與信任!
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
該語(yǔ)句能創(chuàng)建新的視圖,如果給定了OR REPLACE子句,該語(yǔ)句還能替換已有的視圖。select_statement是一種SELECT語(yǔ)句,它給出了視圖的定義。該語(yǔ)句可從基表或其他視圖進(jìn)行選擇。
該語(yǔ)句要求具有針對(duì)視圖的CREATE VIEW權(quán)限,以及針對(duì)由SELECT語(yǔ)句選擇的每一列上的某些權(quán)限。對(duì)于在SELECT語(yǔ)句中其他地方使用的列,必須具有SELECT權(quán)限。如果還有OR REPLACE子句,必須在視圖上具有DROP權(quán)限。
視圖屬于數(shù)據(jù)庫(kù)。在默認(rèn)情況下,將在當(dāng)前數(shù)據(jù)庫(kù)創(chuàng)建新視圖。要想在給定數(shù)據(jù)庫(kù)中明確創(chuàng)建視圖,創(chuàng)建時(shí),應(yīng)將名稱(chēng)指定為db_name.view_name。
mysql CREATE VIEW test.v AS SELECT * FROM t;
表和視圖共享數(shù)據(jù)庫(kù)中相同的名稱(chēng)空間,因此,數(shù)據(jù)庫(kù)不能包含具有相同名稱(chēng)的表和視圖。
視圖必須具有唯一的列名,不得有重復(fù),就像基表那樣。默認(rèn)情況下,由SELECT語(yǔ)句檢索的列名將用作視圖列名。要想為視圖列定義明確的名稱(chēng),可使用可選的column_list子句,列出由逗號(hào)隔開(kāi)的ID。column_list中的名稱(chēng)數(shù)目必須等于SELECT語(yǔ)句檢索的列數(shù)。
SELECT語(yǔ)句檢索的列可以是對(duì)表列的簡(jiǎn)單引用。也可以是使用函數(shù)、常量值、操作符等的表達(dá)式。
對(duì)于SELECT語(yǔ)句中不合格的表或視圖,將根據(jù)默認(rèn)的數(shù)據(jù)庫(kù)進(jìn)行解釋。通過(guò)用恰當(dāng)?shù)臄?shù)據(jù)庫(kù)名稱(chēng)限定表或視圖名,視圖能夠引用表或其他數(shù)據(jù)庫(kù)中的視圖。
能夠使用多種SELECT語(yǔ)句創(chuàng)建視圖。視圖能夠引用基表或其他視圖。它能使用聯(lián)合、UNION和子查詢(xún)。SELECT甚至不需引用任何表。在下面的示例中,定義了從另一表選擇兩列的視圖,并給出了根據(jù)這些列計(jì)算的表達(dá)式:
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語(yǔ)句不能包含F(xiàn)ROM子句中的子查詢(xún)。
· SELECT語(yǔ)句不能引用系統(tǒng)或用戶(hù)變量。
· SELECT語(yǔ)句不能引用預(yù)處理語(yǔ)句參數(shù)。
· 在存儲(chǔ)子程序內(nèi),定義不能引用子程序參數(shù)或局部變量。
· 在定義中引用的表或視圖必須存在。但是,創(chuàng)建了視圖后,能夠舍棄定義引用的表或視圖。要想檢查視圖定義是否存在這類(lèi)問(wèn)題,可使用CHECK TABLE語(yǔ)句。
· 在定義中不能引用TEMPORARY表,不能創(chuàng)建TEMPORARY視圖。
· 在視圖定義中命名的表必須已存在。
· 不能將觸發(fā)程序與視圖關(guān)聯(lián)在一起。
在視圖定義中允許使用ORDER BY,但是,如果從特定視圖進(jìn)行了選擇,而該視圖使用了具有自己ORDER BY的語(yǔ)句,它將被忽略。
對(duì)于定義中的其他選項(xiàng)或子句,它們將被增加到引用視圖的語(yǔ)句的選項(xiàng)或子句中,但效果未定義。例如,如果在視圖定義中包含LIMIT子句,而且從特定視圖進(jìn)行了選擇,而該視圖使用了具有自己LIMIT子句的語(yǔ)句,那么對(duì)使用哪個(gè)LIMIT未作定義。相同的原理也適用于其他選項(xiàng),如跟在SELECT關(guān)鍵字后的ALL、DISTINCT或SQL_SMALL_RESULT,并適用于其他子句,如INTO、FOR UPDATE、LOCK IN SHARE MODE、以及PROCEDURE。
如果創(chuàng)建了視圖,并通過(guò)更改系統(tǒng)變量更改了查詢(xún)處理環(huán)境,會(huì)影響從視圖獲得的結(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子句是對(duì)標(biāo)準(zhǔn)SQL的MySQL擴(kuò)展。ALGORITHM可取三個(gè)值:MERGE、TEMPTABLE或UNDEFINED。如果沒(méi)有ALGORITHM子句,默認(rèn)算法是UNDEFINED(未定義的)。算法會(huì)影響MySQL處理視圖的方式。
對(duì)于MERGE,會(huì)將引用視圖的語(yǔ)句的文本與視圖定義合并起來(lái),使得視圖定義的某一部分取代語(yǔ)句的對(duì)應(yīng)部分。
對(duì)于TEMPTABLE,視圖的結(jié)果將被置于臨時(shí)表中,然后使用它執(zhí)行語(yǔ)句。
對(duì)于UNDEFINED,MySQL將選擇所要使用的算法。如果可能,它傾向于MERGE而不是TEMPTABLE,這是因?yàn)镸ERGE通常更有效,而且如果使用了臨時(shí)表,視圖是不可更新的。
明確選擇TEMPTABLE的1個(gè)原因在于,創(chuàng)建臨時(shí)表之后、并在完成語(yǔ)句處理之前,能夠釋放基表上的鎖定。與MERGE算法相比,鎖定釋放的速度更快,這樣,使用視圖的其他客戶(hù)端不會(huì)被屏蔽過(guò)長(zhǎng)時(shí)間。
視圖算法可以是UNDEFINED,有三種方式:
· 在CREATE VIEW語(yǔ)句中沒(méi)有ALGORITHM子句。
· CREATE VIEW語(yǔ)句有1個(gè)顯式ALGORITHM = UNDEFINED子句。
· 為僅能用臨時(shí)表處理的視圖指定ALGORITHM = MERGE。在這種情況下,MySQL將生成告警,并將算法設(shè)置為UNDEFINED。
正如前面所介紹的那樣,通過(guò)將視圖定義中的對(duì)應(yīng)部分合并到引用視圖的語(yǔ)句中,對(duì)MERGE進(jìn)行處理。在下面的示例中,簡(jiǎn)要介紹了MERGE的工作方式。在該示例中,假定有1個(gè)具有下述定義的視圖v_merge:
CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS
SELECT c1, c2 FROM t WHERE c3 100;
示例1:假定發(fā)出了下述語(yǔ)句:
SELECT * FROM v_merge;
MySQL以下述方式處理語(yǔ)句:
· v_merge成為t
· *成為vc1、vc2,與c1、c2對(duì)應(yīng)
· 增加視圖WHERE子句
所產(chǎn)生的將執(zhí)行的語(yǔ)句為:
SELECT c1, c2 FROM t WHERE c3 100;
示例2:假定發(fā)出了下述語(yǔ)句:
SELECT * FROM v_merge WHERE vc1 100;
該語(yǔ)句的處理方式與前面介紹的類(lèi)似,但vc1 100變?yōu)閏1 100,并使用AND連接詞將視圖的WHERE子句添加到語(yǔ)句的WHERE子句中(增加了圓括號(hào)以確保以正確的優(yōu)先順序執(zhí)行子句部分)。所得的將要執(zhí)行的語(yǔ)句變?yōu)椋?/p>
SELECT c1, c2 FROM t WHERE (c3 100) AND (c1 100);
事實(shí)上,將要執(zhí)行的語(yǔ)句是具有下述形式的WHERE子句:
WHERE (select WHERE) AND (view WHERE)
MERGE算法要求視圖中的行和基表中的行具有一對(duì)一的關(guān)系。如果不具有該關(guān)系。必須使用臨時(shí)表取而代之。如果視圖包含下述結(jié)構(gòu)中的任何一種,將失去一對(duì)一的關(guān)系:
· 聚合函數(shù)(SUM(), MIN(), MAX(), COUNT()等)。
· DISTINCT
· GROUP BY
· HAVING
· UNION或UNION ALL
· 僅引用文字值(在該情況下,沒(méi)有基本表)。
某些視圖是可更新的。也就是說(shuō),可以在諸如UPDATE、DELETE或INSERT等語(yǔ)句中使用它們,以更新基表的內(nèi)容。對(duì)于可更新的視圖,在視圖中的行和基表中的行之間必須具有一對(duì)一的關(guān)系。還有一些特定的其他結(jié)構(gòu),這類(lèi)結(jié)構(gòu)會(huì)使得視圖不可更新。更具體地講,如果視圖包含下述結(jié)構(gòu)中的任何一種,那么它就是不可更新的:
· 聚合函數(shù)(SUM(), MIN(), MAX(), COUNT()等)。
· DISTINCT
· GROUP BY
· HAVING
· UNION或UNION ALL
· 位于選擇列表中的子查詢(xún)
· Join
· FROM子句中的不可更新視圖
· WHERE子句中的子查詢(xún),引用FROM子句中的表。
· 僅引用文字值(在該情況下,沒(méi)有要更新的基本表)。
· ALGORITHM = TEMPTABLE(使用臨時(shí)表總會(huì)使視圖成為不可更新的)。
關(guān)于可插入性(可用INSERT語(yǔ)句更新),如果它也滿(mǎn)足關(guān)于視圖列的下述額外要求,可更新的視圖也是可插入的:
· 不得有重復(fù)的視圖列名稱(chēng)。
· 視圖必須包含沒(méi)有默認(rèn)值的基表中的所有列。
· 視圖列必須是簡(jiǎn)單的列引用而不是導(dǎo)出列。導(dǎo)出列不是簡(jiǎn)單的列引用,而是從表達(dá)式導(dǎo)出的。下面給出了一些導(dǎo)出列示例:
· 3.14159
· col1 + 3
· UPPER(col2)
· col3 / col4
· (subquery)
混合了簡(jiǎn)單列引用和導(dǎo)出列的視圖是不可插入的,但是,如果僅更新非導(dǎo)出列,視圖是可更新的。考慮下述視圖:
CREATE VIEW v AS SELECT col1, 1 AS col2 FROM t;
該視圖是不可插入的,這是因?yàn)閏ol2是從表達(dá)式導(dǎo)出的。但是,如果更新時(shí)不更新col2,它是可更新的。這類(lèi)更新是允許的:
UPDATE v SET col1 = 0;
下述更新是不允許的,原因在于,它試圖更新導(dǎo)出列:
UPDATE v SET col2 = 0;
在某些情況下,能夠更新多表視圖,假定它能使用MERGE算法進(jìn)行處理。為此,視圖必須使用內(nèi)部聯(lián)合(而不是外部聯(lián)合或UNION)。此外,僅能更新視圖定義中的單個(gè)表,因此,SET子句必須僅命名視圖中某一表的列。即使從理論上講也是可更新的,不允許使用UNION ALL的視圖,這是因?yàn)?,在?shí)施中將使用臨時(shí)表來(lái)處理它們。
對(duì)于多表可更新視圖,如果是將其插入單個(gè)表中,INSERT能夠工作。不支持DELETE。
對(duì)于可更新視圖,可給定WITH CHECK OPTION子句來(lái)防止插入或更新行,除非作用在行上的select_statement中的WHERE子句為“真”。
在關(guān)于可更新視圖的WITH CHECK OPTION子句中,當(dāng)視圖是根據(jù)另一個(gè)視圖定義的時(shí),LOCAL和CASCADED關(guān)鍵字決定了檢查測(cè)試的范圍。LOCAL關(guān)鍵字對(duì)CHECK OPTION進(jìn)行了限制,使其僅作用在定義的視圖上,CASCADED會(huì)對(duì)將進(jìn)行評(píng)估的基表進(jìn)行檢查。如果未給定任一關(guān)鍵字,默認(rèn)值為CASCADED。
在查詢(xún)頁(yè)面用語(yǔ)句創(chuàng)建就可以。
1、打開(kāi)Navicat for MySQL,并登錄到指定數(shù)據(jù)庫(kù)。
2、點(diǎn)擊上方查詢(xún)。
3、點(diǎn)擊新建查詢(xún)。
4、在空白處寫(xiě)上視圖創(chuàng)建語(yǔ)句,點(diǎn)擊左上方執(zhí)行即可。
創(chuàng)建視圖的理想步驟: 一般來(lái)說(shuō),視圖創(chuàng)建可以分為五步走: 第一步:先考慮select語(yǔ)句的編寫(xiě)。我們知道,視圖其實(shí)就是一個(gè)select語(yǔ)句的集合,所以,我們建立視圖的第一步,就是考慮這個(gè)select語(yǔ)句的如何編寫(xiě)。這個(gè)select語(yǔ)句編寫(xiě)的是否合理,執(zhí)行效率的高低直接影響著這個(gè)視圖的性能,在Select語(yǔ)句中,可能還會(huì)有格式的控制、內(nèi)容的編排等等。如在Select語(yǔ)句中,可以把一些字段合并成一個(gè)字段;也可以把相關(guān)的內(nèi)容進(jìn)行倒置等等。這些功能都是Select語(yǔ)句完成的。所以可以這么說(shuō),Select語(yǔ)句的編寫(xiě)是視圖建立的基礎(chǔ)。 第二步:對(duì)這個(gè)Select語(yǔ)句進(jìn)行測(cè)試。當(dāng)我們編寫(xiě)好Select語(yǔ)句之后,就需要在數(shù)據(jù)庫(kù)中執(zhí)行這條語(yǔ)句,看其能否查詢(xún)到我們想要的值。在對(duì) Select語(yǔ)句進(jìn)行測(cè)試的時(shí)候,需要注意一個(gè)問(wèn)題,有時(shí)候Select查詢(xún)語(yǔ)句可以查到準(zhǔn)確的數(shù)據(jù),但是在以這條語(yǔ)句建立視圖的時(shí)候,可能就會(huì)通不過(guò)。 如在一些表之間的連接查詢(xún)的時(shí)候,如果兩個(gè)表中有個(gè)字段名相同,是可以的。因?yàn)樗麄兂俗侄蚊种猓€有表名一起來(lái)定義這個(gè)字段。如A.name與 B.name。這是不算重名的。但是,若在建立視圖的時(shí)候,這就會(huì)被認(rèn)為是重復(fù)的列明,需要對(duì)其中的一個(gè)列名進(jìn)行重定義。這一點(diǎn)在數(shù)據(jù)庫(kù)視圖建立的時(shí)候, 要特別的注意。 第三步:考慮查詢(xún)結(jié)果的準(zhǔn)確性。
視圖創(chuàng)建語(yǔ)法:
create view 視圖名(字段1,字段2...) as
select 字段1,字段2 from 表1
關(guān)于sql
server
sql語(yǔ)句查詢(xún)分頁(yè)數(shù)據(jù)的解決方案:
要求選取
tbllendlist
中
第3000頁(yè)的記錄,每一頁(yè)100條記錄。-------------------------
----------
方法1:
----------
select
top
100
*
from
tbllendlist
where
fldserialno
not
in
(
select
top
300100
fldserialno
from
tbllendlist
order
by
fldserialno
)
order
by
fldserialno
----------
方法2:
----------
select
top
100
*
from
tbllendlist
where
(fldserialno
(select
max(fldserialno)
from
(select
top
300100
fldserialno
from
tbllendlist
order
by
fldserialno)
as
t))
order
by
fldserialno
方法1執(zhí)行速度比較快!
不過(guò),這種做法還是很麻煩,強(qiáng)烈期待微軟發(fā)明新的可分頁(yè)的sql語(yǔ)句來(lái)!?。?!
sql
server
---------------------------------------------------------------------------------
從數(shù)據(jù)庫(kù)表中的第m條記錄開(kāi)始取n條記錄,利用top關(guān)鍵字:注意如果select語(yǔ)句中既有top,又有order
by,則是從排序好的結(jié)果集中選擇:
select
*
from
(
select
top
n
*
from
(select
top
(m
+
n
-
1)
*
from
表名稱(chēng)
order
by
主鍵
desc)
t1
)
t2
order
by
主鍵
asc
例如從表sys_option(主鍵為sys_id)中從10條記錄還是檢索20條記錄,語(yǔ)句如下:
select
*
from
(
select
top
20
*
from
(select
top
29
*
from
sys_option
order
by
sys_id
desc)
t1)
t2
order
by
sys_id
asc
oralce數(shù)據(jù)庫(kù)--------------------------------------------------------------------------------
從數(shù)據(jù)庫(kù)表中第m條記錄開(kāi)始檢索n條記錄
select
*
from
(select
rownum
r,t1.*
from
表名稱(chēng)
t1
where
rownum
m
+
n)
t2
where
t2.r
=
m
例如從表sys_option(主鍵為sys_id)中從10條記錄還是檢索20條記錄,語(yǔ)句如下:
select
*
from
(select
rownum
r,t1.*
from
sys_option
where
rownum
30
)
t2
where
t2.r
=
10
如果你對(duì)oracle數(shù)據(jù)庫(kù)分頁(yè)不是很熟悉的話(huà),本頁(yè)后面有專(zhuān)門(mén)對(duì)oracle分頁(yè)技術(shù)的講解。
my
sql數(shù)據(jù)庫(kù)---------------------------------------------------------------------------------------------
my
sql數(shù)據(jù)庫(kù)最簡(jiǎn)單,是利用mysql的limit函數(shù),limit
[offset,]
rows從數(shù)據(jù)庫(kù)表中m條記錄開(kāi)始檢索n條記錄的語(yǔ)句為:
select
*
from
表名稱(chēng)
limit
m,n
例如從表sys_option(主鍵為sys_id)中從10條記錄還是檢索20條記錄,語(yǔ)句如下:
select
*
from
sys_option
limit
10,20
tag:
racle
racle
server
server
server
sql
sql
使用示例
使用示例
使用示例
檢查選項(xiàng)的使用
mysql是可以基于視圖創(chuàng)建視圖,它會(huì)檢查視圖所依賴(lài)的視圖的規(guī)則
如果再基于v2創(chuàng)建視圖v3,v3沒(méi)有定義檢查選項(xiàng),則此時(shí)向v3中插入數(shù)據(jù)時(shí),不會(huì)檢查是否滿(mǎn)足v3的條件,但是會(huì)檢查是否滿(mǎn)足v2和v1的條件
local選項(xiàng)相比于cascaded,不會(huì)自動(dòng)向上添加選項(xiàng)
如創(chuàng)建一個(gè)視圖,此時(shí)視圖中只包含一條數(shù)據(jù)
例如,現(xiàn)要查詢(xún)每個(gè)學(xué)生選修的課程(多對(duì)多,三張表),將SQL保存到視圖,以后再想查詢(xún),直接select * from 視圖即可