實現(xiàn)SQL Server數(shù)據(jù)庫中的視圖和查詢_第1頁
實現(xiàn)SQL Server數(shù)據(jù)庫中的視圖和查詢_第2頁
實現(xiàn)SQL Server數(shù)據(jù)庫中的視圖和查詢_第3頁
實現(xiàn)SQL Server數(shù)據(jù)庫中的視圖和查詢_第4頁
實現(xiàn)SQL Server數(shù)據(jù)庫中的視圖和查詢_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、1 視圖基本概念一、視圖基本概念1基本表 基本表是獨立存在的表。在SQL Server中創(chuàng)建了一個基本表,那么可以在表中添加記錄,這些記錄存放在硬盤上?!皩W生表”、“課程表”、“成績表”等等,都是基本表。12視圖 視圖看上去同表似乎一模一樣,具有一組命名的字段和數(shù)據(jù)項,但它其實是一個虛擬的表,在物理上并不實際存在。視圖是由查詢數(shù)據(jù)庫表產(chǎn)生的,它限制了用戶能看到和修改的數(shù)據(jù)。視圖一旦定義后,就可以和基本表一樣被查詢、被刪除,也可以在一個視圖基礎上再定義新的視圖。 視圖兼有表和查詢的特點:與查詢相類似的是,視圖可以用來從一個或多個相關聯(lián)的表或視圖中提取有用信息;與表相類似的是,視圖可以用來更新其中

2、的信息,并將更新結(jié)果永久保存在磁盤上。我們可以用視圖使數(shù)據(jù)暫時從數(shù)據(jù)庫中分離成為游離數(shù)據(jù),以便在主系統(tǒng)之外收集和修改數(shù)據(jù)。2二、視圖的優(yōu)缺點 當對通過視圖看到的數(shù)據(jù)進行修改時,相應的基本表的數(shù)據(jù)也要發(fā)生變化,同時,若基本表的數(shù)據(jù)發(fā)生變化,則這種變化也可以自動地反映到視圖中。 視圖有很多優(yōu)點,主要表現(xiàn)在: 1、視點集中 視圖集中即是使用戶只關心它感興趣的某些特定數(shù)據(jù)和他們所負責的特定任務。這樣通過只允許用戶看到視圖中所定義的數(shù)據(jù)而不是視圖引用表中的數(shù)據(jù)而提高了數(shù)據(jù)的安全性。3 2、簡化操作 視圖大大簡化了用戶對數(shù)據(jù)的操作。因為在定義視圖時,若視圖本身就是一個復雜查詢的結(jié)果集,這樣在每一次執(zhí)行相同

3、的查詢時,不必重新寫這些復雜的查詢語句,只要一條簡單的查詢視圖語句即可??梢娨晥D向用戶隱藏了表與表之間的復雜的連接操作。 3、定制數(shù)據(jù) 視圖能夠?qū)崿F(xiàn)讓不同的用戶以不同的方式看到不同或相同的數(shù)據(jù)集。因此,當有許多不同水平的用戶共用同一數(shù)據(jù)庫時,這顯得極為重要。4 4、合并分割數(shù)據(jù) 在有些情況下,由于表中數(shù)據(jù)量太大,故在表的設計時常將表進行水平分割或垂直分割,但表的結(jié)構(gòu)的變化卻對應用程序產(chǎn)生不良的影響。如果使用視圖就可以重新保持原有的結(jié)構(gòu)關系,從而使外模式保持不變,原有的應用程序仍可以通過視圖來重載數(shù)據(jù)。 5、組合分區(qū)數(shù)據(jù) 用戶可以把來自不同表的兩個或多個查詢結(jié)果組合成單一的結(jié)果集。這在用戶看來是

4、一個單獨的表,稱為分區(qū)視圖。5 6、安全性 視圖可以作為一種安全機制。通過視圖用戶只能查看和修改他們所能看到的數(shù)據(jù)。其它數(shù)據(jù)庫或表既不可見也不可以訪問。如果某一用戶想要訪問視圖的結(jié)果集,必須授予其訪問權(quán)限。視圖所引用表的訪問權(quán)限與視圖權(quán)限的設置互不影響。 7、視圖的缺點 視圖的缺點主要表現(xiàn)在其對數(shù)據(jù)修改的限制上。 6三、使用視圖的場合 1)表的行或列的子集。 2)兩個或多個表的聯(lián)合。 3)兩個或多個表的連接。 4)其他視圖的子集。 5)視圖與表的組合。72 創(chuàng)建視圖 創(chuàng)建視圖時應該注意以下情況: 只能在當前數(shù)據(jù)庫中創(chuàng)建視圖。 視圖中最多只能引用1024列。 如果視圖引用的基表或者視圖被刪除,則

5、該視圖不能再被使用,直到創(chuàng)建新的基表或者視圖。 如果視圖中某一列是函數(shù)、數(shù)學表達式、常量或者來自多個表的列名相同,則必須為列定義名稱。8 當視圖所引用不同基表的列中有相同列名時或者希望給視圖中的列指定新的列名時則需要重新指定列的別名。 不能在視圖上創(chuàng)建索引,不能在規(guī)則、缺省、觸發(fā)器的定義中引用視圖。 當通過視圖查詢數(shù)據(jù)時,SQL Server要檢查以確保語句中涉及的所有數(shù)據(jù)庫對象存在,而且數(shù)據(jù)修改語句不能違反數(shù)據(jù)完整性規(guī)則。 視圖的名稱必須遵循標識符的規(guī)則,且對每個用戶必須是唯一的。此外,該名稱不得與該用戶擁有的任何表的名稱相同。9 注意: 一個視圖可以基于一個或若干個基表,也可以基于一個或若

6、干個視圖,同時也可以基于基表和視圖的混合體。10使用Transact-SQL語言創(chuàng)建視圖 創(chuàng)建視圖的語法格式如下: CREATE VIEW .視圖名(列名,.n) WITH ENCRYPTION|SCHEMABINDING|VIEW_METADATAAS SELECT查詢語句 WITH CHECK OPTION 11參數(shù)說明: (1)視圖名稱必須符合標識符規(guī)則??梢赃x擇是否指定視圖所有者名稱。 (2)CREATE VIEW子句中的列名是視圖中顯示的列名。只有在下列情況下,才必須命名 CREATE VIEW 子句中的列名:當列是從算術表達式、函數(shù)或常量派生的,兩個或更多的列可能會具有相同的名稱(

7、通常是因為聯(lián)接),視圖中的某列被賦予了不同于派生來源列的名稱。當然也可以在 SELECT 語句中指派列名。 注意:如果未指定列名,則視圖列將獲得與 SELECT 語句中的列相同的名稱。 12 (3)定義視圖的語句是一個 SELECT查詢語句。該語句可以使用多個表或其它視圖。若要從創(chuàng)建視圖的 SELECT 子句所引用的對象中選擇,必須具有適當?shù)臋?quán)限。視圖不必是具體某個表的行和列的簡單子集。可以用具有任意復雜性的 SELECT 子句,使用多個表或其它視圖來創(chuàng)建視圖。 (4)在索引視圖定義中,SELECT 語句必須是單個表的語句或帶有可選聚合的多表 JOIN。13 (5)在CREATE VIEW語句

8、中,對于SELECT查詢語句有如下限制: 創(chuàng)建視圖的用戶必須對該視圖所參照或引用的表或視圖具有適當?shù)臋?quán)限。 在查詢語句中,不能包含ORDER BY(如果要包含的話SELECT子句中要用TOP n percent)、COMPUTE或COMPUTE BY關鍵字。也不能包含INTO關鍵字。 不能在臨時表中定義視圖(不能引用臨時表)。14 (6)WITH CHECK OPTION:強制視圖上執(zhí)行的所有數(shù)據(jù)修改語句都必須符合由 SELECT查詢語句設置的準則。通過視圖修改數(shù)據(jù)行時,WITH CHECK OPTION 可確保提交修改后,仍可通過視圖看到修改的數(shù)據(jù)。 (7)WITH ENCRYPTION:表

9、示 SQL Server 加密包含 CREATE VIEW 語句文本的系統(tǒng)表列。使用 WITH ENCRYPTION 可防止將視圖作為 SQL Server 復制的一部分發(fā)布。15 (8)SCHEMABINDING:將視圖綁定到架構(gòu)上。指定 SCHEMABINDING 時,SELECT查詢語句必須包含所引用的表、視圖或用戶定義函數(shù)的兩部分名稱 (owner.object)。不能除去參與用架構(gòu)綁定子句創(chuàng)建的視圖中的表或視圖,除非該視圖已被除去或更改,不再具有架構(gòu)綁定。否則,SQL Server 會產(chǎn)生錯誤。另外,如果對參與具有架構(gòu)綁定的視圖的表執(zhí)行 ALTER TABLE 語句,而這些語句又會影

10、響該架構(gòu)綁定視圖的定義,則這些語句將會失敗 。16 (9)VIEW_METADATA:指定為引用視圖的查詢請求瀏覽模式的元數(shù)據(jù)時,SQL Server 將向 DBLIB、ODBC 和 OLE DB API 返回有關視圖的元數(shù)據(jù)信息,而不是返回基表或表。瀏覽模式的元數(shù)據(jù)是由 SQL Server 向客戶端 DB-LIB、ODBC 和 OLE DB API 返回的附加元數(shù)據(jù),它允許客戶端 API 實現(xiàn)可更新的客戶端游標。瀏覽模式的元數(shù)據(jù)包含有關結(jié)果集內(nèi)的列所屬的基表信息。 對于用 VIEW_METADATA 選項創(chuàng)建的視圖,當描述結(jié)果集中視圖內(nèi)的列時,瀏覽模式的元數(shù)據(jù)返回與基表名相對的視圖名。當用

11、 VIEW_METADATA 創(chuàng)建視圖時,如果該視圖具有 INSERT 或 UPDATE INSTEAD OF 觸發(fā)器,則視圖的所有列(timestamp 除外)都是可更新的。173 管理視圖1、使用系統(tǒng)存儲過程查看視圖信息 sp_help 表/視圖 sp_helptext 表/視圖 sp_depends 表/視圖18 2、使用T-SQL語句修改視圖 ALTER VIEW語句的語法格式為: ALTER VIEW .視圖名(列名,.n) WITHENCRYPTION|SCHEMABINDING|VIEW_METADATAAS SELECT查詢語句 WITH CHECK OPTION參數(shù)說明同CR

12、EATE VIEW相同。 193、使用DROP VIEW刪除視圖 刪除視圖的語法格式如下。 DROP VIEW 視圖名1,視圖名n 使用該語句一次可以刪除多個視圖。204 通過視圖訪問數(shù)據(jù) 使用視圖管理表中的數(shù)據(jù)包括插入、更新和刪除三種操作,在操作時要注意以下幾點: 修改視圖中的數(shù)據(jù)時,可以對基于兩個以上基表或視圖的視圖進行修改,但是不能同時影響兩個或者多個基表,每次修改都只能影響一個基表。 不能修改那些通過計算得到的列,例如年齡和平均分等。 若在創(chuàng)建視圖時定義了 WITH CHECK OPTION選項,那么使用視圖修改基表中的數(shù)據(jù)時,必須保證修改后的數(shù)據(jù)滿足定義視圖的限制條件。21 執(zhí)行UP

13、DATE或DELETE命令時,所更新或刪除的數(shù)據(jù)必須包含在視圖的結(jié)果集中。 如果視圖引用多個表時,無法用DELETE命令刪除數(shù)據(jù)。 如果視圖引用多個表,使用INSERT或UPDATE語句對視圖進行操作時,被插入或更新的列必須屬于同一個表。 視圖的字段來自集合函數(shù),則此視圖不允許修改操作。 若視圖定義中含有GROUP BY 子句,則此視圖不允許修改操作。 若視圖定義中含有DISTINCT短語,則此視圖不允許修改操作。 一個不允許修改操作視圖上定義的視圖,也不允許修改操作。225 SELECT語句SELECT語句能夠從數(shù)據(jù)庫中檢索出符合用戶需求的數(shù)據(jù),并將結(jié)果以表格的形式返回,是SQL Serve

14、r中使用最頻繁的語句之一?;菊Z法格式如下:SELECT 列名1 ,列名2 . INTO 新表名 FROM 表名1 ,表名2 . WHERE 條件 GROUP BY 列名列表 HAVING 條件 ORDER BY 列名列表 ASC | DESC 其中,用 表示可選項。SELECT語句至少包含兩個子句:SELECT和FROM,SELECT子句指定要查詢的指定表中的列,F(xiàn)ROM子句指定查詢的表。23SELECT子句SELECT子句用于指定要返回的列,其完整的語法如下:SELECT ALLDISTINCT TOP n PERCENT 列名 AS 別名別名=表達式 ,.n 24FROM子句只要SELE

15、CT子句有要查詢的列,就必須使用FROM子句指定進行查詢的單個或者多個表。此外,SELECT語句要查詢的數(shù)據(jù)源除了表以外還可以是視圖,視圖相當于一個臨時表,其語法格式如下:FROM 表名|視圖名 ,.n 當有多個數(shù)據(jù)源時,可以使用逗號“,”分隔,但是最多只能有16個數(shù)據(jù)源。數(shù)據(jù)源也可以像列一樣指定別名,該別名只在當前的SELECT語句中起作用,方法為:數(shù)據(jù)源名 AS 別名,或者數(shù)據(jù)源名 別名。指定別名的好處在于以較短的名字代替原本見名知意的長名。25WHERE子句WHERE子句指定查詢的條件,限制返回的數(shù)據(jù)行。其語法格式如下:WHERE 指定條件WHERE子句用于指定搜索條件,過濾不符合查詢條

16、件的數(shù)據(jù)記錄,使用比較靈活且復雜??梢允褂玫臈l件包括比較運算、邏輯運算、范圍、模糊匹配以及未知值等。26一、使用通配符* select * from 表名/視圖名 返回from中指定的表中的所有列。二、使用指定的列 select 列名1,列名2,列名n from 表名/視圖名 返回from中指定的表中的指定列。27三、使用TOP關鍵字 select top n percent 列名四、使用DISTINCT關鍵字 使用DISTINCT關鍵字時, 1、無論遇到多少個空值,只返回一個。 2、表達式只包含一個列名,且不能包含算術表達式。 3、不能包含text、ntext和image類型字段。 4、是s

17、um、avg和count的可選關鍵字。28五、使用計算列六、使用列的別名 1、select 列名1 別名1, 2、select 別名1=列名1, 3、 select 列名1 as 別名1,七、使用SELECT語句進行無數(shù)據(jù)源檢索296 使用WHERE子句 select 列名 from 表名/視圖名 where 說明: 1、中的條件數(shù)目無限制。 2、where子句必須緊跟在from子句的后面。30一、使用比較運算符 用于比較兩個表達式是否滿足條件。用于除text、ntext和image類型外的所有表達式。其結(jié)果返回值是布爾類型,即true或false。二、使用邏輯運算符 三種邏輯運算符:or、a

18、nd和not。31三、使用BETWEEN關鍵字 在where子句中使用BETWEEN關鍵字來限制查詢數(shù)據(jù)的 范圍。 BETWEEN關鍵字的效果可以用含有=的表達式來代替;NOT BETWEEN關鍵字的效果可以用含有 和的表達式來代替。32四、使用IN關鍵字 IN關鍵字用以確定一個給定值是否與子查詢或列表中的值相匹配。 要查詢不在子查詢或列表中的記錄,可以使用NOT IN。注:在where中使用between是記錄的一段取值范圍;使用in是記錄的離散取值范圍。33五、使用LIKE關鍵字34注: 1、一定要把LIKE運算符與=運算符區(qū)別開。通配符只有在LIKE子句中才有意義。 2、萬一要查詢的字符

19、串中包含了通配符作為字符串的一部分,如何處理?假設一個表test的某一列col有以下4個值:xyz%xyzx_yzxyz查找以“X_”開頭的字符串Select col From testWhere col LIKE X_%ESCAPE 357 ORDER BY子句 ORDER BY 列名 ASC|DESC說明: 1、 ASC-升序(默認),DESC-降序 2、不能使用text、ntext和image類型的字段 3、引用列的數(shù)量不能大于select語句中的列的數(shù)量368 使用表的別名 SELECT 表的別名.列名1 ,表的別名.列名2 . FROM 表名 AS 表的別名9 多表查詢 在很多情況下

20、,需要從多個表中提取數(shù)據(jù),組合成一個結(jié)果集。如果一個查詢需要對多個表進行操作,則將此查詢稱為連接查詢。連接查詢包括內(nèi)連接、外連接和交叉連接等。一、內(nèi)連接 內(nèi)連接使用比較運算符(最常使用的是等號,即等值連接),根據(jù)每個表共有列的值匹配兩個表中的行。只有每個表中都存在相匹配列值的記錄才出現(xiàn)在結(jié)果集中。在內(nèi)連接中,所有表是平等的,沒有主次之分。37 1.在where子句中指定連接select 表.查詢列名1,表.查詢列名nfrom 表1,表2where 表1.列名=表2. 列名 2.使用join和on關鍵字指定連接條件select 表.查詢列名1,表.查詢列名nfrom 表1 inner join

21、表2on 表1.列名=表2. 列名 3.內(nèi)連接的條件查詢38二、外連接 與內(nèi)連接相對,參與外連接的表有主次之分。以主表的每一行數(shù)據(jù)去匹配從表中的數(shù)據(jù)列,符合連接條件的數(shù)據(jù)將直接返回到結(jié)果集中,對那些不符合連接條件的列,將被填上NULL值后再返回到結(jié)果集中。 外連接可以分為左連接、右連接和完全連接3種情況。39 1、左連接 將左表中的所有記錄分別與右表中的每條記錄進行組合,結(jié)果集中除返回內(nèi)部連接的記錄以外,還在查詢結(jié)果中返回左表中不符合條件的記錄,并在右表的相應列中填上NULL,由于BIT類型不允許為NULL,就以0值填充。左外連接的語法格式如下: SELECT 列名列表 FROM 表名1 AS

22、 A LEFT OUTER JOIN 表名2 AS B ON A.列名=B.列名40 2、右連接 和左連接類似,右連接是將左表中的所有記錄分別與右表中的每條記錄進行組合,結(jié)果集中除返回內(nèi)部連接的記錄以外,還在查詢結(jié)果中返回右表中不符合條件的記錄,并在左表的相應列中填上NULL,由于BIT類型不允許為NULL,就以0值填充。右連接的語法格式如下: SELECT 列名列表 FROM 表名1 AS A RIGHT OUTER JOIN 表名2 AS B ON A.列名=B.列名41 3、完全連接 完全連接是將左表中的所有記錄分別與右表中的每條記錄進行組合,結(jié)果集中除返回內(nèi)部連接的記錄以外,還在查詢結(jié)

23、果中返回兩個表中不符合條件的記錄,并在左表或右表的相應列中填上NULL,BIT類型以0值填充。全外連接的語法格式如下: SELECT 列名列表 FROM 表名1 AS A FULL OUTER JOIN 表名2 AS B ON A.列名=B.列名42三、 交叉連接 交叉連接的結(jié)果是兩個表的笛卡兒積,在實際應用中一般是沒有意義的,但在數(shù)據(jù)庫的數(shù)學模式上有重要的作用。交叉連接的語法格式如下: SELECT 列名列表 FROM 表名1 CROSS JOIN 表名2或者SELECT 列名列表 FROM 表名1, 表名243四、 連接兩個以上的表五、自連接 自連接就是一個表的兩個副本之間的內(nèi)連接。表名在

24、FROM子句中出現(xiàn)兩次,必須對表指定不同的別名,在SELECT子句中引用的列名也要使用表的別名進行限定。自連接的語法格式如下: select A.列名 B.列名 from 表名 as A 連接方式 join 表名 as B 4410 使用UNION子句 UNION運算符用于將兩個或多個檢索結(jié)果合并成一個結(jié)果,當使用UNION時,需遵循以下兩個規(guī)則。(1)所有查詢中的列數(shù)和列的順序必須相同。(2)所有查詢中按順序?qū)械臄?shù)據(jù)類型必須兼容。4511 使用GROUP BY子句命令格式: SELECT 列名 FROM 表名 GROUP BY ALL 組名46 命令說明: (1)在SELECT語句中所指

25、定的列必須是GROUP BY子句中的列名,或是被聚合函數(shù)所使用的列。 (2)ALL關鍵字,它指定返回由GROUP BY子句產(chǎn)生的所有組,即使某些組沒有符合WHERE子句中指定條件的行。 (3)text、ntext和image類型的列不能用于GROUP BY子句。 (4)分組的列中包含多個NULL時,這些空值將放入一個組中進行顯示。 (5)在GROUP BY子句中必須使用列的名稱。 47使用GROUP BY注意事項: 1、什么時候使用GROUP BY子句? 當需要按某一列數(shù)據(jù)的值進行分類,在分類的基礎上對數(shù)據(jù)進行統(tǒng)計,就需要使用GROUP BY子句。 2、指定GROUP BY時,選擇列表中任一非

26、聚合表達式內(nèi)的所有列都應包含在GROUP BY列表中。 3、選擇列表中的列如果不在聚合函數(shù)里面,就必須在GROUP BY列表里面。否則語法上雖然不會出錯,但是執(zhí)行起來會出錯。48USE pubsGOSELECT type,pub_id, avg(price) FROM titlesgroup by typeGOUSE pubsGOSELECT type,pub_id, avg(price) FROM titlesgroup by type,pub_idorder by 1,2GOERROR!OK!49一、在GROUP BY子句中使用多個列 可以在GROUP BY子句中列出多個列,以實現(xiàn)嵌套分組

27、。二、GROUP BY子句和ALL關鍵字 在包含GROUP BY子句的查詢中可以使用WHERE子句。利用WHERE中的條件可在分組之前消除不符合WHERE條件的行。 在GROUP BY語句中使用ALL關鍵字,只有在SELECT語句中含有WHERE子句時才顯得有意義。 沒有ALL關鍵字,包含GROUP BY子句的SELECT語句將不顯示不符合條件的行的組。如果使用ALL關鍵字,那么查詢結(jié)果將包括由GROUP BY子句產(chǎn)生的所有組,不符合查詢條件的列在使用統(tǒng)計函數(shù)時將返回NULL值。 5012 使用HAVING子句 在包含GROUPBY子句的查詢中可以使用WHERE子句。利用WHERE中的條件可在

28、分組之前消除不符合WHERE條件的行。當完成對數(shù)據(jù)結(jié)果的查詢和統(tǒng)計后,可以使用HAVING關鍵字對查詢和計算的結(jié)果進行進一步的篩選。 注意HAVING和WHERE的區(qū)別: 1、WHERE子句搜索條件在進行分組操作之前應用;而 HAVING 搜索條件在進行分組操作之后應用。 2、HAVING語法與WHERE語法類似,但HAVING可以包含聚合函數(shù)。 3、HAVING子句可以引用選擇列表中出現(xiàn)的任意項。5113 使用COMPUTE和COMPUTE BY子句 使用COMPUTE子句可以在結(jié)果集的最后生成附加的匯總行,因此既可以查看明細行,又可以查看匯總行。命令格式: COMPUTE 函數(shù)(被統(tǒng)計列名

29、) BY (列名) 命令說明: (1)該語句按關鍵字BY后面的列清單實現(xiàn)數(shù)據(jù)的分組匯總。 (2)在COMPUTE或COMPUTE BY子句中,不能包含text、ntext或image數(shù)據(jù)類型。 (3)在COMPUTE后的列名只能出現(xiàn)在聚合函數(shù)中。 (4)不能在使用COMPUTE子句的同時使用SELECT INTO子句。 52當COMPUTE不帶BY子句時,查詢結(jié)果包含:第一個結(jié)果集是包含查詢結(jié)果的所有明細行。第二個結(jié)果集有一行,其中包含COMPUTE子句中所指定的聚合函數(shù)的合計。當COMPUTE與BY一起使用時,COMPUTE子句可以對結(jié)果集進行分組并在每一組之后附加匯總行,符合查詢條件的每個

30、組都包含: 每個組的第一個結(jié)果集是明細行集。 每個組的第二個結(jié)果集有一行,其中包含該組的COMPUTE子句中所指定的聚合函數(shù)的小計。 53使用COMPUTE和COMPUTE BY子句需要注意以下幾點: (1) COMPUTE子句不能和SELECT INTO子句一起使用。 (2) 如果具有ORDER BY子句,列名必須出現(xiàn)在SELECT中。 (3) 聚集函數(shù)不能帶DISTINCT關鍵字。 (4) 如果具有COMPUTE BY子句,必須使用ORDER BY子句;在COMPUTE BY中出現(xiàn)的列,只能等于或者小于ORDER BY的列,且順序要相同。 5414 使用嵌套查詢 在一個SELECT語句中嵌

31、入另一個完整的SELECT語句稱為嵌套查詢。嵌入的SELECT語句稱為子查詢,而包含子查詢的SELECT語句稱為外部查詢。子查詢自身可以包括一個或多個子查詢,也可以嵌套任意數(shù)量的子查詢。但子查詢中返回的數(shù)據(jù)類型是有限制的,它不能使用image和text等數(shù)據(jù)類型,并且子查詢返回的數(shù)據(jù)類型還必須和外部查詢WHERE子句中的數(shù)據(jù)類型相匹配。 子查詢既可以嵌套在SELECT語句中,也可以嵌套在UPDATE、DELETE和INSERT語句中。 55什么是子查詢?子查詢是一個 SELECT 查詢,它返回單個值且嵌套在 SELECT、INSERT、UPDATE、DELETE 語句或其它子查詢中。為什么使用

32、子查詢?把一個復雜的查詢分解成一些系列的邏輯步驟;當一個查詢依賴于另一個查詢時,子查詢會很有用。子查詢產(chǎn)生一個結(jié)果集,我們可以把它看成一個表(派生表),用來代替FROM子句中的表。56一、 使用比較運算符的子查詢 子查詢可由一個比較運算符(:、:、!或=)引入做為比較運算符的條件,子查詢必須返回單個值做為外部查詢中WHERE子句的比較參數(shù)。如果這樣的子查詢返回多個值,服務器將返回錯誤信息。57二、使用IN的子查詢 使用IN(或NOT IN)關鍵字引入子查詢時,允許子查詢返回一列零值或多個結(jié)果值。它判斷IN關鍵字前所指定的列值是否在子查詢的結(jié)果中,IN是嵌套查詢中最常用的關鍵字。 許多查詢都可以

33、通過執(zhí)行一次子查詢并將結(jié)果值代入外部查詢的 WHERE 子句進行評估。 在包括相關子查詢的查詢中,子查詢依靠外部查詢獲得值。這意味著子查詢是重復執(zhí)行的,為外部查詢可能選擇的每一行均執(zhí)行一次。 可以將某些嵌套查詢轉(zhuǎn)化為等價的連接查詢,以提高查詢效率。如果子查詢不可避免,那么要在子查詢中過濾掉盡可能多的行。58三、使用EXISTS的子查詢 使用EXISTS(NOT EXISTS)關鍵字引入一個子查詢時,就相當于進行一次數(shù)據(jù)是否存在的測試。為了便于理解,我們可以把EXISTS想象為一個函數(shù),而子查詢是這個EXISTS函數(shù)的參數(shù)。它的作用是在WHERE子句中測試子查詢返回的行是否存在。EXISTS子查

34、詢實際上不產(chǎn)生任何數(shù)據(jù),它只返回TRUE或FALSE值。 59注意: (1)EXISTS關鍵字前面沒有列名、常量或其他表達式。 (2)EXISTS所采用的嵌套查詢之間的連接不是列之間的關系,而是表之間的關系,它只是測試在子查詢中是否存在符合子查詢中指定條件的行,所以子查詢的選擇列表通常幾乎都是由星號(*)組成,不必列出列名。 (3)事實上服務器在對外部查詢的每一行數(shù)據(jù)處理時都需要進行一次嵌套查詢,但這個嵌套查詢不一定需要執(zhí)行完,只要發(fā)現(xiàn)條件成立,就會退出子查詢。因此從查詢效率考慮,能使用EXISTS的查詢就不要使用IN查詢,能使用連接查詢就不要使用嵌套查詢。60四、用于替代表達式的子查詢附:子

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論