




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第 7 章章查詢和視圖查詢和視圖本章學(xué)習(xí)目標(biāo):本章學(xué)習(xí)目標(biāo):q掌握掌握T-SQL作為數(shù)據(jù)定義語(yǔ)言的語(yǔ)法與應(yīng)用作為數(shù)據(jù)定義語(yǔ)言的語(yǔ)法與應(yīng)用q掌握掌握WHERE、ORDER BY、GROUP BY、HAVING子句的使用子句的使用q掌握基本的多表查詢掌握基本的多表查詢q掌握內(nèi)連接、外連接、交叉連接和聯(lián)合查詢的掌握內(nèi)連接、外連接、交叉連接和聯(lián)合查詢的使用使用q掌握多行和單值子查詢的使用掌握多行和單值子查詢的使用q掌握嵌套子查詢的使用掌握嵌套子查詢的使用q了解表的視圖了解表的視圖7.1 連接、選擇和投影連接、選擇和投影nSQL Server 2008是一種關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)是一種關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),
2、在關(guān)系數(shù)據(jù)庫(kù)中,必須提供一種對(duì)二維表進(jìn),在關(guān)系數(shù)據(jù)庫(kù)中,必須提供一種對(duì)二維表進(jìn)行運(yùn)算的機(jī)制。這種機(jī)制除了包括傳統(tǒng)的集合行運(yùn)算的機(jī)制。這種機(jī)制除了包括傳統(tǒng)的集合運(yùn)算中的并、交、差、廣義笛卡爾積以外,還運(yùn)算中的并、交、差、廣義笛卡爾積以外,還包括專(zhuān)門(mén)的關(guān)系運(yùn)算中的選擇、投影和連接。包括專(zhuān)門(mén)的關(guān)系運(yùn)算中的選擇、投影和連接。7.1.1 選擇(Selection)n選擇是單目運(yùn)算,它是按照一定的條件,從關(guān)系R中選擇出滿足條件的行為作為結(jié)果返回。選擇運(yùn)算的操作對(duì)象是一張二維表,其運(yùn)算結(jié)果也是一張二維表。7.1.2 投影(Projection)n投影也是單目運(yùn)算,該運(yùn)算從表中選出指定的屬性值組成一個(gè)新表,7
3、.1.3 連接(JOIN)n把兩個(gè)表中的行按著給定的條件拼接而形成的新表。n連接也稱(chēng)為連接n連接運(yùn)算的含義:從兩個(gè)關(guān)系的笛卡爾積中選取屬性間滿足一定條件的元組nA和B:分別為R和S上度數(shù)相等且可比的屬性組7.2 數(shù)據(jù)查詢語(yǔ)句數(shù)據(jù)查詢語(yǔ)句(SELECT語(yǔ)句語(yǔ)句)n查詢功能是查詢功能是T-SQL的核心,通過(guò)的核心,通過(guò)T-SQL的查詢的查詢可以從表或視圖中迅速、方便地檢索數(shù)據(jù)??梢詮谋砘蛞晥D中迅速、方便地檢索數(shù)據(jù)。nT-SQL的查詢最基本的方式是的查詢最基本的方式是SELECT語(yǔ)句,語(yǔ)句,其功能十分強(qiáng)大。它能夠以任意順序、從任意其功能十分強(qiáng)大。它能夠以任意順序、從任意數(shù)目的列中查詢數(shù)據(jù),并在查詢過(guò)
4、程中進(jìn)行計(jì)數(shù)目的列中查詢數(shù)據(jù),并在查詢過(guò)程中進(jìn)行計(jì)算,甚至能包含來(lái)自其他表的數(shù)據(jù)。算,甚至能包含來(lái)自其他表的數(shù)據(jù)。n我們選取我們選取studentinfo數(shù)據(jù)庫(kù)作為示例數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)作為示例數(shù)據(jù)庫(kù),以下例句均省略打開(kāi)數(shù)據(jù)庫(kù)的以下例句均省略打開(kāi)數(shù)據(jù)庫(kù)的USE studentinfo.nstudentinfo數(shù)據(jù)庫(kù)有三張數(shù)據(jù)表:數(shù)據(jù)庫(kù)有三張數(shù)據(jù)表:student、course和和sc。 nSELECT語(yǔ)句的完整語(yǔ)法格式為:語(yǔ)句的完整語(yǔ)法格式為:SELECT FROM |WHERE |GROUP BY HAVING ORDER BY ASC|DESCn其中的其中的SELECT和和FROM語(yǔ)句為必選子
5、句,而語(yǔ)句為必選子句,而WHERE、ORDER BY和和GROUP BY子句為可選子句為可選子句,要根據(jù)查詢的需要去選用。子句,要根據(jù)查詢的需要去選用。nSELECT語(yǔ)法中各參數(shù)進(jìn)行說(shuō)明:語(yǔ)法中各參數(shù)進(jìn)行說(shuō)明:qSELECT子句:用來(lái)指定由查詢返回的列,并子句:用來(lái)指定由查詢返回的列,并且各列在且各列在SELECT子句中的順序決定了它們?cè)谧泳渲械捻樞驔Q定了它們?cè)诮Y(jié)果表中的順序;結(jié)果表中的順序;qFROM子句:用來(lái)指定數(shù)據(jù)來(lái)源的表;子句:用來(lái)指定數(shù)據(jù)來(lái)源的表;qWHERE子句:用來(lái)限定返回行的搜索條件;子句:用來(lái)限定返回行的搜索條件;qGROUP BY子句:用來(lái)指定查詢結(jié)果的分組條子句:用來(lái)指定
6、查詢結(jié)果的分組條件;件;qORDER BY子句:用來(lái)指定結(jié)果的排序方式。子句:用來(lái)指定結(jié)果的排序方式。nSELECT語(yǔ)句可以寫(xiě)在一行中。但對(duì)于復(fù)雜的查語(yǔ)句可以寫(xiě)在一行中。但對(duì)于復(fù)雜的查詢,詢,SELECT語(yǔ)句隨著查詢子句的增加不斷增長(zhǎng),語(yǔ)句隨著查詢子句的增加不斷增長(zhǎng),一行很難寫(xiě)下,此時(shí)可以采用分行的寫(xiě)法,即每一行很難寫(xiě)下,此時(shí)可以采用分行的寫(xiě)法,即每個(gè)子句分別在不同的行中。需要注意,子句與子個(gè)子句分別在不同的行中。需要注意,子句與子句之間不能使用符號(hào)分隔。句之間不能使用符號(hào)分隔。7.2.1 SELECT語(yǔ)句對(duì)列的查詢語(yǔ)句對(duì)列的查詢n對(duì)列的查詢實(shí)質(zhì)上是對(duì)關(guān)系的對(duì)列的查詢實(shí)質(zhì)上是對(duì)關(guān)系的“投影投影
7、”操作。操作。在很多情況下,用戶只對(duì)表中的一部分列感興在很多情況下,用戶只對(duì)表中的一部分列感興趣,可以使用趣,可以使用SELECT子句來(lái)指明要查詢的列,子句來(lái)指明要查詢的列,并可根據(jù)需要改變輸出列顯示的先后順序。并可根據(jù)需要改變輸出列顯示的先后順序。nT-SQL中對(duì)列的查詢是通過(guò)對(duì)中對(duì)列的查詢是通過(guò)對(duì)SELECT子句中子句中的列名選項(xiàng)進(jìn)行設(shè)置完成的,具體格式為:的列名選項(xiàng)進(jìn)行設(shè)置完成的,具體格式為:SELECT ALL|DISTINCT TOP n PERCENT *|表的名稱(chēng)表的名稱(chēng).*|視圖名稱(chēng)視圖名稱(chēng).* /*選擇表或視圖中的全部列選擇表或視圖中的全部列*/| 列的名稱(chēng)列的名稱(chēng)|列的表達(dá)
8、式列的表達(dá)式 AS 列的別名列的別名 /*選擇指定的列選擇指定的列*/,n1. 查詢一個(gè)表中的全部列查詢一個(gè)表中的全部列n選擇表的全部列時(shí),可以使用星號(hào)選擇表的全部列時(shí),可以使用星號(hào)“*”來(lái)表示所有來(lái)表示所有的列。的列。【例例7-9】檢索檢索students表、表、course表和表和sc表中的所有表中的所有紀(jì)錄。紀(jì)錄。nT-SQL語(yǔ)句為:語(yǔ)句為:USE StuInfoSELECT * FROM studentSELECT * FROM courseSELECT * FROM scn也可以將三個(gè)表的操作合并為一條語(yǔ)句,使結(jié)果在一也可以將三個(gè)表的操作合并為一條語(yǔ)句,使結(jié)果在一個(gè)表中顯示:個(gè)表中顯
9、示:SELECT student.*, course.*, sc.* FROM student, course, sc 2. 查詢一個(gè)表中部分列查詢一個(gè)表中部分列n若查詢數(shù)據(jù)時(shí)要選擇一個(gè)表中的部分列信息,若查詢數(shù)據(jù)時(shí)要選擇一個(gè)表中的部分列信息,則在則在SELECT后給出需要的列即可,各列名之后給出需要的列即可,各列名之間逗號(hào)分隔。間逗號(hào)分隔?!纠?-10】檢索檢索student表中學(xué)生的部分信息,表中學(xué)生的部分信息,包括學(xué)號(hào)、學(xué)生姓名和所屬院系。包括學(xué)號(hào)、學(xué)生姓名和所屬院系。nT-SQL語(yǔ)句為:語(yǔ)句為:SELECT sno, sname, sdept FROM student3. 為列設(shè)置別
10、名為列設(shè)置別名n通常情況下,當(dāng)從一個(gè)表中取出列值時(shí),該值與列的名稱(chēng)通常情況下,當(dāng)從一個(gè)表中取出列值時(shí),該值與列的名稱(chēng)是聯(lián)系在一起的。如上例中從是聯(lián)系在一起的。如上例中從student表中取出學(xué)號(hào)與學(xué)表中取出學(xué)號(hào)與學(xué)生姓名,取出的值就與生姓名,取出的值就與sno和和sname有聯(lián)系。當(dāng)希望查詢有聯(lián)系。當(dāng)希望查詢結(jié)果中的列使用新的名字來(lái)取代原來(lái)的列名稱(chēng)時(shí),可以使結(jié)果中的列使用新的名字來(lái)取代原來(lái)的列名稱(chēng)時(shí),可以使用以下方法:用以下方法:q列名之后使用列名之后使用AS關(guān)鍵字來(lái)更改查詢結(jié)果中的列標(biāo)題名。關(guān)鍵字來(lái)更改查詢結(jié)果中的列標(biāo)題名。如如sno AS 學(xué)號(hào);學(xué)號(hào);q直接在列名后使用列的別名,列的別名可
11、帶雙引號(hào)、單直接在列名后使用列的別名,列的別名可帶雙引號(hào)、單引號(hào)或不帶引號(hào)。引號(hào)或不帶引號(hào)?!纠?-11】檢索檢索student表中學(xué)生的表中學(xué)生的Sno、Sname、Sage和和Sdept,結(jié)果中各列的標(biāo)題分別指定為學(xué)號(hào)、學(xué)生姓名、,結(jié)果中各列的標(biāo)題分別指定為學(xué)號(hào)、學(xué)生姓名、年齡和所屬院系。年齡和所屬院系。nT-SQL語(yǔ)句為:語(yǔ)句為:SELECT sno as 學(xué)生學(xué)號(hào)學(xué)生學(xué)號(hào), sname 學(xué)生姓名學(xué)生姓名, sage 年年齡齡 ,sdept 所屬院系所屬院系 FROM student4. 計(jì)算列值計(jì)算列值n使用使用SELECT語(yǔ)句對(duì)列進(jìn)行查詢時(shí),語(yǔ)句對(duì)列進(jìn)行查詢時(shí),SELECT后可以跟
12、列的表達(dá)式。也就是說(shuō),使用后可以跟列的表達(dá)式。也就是說(shuō),使用SELECT語(yǔ)句不僅可以查詢?cè)瓉?lái)表中已有的列,語(yǔ)句不僅可以查詢?cè)瓉?lái)表中已有的列,還可以通過(guò)計(jì)算得到新的列。還可以通過(guò)計(jì)算得到新的列?!纠?-12】查詢查詢sc表中的學(xué)生成績(jī),并且顯示表中的學(xué)生成績(jī),并且顯示折算后的分?jǐn)?shù)。(折算方法:原始分?jǐn)?shù)折算后的分?jǐn)?shù)。(折算方法:原始分?jǐn)?shù)*1.2)n T-SQL語(yǔ)句為:語(yǔ)句為:SELECT sno,score AS 原始分?jǐn)?shù)原始分?jǐn)?shù), score*1.2 AS 折算后分?jǐn)?shù)折算后分?jǐn)?shù) FROM sc5. 消除結(jié)果中的重復(fù)項(xiàng)消除結(jié)果中的重復(fù)項(xiàng)n在一張完整的關(guān)系數(shù)據(jù)庫(kù)表中不可能出現(xiàn)兩個(gè)完在一張完整的關(guān)系
13、數(shù)據(jù)庫(kù)表中不可能出現(xiàn)兩個(gè)完全相同的紀(jì)錄,但由于我們?cè)诓樵儠r(shí)經(jīng)常只涉及全相同的紀(jì)錄,但由于我們?cè)诓樵儠r(shí)經(jīng)常只涉及表的部分字段,這樣,就有可能出現(xiàn)重復(fù)行,可表的部分字段,這樣,就有可能出現(xiàn)重復(fù)行,可以使用以使用DISTINCT短語(yǔ)可以避免這種情況。短語(yǔ)可以避免這種情況。n關(guān)鍵字關(guān)鍵字DISTINCT的含義是對(duì)結(jié)果中的重復(fù)行只的含義是對(duì)結(jié)果中的重復(fù)行只選擇一個(gè),以保證行的唯一性。選擇一個(gè),以保證行的唯一性?!纠?-13】從從student表中查詢所有的院系信息,表中查詢所有的院系信息,并去掉重復(fù)信息。并去掉重復(fù)信息。n T-SQL語(yǔ)句為:語(yǔ)句為:SELECT DISTINCT sdept FROM
14、 studentn可以看到,可以看到,student表一共只有表一共只有4個(gè)專(zhuān)業(yè)。個(gè)專(zhuān)業(yè)。n與與DISTINCT相反,當(dāng)使用關(guān)鍵字相反,當(dāng)使用關(guān)鍵字ALL時(shí),將保留時(shí),將保留結(jié)果中的所有行。在省略結(jié)果中的所有行。在省略DISTINCT和和ALL的情況的情況下,下,SELECT語(yǔ)句默認(rèn)為語(yǔ)句默認(rèn)為ALL。6. 限制結(jié)果返回的行數(shù)限制結(jié)果返回的行數(shù)n若若SELECT語(yǔ)句返回的結(jié)果行數(shù)非常多,而用戶只需語(yǔ)句返回的結(jié)果行數(shù)非常多,而用戶只需要返回滿足條件的前幾條紀(jì)錄,可以使用要返回滿足條件的前幾條紀(jì)錄,可以使用TOP n PERCENT可選子句。其中可選子句。其中n是一個(gè)正整數(shù),表示返是一個(gè)正整數(shù),表
15、示返回查詢結(jié)果的前回查詢結(jié)果的前n行。若使用行。若使用PERCENT關(guān)鍵字,則關(guān)鍵字,則表示返回結(jié)果的前表示返回結(jié)果的前n%行。行?!纠?-14】查詢查詢student表中前表中前10個(gè)學(xué)號(hào)。個(gè)學(xué)號(hào)。nT-SQL語(yǔ)句為:語(yǔ)句為:SELECT TOP 10 * FROM student執(zhí)行結(jié)果如圖執(zhí)行結(jié)果如圖7-8所示,只返回了所示,只返回了10個(gè)學(xué)生的學(xué)號(hào)。個(gè)學(xué)生的學(xué)號(hào)。 查詢前查詢前10%個(gè)學(xué)生的記錄:個(gè)學(xué)生的記錄: select top 10 percent * from student7.2.2 SELECT語(yǔ)句中的條件查詢語(yǔ)句中的條件查詢n條件查詢是用的最多的一種查詢方式,通過(guò)在條件
16、查詢是用的最多的一種查詢方式,通過(guò)在WHERE子句中設(shè)置查詢條件可以挑選符合需子句中設(shè)置查詢條件可以挑選符合需要的數(shù)據(jù)、修改某一記錄、刪除某一記錄。條要的數(shù)據(jù)、修改某一記錄、刪除某一記錄。條件查詢本質(zhì)是對(duì)表中的數(shù)據(jù)進(jìn)行篩選,即關(guān)系件查詢本質(zhì)是對(duì)表中的數(shù)據(jù)進(jìn)行篩選,即關(guān)系運(yùn)算中的運(yùn)算中的“選擇選擇”操作。操作。n在在SELECT語(yǔ)句中,語(yǔ)句中,WHERE子句必須緊跟在子句必須緊跟在FROM子句后,其基本格式為:子句后,其基本格式為:qWHERE 1. 使用比較運(yùn)算符使用比較運(yùn)算符n我們使用上一章介紹的比較運(yùn)算符來(lái)比較表達(dá)式值的我們使用上一章介紹的比較運(yùn)算符來(lái)比較表達(dá)式值的大小,包括:大小,包括:
17、=(等于等于)、(大于大于)、=(大于大于等于等于)、=(小于等于小于等于)、!=(不等于不等于)、(不等不等于于)、!(不大于不大于)。運(yùn)算結(jié)果為。運(yùn)算結(jié)果為T(mén)RUE或者或者FALSE【例例7-15】在在student表中查詢信息系(表中查詢信息系(IM)的學(xué)生。)的學(xué)生。nT-SQL語(yǔ)句為:語(yǔ)句為:SELECT * FROM student WHERE sdept=IMn顯示的全為信息系的同學(xué)。顯示的全為信息系的同學(xué)。2. 使用邏輯運(yùn)算符使用邏輯運(yùn)算符n邏輯運(yùn)算符包括邏輯運(yùn)算符包括AND、OR和和NOT,用于連接,用于連接WHERE子句中的多個(gè)查詢條件。當(dāng)一條語(yǔ)句中同時(shí)含有多個(gè)邏子句中的多
18、個(gè)查詢條件。當(dāng)一條語(yǔ)句中同時(shí)含有多個(gè)邏輯運(yùn)算符時(shí),取值的優(yōu)先順序?yàn)椋狠嬤\(yùn)算符時(shí),取值的優(yōu)先順序?yàn)椋篘OT、AND和和OR。【例例7-16】在在student表中查詢年齡在小于表中查詢年齡在小于18或者大于或者大于22,并且籍貫是河南的學(xué)生信息。并且籍貫是河南的學(xué)生信息。nT-SQL語(yǔ)句為:語(yǔ)句為:SELECT * FROM student WHERE (sage22) and snativeplace=河南河南n顯示的滿足條件的有三名同學(xué)。顯示的滿足條件的有三名同學(xué)。3. 使用使用LIKE模式匹配模式匹配n在查找記錄時(shí),若不是很適合使用算術(shù)運(yùn)算符和在查找記錄時(shí),若不是很適合使用算術(shù)運(yùn)算符和邏輯
19、運(yùn)算符,則可能要用到更高級(jí)的技術(shù)。邏輯運(yùn)算符,則可能要用到更高級(jí)的技術(shù)。nLIKE是模式匹配運(yùn)算符,用于指出一個(gè)字符串是是模式匹配運(yùn)算符,用于指出一個(gè)字符串是否與指定的字符串相匹配。使用否與指定的字符串相匹配。使用LIKE進(jìn)行匹配時(shí),進(jìn)行匹配時(shí),可以使用通配符,即可以使用模糊查詢??梢允褂猛ㄅ浞?,即可以使用模糊查詢。nT-SQL中使用的通配符有中使用的通配符有“%”、“_”、“ ”和和“”。通配符用在要查找的字符串的旁邊。它。通配符用在要查找的字符串的旁邊。它們可以一起使用,使用其中的一種并不排斥使用們可以一起使用,使用其中的一種并不排斥使用其他的通配符。其他的通配符。q“%”用于字符串的末尾
20、或開(kāi)始處,代表用于字符串的末尾或開(kāi)始處,代表0個(gè)或個(gè)或任意多個(gè)字符。如要查找姓名中有任意多個(gè)字符。如要查找姓名中有“a”的教師,的教師,可以使用可以使用“%a%”,這樣會(huì)查找出姓名中任何,這樣會(huì)查找出姓名中任何位置包含字母位置包含字母“a”的記錄;的記錄;q“_”代表單個(gè)字符。使用代表單個(gè)字符。使用“_a”,將返回任何,將返回任何名字為兩個(gè)字符且第二個(gè)字符是名字為兩個(gè)字符且第二個(gè)字符是“a”的姓名記的姓名記錄;錄;q“ ”允許在指定值的集合或范圍中查找單個(gè)字允許在指定值的集合或范圍中查找單個(gè)字符。如要搜索名字中包含介于符。如要搜索名字中包含介于a-f之間的單個(gè)字之間的單個(gè)字符的記錄,可以使用符
21、的記錄,可以使用LIKE “%a-f%”;q“”與與“”相反,用于指定不屬于范圍內(nèi)的相反,用于指定不屬于范圍內(nèi)的字符。如字符。如abcdef表示不屬于表示不屬于abcdef集合中集合中的字符。的字符。n【例例7-17】在在students表中查詢姓表中查詢姓“趙趙”的的學(xué)生信息。學(xué)生信息。nT-SQL語(yǔ)句為:語(yǔ)句為:nSELECT * FROM student WHERE sname like 趙趙%4. 確定范圍確定范圍nT-SQL中與范圍有關(guān)的關(guān)鍵字有兩個(gè):中與范圍有關(guān)的關(guān)鍵字有兩個(gè):BETWEEN和和IN。n當(dāng)要查詢的條件是某個(gè)值的范圍時(shí),使用當(dāng)要查詢的條件是某個(gè)值的范圍時(shí),使用BETW
22、EENAND來(lái)指出查詢范圍。其中,來(lái)指出查詢范圍。其中,AND的左的左端給出查詢范圍的下限,端給出查詢范圍的下限,AND的右端給出查詢范圍的上限。的右端給出查詢范圍的上限?!纠?-18】在在sc表中,查詢成績(jī)?cè)诒碇?,查詢成?jī)?cè)?0到到80分的學(xué)生情況分的學(xué)生情況nT-SQL語(yǔ)句為:語(yǔ)句為:nSELECT * FROM sc WHERE grade between 60 and 80n關(guān)鍵字關(guān)鍵字IN用來(lái)表示查詢范圍屬于指定的集合。集合中列出用來(lái)表示查詢范圍屬于指定的集合。集合中列出所有可能的值,當(dāng)表中的值與集合中的任意一個(gè)值匹配時(shí),所有可能的值,當(dāng)表中的值與集合中的任意一個(gè)值匹配時(shí),即滿足條
23、件。即滿足條件?!纠?-19】在在student表中查詢表中查詢IM系和系和CAST系同學(xué)的情況。系同學(xué)的情況。nT-SQL語(yǔ)句為:語(yǔ)句為:nSELECT * FROM student WHERE sdept IN(CSAT,IM) n該語(yǔ)句等價(jià)于語(yǔ)句:該語(yǔ)句等價(jià)于語(yǔ)句:nSELECT * FROM student WHERE Sdept=CSAT or Sdept=NIMn執(zhí)行結(jié)果如圖執(zhí)行結(jié)果如圖7-13所示所示5. 涉及空值涉及空值NULL的查詢的查詢n值為值為“空空”并非沒(méi)有值,而是一個(gè)特殊的符號(hào)并非沒(méi)有值,而是一個(gè)特殊的符號(hào)“NULL”。一個(gè)字段是否允許為空,需要在。一個(gè)字段是否允許
24、為空,需要在建立表的結(jié)構(gòu)時(shí)設(shè)置。當(dāng)要判斷一個(gè)表達(dá)式的建立表的結(jié)構(gòu)時(shí)設(shè)置。當(dāng)要判斷一個(gè)表達(dá)式的值是否為空值時(shí),使用值是否為空值時(shí),使用IS NULL關(guān)鍵字關(guān)鍵字【例例7-20】查詢?nèi)鄙賳慰瞥煽?jī)的學(xué)生的信息。查詢?nèi)鄙賳慰瞥煽?jī)的學(xué)生的信息。nT-SQL語(yǔ)句為:語(yǔ)句為:SELECT * FROM sc WHERE grade IS NULL7.2.3 ORDER BY子句的使用子句的使用n利用利用ORDER BY子句可以對(duì)查詢的結(jié)果按照指定字段進(jìn)子句可以對(duì)查詢的結(jié)果按照指定字段進(jìn)行排序。行排序。nORDER BY子句格式為:子句格式為:ORDER BY 排序表達(dá)式排序表達(dá)式 ASC|DESCn其中其中
25、ASC代表升序,代表升序,DESC表示降序,默認(rèn)時(shí)為升序排列。表示降序,默認(rèn)時(shí)為升序排列。對(duì)數(shù)據(jù)類(lèi)型為對(duì)數(shù)據(jù)類(lèi)型為T(mén)EXT、NTEXT和和IMAGE的字段不能使用的字段不能使用ORDER BY進(jìn)行排序。進(jìn)行排序。【例例7-21】查詢查詢student表中全體女學(xué)生的情況,要求結(jié)果表中全體女學(xué)生的情況,要求結(jié)果按照年齡降序排列。按照年齡降序排列。nT-SQL語(yǔ)句為:語(yǔ)句為:SELECT * FROM student WHERE ssex=N女女 ORDER BY sage DESC7.2.4 GROUP BY子句的使用子句的使用n在在T-SQL中經(jīng)常使用聚合函數(shù)和中經(jīng)常使用聚合函數(shù)和GROUP
26、BY子句來(lái)實(shí)現(xiàn)統(tǒng)計(jì)計(jì)算。子句來(lái)實(shí)現(xiàn)統(tǒng)計(jì)計(jì)算。n1. 聚合函數(shù)聚合函數(shù)n聚合函數(shù)用于處理單個(gè)列中所選的全部值,并生成一個(gè)結(jié)果值。聚合函數(shù)用于處理單個(gè)列中所選的全部值,并生成一個(gè)結(jié)果值。n常用的聚合函數(shù)有:常用的聚合函數(shù)有:【例例7-22】 統(tǒng)計(jì)查詢統(tǒng)計(jì)查詢student表中學(xué)生的總?cè)藬?shù)。表中學(xué)生的總?cè)藬?shù)。nT-SQL語(yǔ)句為:語(yǔ)句為:SELECT COUNT(*) FROM student 【例例7-23】查詢選修查詢選修01課程學(xué)生的最高分,最課程學(xué)生的最高分,最低分和平均分低分和平均分nT-SQL語(yǔ)句為:語(yǔ)句為:SELECT MAX(grade) as 01課程最高分課程最高分,MIN(gra
27、de) as 01課程最低分課程最低分, AVG(grade) as 01課程平均分課程平均分FROM sc WHERE cno=012. GROUP BY子句子句nGROUP BY子句用于對(duì)表或視圖中的數(shù)據(jù)按字段分組,子句用于對(duì)表或視圖中的數(shù)據(jù)按字段分組,還可以利用還可以利用HAVING短語(yǔ)按照一定的條件對(duì)分組后的數(shù)據(jù)短語(yǔ)按照一定的條件對(duì)分組后的數(shù)據(jù)進(jìn)行篩選。進(jìn)行篩選。nGROUP BY子句格式為:子句格式為:GROUP BY ALL 分組表達(dá)式分組表達(dá)式 HAVING 查詢條件查詢條件n需要注意的是,當(dāng)使用需要注意的是,當(dāng)使用HAVING短語(yǔ)指定篩選條件時(shí),短語(yǔ)指定篩選條件時(shí),HAVING
28、短語(yǔ)必須與短語(yǔ)必須與GROUP BY配合使用。配合使用。【例例7-24】求求student表中各個(gè)專(zhuān)業(yè)的學(xué)生人數(shù)。表中各個(gè)專(zhuān)業(yè)的學(xué)生人數(shù)。nT-SQL語(yǔ)句為:語(yǔ)句為:SELECT sdept,COUNT(*) as 學(xué)生人數(shù)學(xué)生人數(shù) FROM studentGROUP BY sdept【例例7-25】查詢查詢sc表中選修了兩門(mén)課并且成績(jī)均不及格的學(xué)表中選修了兩門(mén)課并且成績(jī)均不及格的學(xué)生的學(xué)號(hào)生的學(xué)號(hào)n分析:我們將分析:我們將SC表中的成績(jī)不及格的學(xué)生按照學(xué)號(hào)分組,表中的成績(jī)不及格的學(xué)生按照學(xué)號(hào)分組,對(duì)各個(gè)分組進(jìn)行篩選,找出紀(jì)錄數(shù)大于對(duì)各個(gè)分組進(jìn)行篩選,找出紀(jì)錄數(shù)大于2的學(xué)生學(xué)號(hào),進(jìn)的學(xué)生學(xué)號(hào),
29、進(jìn)行結(jié)果輸出。行結(jié)果輸出。nT-SQL語(yǔ)句為:語(yǔ)句為:SELECT sno FROM sc WHERE score27.2.4 表的連接表的連接(JOIN)n以上我們介紹的都是單表查詢,在實(shí)際應(yīng)用中,以上我們介紹的都是單表查詢,在實(shí)際應(yīng)用中,經(jīng)常需要把兩個(gè)或者多個(gè)表按照給定的條件進(jìn)經(jīng)常需要把兩個(gè)或者多個(gè)表按照給定的條件進(jìn)行連接而形成新的表。行連接而形成新的表。n多表連接使用多表連接使用FROM子句指定多個(gè)表,連接條子句指定多個(gè)表,連接條件指定各列之間(每個(gè)表至少一列)進(jìn)行連接件指定各列之間(每個(gè)表至少一列)進(jìn)行連接的關(guān)系。連接條件中的列必須具有一致的數(shù)據(jù)的關(guān)系。連接條件中的列必須具有一致的數(shù)據(jù)
30、類(lèi)型。類(lèi)型。n在在T-SQL中,連接查詢有兩大類(lèi)實(shí)現(xiàn)形式,一中,連接查詢有兩大類(lèi)實(shí)現(xiàn)形式,一類(lèi)是使用等值連接形式,另一類(lèi)是使用關(guān)鍵字類(lèi)是使用等值連接形式,另一類(lèi)是使用關(guān)鍵字JOIN連接形式。連接形式。1. 等值連接等值連接n等值連接的連接條件是在等值連接的連接條件是在WHERE子句中給出的,子句中給出的,只有滿足連接條件的行才會(huì)出現(xiàn)在查詢結(jié)果中。只有滿足連接條件的行才會(huì)出現(xiàn)在查詢結(jié)果中。這種形式也被稱(chēng)為連接謂詞表示形式,是這種形式也被稱(chēng)為連接謂詞表示形式,是SQL語(yǔ)語(yǔ)言早期的連接形式。言早期的連接形式。n等值連接的連接條件格式:等值連接的連接條件格式:表名表名1.字段名字段名1=表名表名2.字
31、段名字段名2【例例7-26】從從student表和表和sc表中,查詢所有不及表中,查詢所有不及格的學(xué)生的學(xué)號(hào)、學(xué)生姓名、所屬院系、所選的格的學(xué)生的學(xué)號(hào)、學(xué)生姓名、所屬院系、所選的課程號(hào)和成績(jī)。課程號(hào)和成績(jī)。nT-SQL語(yǔ)句為:語(yǔ)句為:SELECT student.sno,sname,sdept,cno,grade FROM student,sc WHERE student.sno=sc.sno and grade60說(shuō)明:說(shuō)明:n本例中,本例中,WHERE子句既有查詢條件(子句既有查詢條件(Grade60),),又有連接條件(又有連接條件(student.Sno=sc.Sno););n連接條件
32、中的兩個(gè)字段稱(chēng)為連接字段,它們必須是具連接條件中的兩個(gè)字段稱(chēng)為連接字段,它們必須是具有一致的數(shù)據(jù)類(lèi)型。如本例中連接字段分別為有一致的數(shù)據(jù)類(lèi)型。如本例中連接字段分別為student表的表的sno字段和字段和sc表中的表中的sno字段;字段;n在單表查詢中,所有的字段都來(lái)自于同一張表,故在在單表查詢中,所有的字段都來(lái)自于同一張表,故在SELECT語(yǔ)句中不需要特別說(shuō)明。但是在多表查詢中,語(yǔ)句中不需要特別說(shuō)明。但是在多表查詢中,有的字段(如有的字段(如sno字段)在幾個(gè)表中都出現(xiàn)了,引用字段)在幾個(gè)表中都出現(xiàn)了,引用時(shí)就必須說(shuō)明其來(lái)自那個(gè)表,否則就可能引起混亂,時(shí)就必須說(shuō)明其來(lái)自那個(gè)表,否則就可能引起
33、混亂,造成語(yǔ)法錯(cuò)誤;造成語(yǔ)法錯(cuò)誤;n連接條件中使用的比較符可以是連接條件中使用的比較符可以是、=、!=、!。當(dāng)比較符為。當(dāng)比較符為“=”時(shí),就是等值時(shí),就是等值連接。連接。2. JOIN關(guān)鍵字連接多個(gè)表關(guān)鍵字連接多個(gè)表nT-SQL擴(kuò)展了連接的形式,引入了擴(kuò)展了連接的形式,引入了JOINON關(guān)鍵字關(guān)鍵字連接形式,從而使表的連接運(yùn)算能力得到了增強(qiáng)。連接形式,從而使表的連接運(yùn)算能力得到了增強(qiáng)。nJOINON關(guān)鍵字放在關(guān)鍵字放在FROM子句中,命令格式如下:子句中,命令格式如下:FROM INNER|LEFT|RIGHT|FULL OUTER JOIN ON n這種連接形式通過(guò)這種連接形式通過(guò)FROM
34、給出連接類(lèi)型,用給出連接類(lèi)型,用JOIN表表示連接,用示連接,用ON短語(yǔ)給出連接條件。短語(yǔ)給出連接條件。nJOIN提供了多種類(lèi)型的連接方法:內(nèi)連接、外連接提供了多種類(lèi)型的連接方法:內(nèi)連接、外連接和交叉連接。它們之間的區(qū)別在于:從相互關(guān)聯(lián)的不和交叉連接。它們之間的區(qū)別在于:從相互關(guān)聯(lián)的不同表中選擇用于連接的行時(shí)所采用的方法不同。同表中選擇用于連接的行時(shí)所采用的方法不同。 內(nèi)連接內(nèi)連接INNER查詢查詢n內(nèi)連接是最常見(jiàn)的一種連接,也被稱(chēng)為普通連接或自內(nèi)連接是最常見(jiàn)的一種連接,也被稱(chēng)為普通連接或自然連接,它是系統(tǒng)默認(rèn)形式,在實(shí)際使用中可以省略然連接,它是系統(tǒng)默認(rèn)形式,在實(shí)際使用中可以省略INNER關(guān)
35、鍵字。關(guān)鍵字。n例例7-26也可以改寫(xiě)成如下形式實(shí)現(xiàn):也可以改寫(xiě)成如下形式實(shí)現(xiàn):SELECT student.sno,sname,sdept,cno,grade FROM student JOIN sc ON student.sno=sc.sno WHERE grade60n使用使用JOINON連接詞替換了上例中的連接詞替換了上例中的WHERE子句子句的連接條件。內(nèi)連接與等值連接效果相同相同,僅當(dāng)?shù)倪B接條件。內(nèi)連接與等值連接效果相同相同,僅當(dāng)兩個(gè)表中都至少有一行符合連接條件時(shí),內(nèi)連接才返兩個(gè)表中都至少有一行符合連接條件時(shí),內(nèi)連接才返回行?;匦?。外連接外連接OUTER查詢查詢n外連接是指連接關(guān)鍵
36、字外連接是指連接關(guān)鍵字JOIN后面表中指定列連接在前一后面表中指定列連接在前一表中指定列的左邊或者右邊,如果兩表中指定列沒(méi)有匹配表中指定列的左邊或者右邊,如果兩表中指定列沒(méi)有匹配行,則返回空值。行,則返回空值。n外連接的結(jié)果不但包含滿足連接條件的行,還包含相應(yīng)表外連接的結(jié)果不但包含滿足連接條件的行,還包含相應(yīng)表中的所有行。外連接有三種形式,其中的中的所有行。外連接有三種形式,其中的OUTER可以省可以省略:略:(1)左外連接()左外連接(LEFT OUTER JOIN或或LEFT JOIN):):包含左邊表的全部行(不管右邊的表中是否存在與它們匹包含左邊表的全部行(不管右邊的表中是否存在與它們
37、匹配的行),以及右邊表中全部滿足條件的行。配的行),以及右邊表中全部滿足條件的行。(2)右外連接()右外連接(RIGHT OUTER JOIN或或RIGHT JOIN):):包含右邊表的全部行(不管左邊的表中是否存在與它們匹包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行),以及左邊表中全部滿足條件的行。配的行),以及左邊表中全部滿足條件的行。(3)全外連接()全外連接(FULL OUTER JOIN或或FULL JOIN):):包含左、右兩個(gè)表的全部行,不管另外一邊的表中是否存包含左、右兩個(gè)表的全部行,不管另外一邊的表中是否存在與它們匹配的行,其實(shí)全外連接將返回兩個(gè)表的所有行。在與它
38、們匹配的行,其實(shí)全外連接將返回兩個(gè)表的所有行。n在現(xiàn)實(shí)生活中,參照完整性約束可以減少對(duì)于全外連接的在現(xiàn)實(shí)生活中,參照完整性約束可以減少對(duì)于全外連接的使用,一般情況下左外連接就足夠了。但當(dāng)在數(shù)據(jù)庫(kù)中沒(méi)使用,一般情況下左外連接就足夠了。但當(dāng)在數(shù)據(jù)庫(kù)中沒(méi)有利用清晰、規(guī)范的約束來(lái)防范錯(cuò)誤數(shù)據(jù)情況下,全外連有利用清晰、規(guī)范的約束來(lái)防范錯(cuò)誤數(shù)據(jù)情況下,全外連接就變得非常有用了,你可以使用它來(lái)清理數(shù)據(jù)庫(kù)中的數(shù)接就變得非常有用了,你可以使用它來(lái)清理數(shù)據(jù)庫(kù)中的數(shù)據(jù)。據(jù)。 【例例7-27】分別用左外連接和右外連接查詢分別用左外連接和右外連接查詢student表表和和sc表中的學(xué)生的表中的學(xué)生的Sno、Cno、Sn
39、ame和和Grade。比。比較查詢結(jié)果的區(qū)別并分析。較查詢結(jié)果的區(qū)別并分析。n左外連接左外連接T-SQL語(yǔ)句為:語(yǔ)句為:SELECT student.sno,cno,sname,gradeFROM student LEFT JOIN sc ON sc.sno=student.snon右外連接右外連接T-SQL語(yǔ)句為:語(yǔ)句為:SELECT student.sno,cno,sname,gradeFROM student RIGHT JOIN sc ON sc.sno=student.sno交叉連接交叉連接(CROSS JOIN)n交叉連接即兩個(gè)表的笛卡爾積,返回結(jié)果是由第一個(gè)表的交叉連接即兩個(gè)表的
40、笛卡爾積,返回結(jié)果是由第一個(gè)表的每行與第二個(gè)表的所有行組合后形成的表,因此,數(shù)據(jù)行每行與第二個(gè)表的所有行組合后形成的表,因此,數(shù)據(jù)行數(shù)等于第一個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二個(gè)表數(shù)等于第一個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)。交叉連接關(guān)鍵字中符合查詢條件的數(shù)據(jù)行數(shù)。交叉連接關(guān)鍵字CROSS JOIN后不跟后不跟ON短語(yǔ)引出的連接條件。短語(yǔ)引出的連接條件。【例例7-28】交叉連接交叉連接student和和sc兩表,查看新表的行數(shù)。兩表,查看新表的行數(shù)。nT-SQL語(yǔ)句為:語(yǔ)句為:SELECT * FROM studentSELECT * FROM scSELECT
41、 student.*,sc.* FROM student CROSS JOIN scn執(zhí)行結(jié)果如圖執(zhí)行結(jié)果如圖7-20所示,可以看到,所示,可以看到,student表有表有239行,行,sc表有表有929行,因此,兩表相乘有行,因此,兩表相乘有222031行。行。7.2.5 子查詢子查詢n在在SELECT查詢語(yǔ)句中,子查詢也稱(chēng)為嵌套查詢,是查詢語(yǔ)句中,子查詢也稱(chēng)為嵌套查詢,是一個(gè)嵌套在一個(gè)嵌套在 SELECT中的查詢語(yǔ)句。處于內(nèi)層的查中的查詢語(yǔ)句。處于內(nèi)層的查詢稱(chēng)為子查詢,處于外層的查詢稱(chēng)為父查詢。任何允詢稱(chēng)為子查詢,處于外層的查詢稱(chēng)為父查詢。任何允許使用表達(dá)式的地方都可以使用子查詢。許使用表
42、達(dá)式的地方都可以使用子查詢。T-SQL語(yǔ)句語(yǔ)句支持子查詢,正是支持子查詢,正是SQL結(jié)構(gòu)化的具體體現(xiàn)。結(jié)構(gòu)化的具體體現(xiàn)。n子查詢子查詢SELECT語(yǔ)句必須放在括號(hào)中,子查詢只返回語(yǔ)句必須放在括號(hào)中,子查詢只返回一行數(shù)據(jù),并且返回的數(shù)據(jù)常常也只有一列??梢杂靡恍袛?shù)據(jù),并且返回的數(shù)據(jù)常常也只有一列。可以用子查詢來(lái)檢查或者設(shè)置變量和列的值,或者用子查詢子查詢來(lái)檢查或者設(shè)置變量和列的值,或者用子查詢來(lái)測(cè)試數(shù)據(jù)行是否存在于來(lái)測(cè)試數(shù)據(jù)行是否存在于WHERE子句中。需要注意子句中。需要注意的是的是ORDER BY子句只能對(duì)最終查詢結(jié)果排序,即子句只能對(duì)最終查詢結(jié)果排序,即在子查詢中的在子查詢中的SELECT
43、語(yǔ)句中不能使用語(yǔ)句中不能使用ORDER BY子子句。句。1. 使用使用IN關(guān)鍵字的子查詢關(guān)鍵字的子查詢n由于子查詢的結(jié)果是記錄的集合,故常使用謂詞由于子查詢的結(jié)果是記錄的集合,故常使用謂詞IN來(lái)實(shí)現(xiàn)。來(lái)實(shí)現(xiàn)。nIN謂詞用于判斷一個(gè)給定值是否在子查詢結(jié)果集謂詞用于判斷一個(gè)給定值是否在子查詢結(jié)果集中。當(dāng)父查詢表達(dá)式與子查詢的結(jié)果集中的某個(gè)中。當(dāng)父查詢表達(dá)式與子查詢的結(jié)果集中的某個(gè)值相等時(shí),返回值相等時(shí),返回TURE,否則返回,否則返回FALSE。同時(shí),。同時(shí),可以在可以在IN關(guān)鍵字之前使用關(guān)鍵字之前使用NOT,表示表達(dá)式的值,表示表達(dá)式的值不在查詢結(jié)果集中。不在查詢結(jié)果集中?!纠?-29】查詢至
44、少有一門(mén)課程不及格的學(xué)生的信息。查詢至少有一門(mén)課程不及格的學(xué)生的信息。nT-SQL語(yǔ)句為:語(yǔ)句為:SELECT * FROM student WHERE sno IN(SELECT sno FROM sc WHERE scoreALL(SELECT grade FROM sc WHERE sno=(SELECT sno FROM student WHERE sname=N王小華王小華)SELECT * FROM sc WHERE grade ANY(SELECT grade FROM sc WHERE sno=(SELECT sno FROM student WHERE sname=N王小華王
45、小華)4. 使用使用EXISTS 的子查詢的子查詢nEXISTS稱(chēng)為存在量詞,稱(chēng)為存在量詞,WHERE子句中使用子句中使用EXISTS表示表示當(dāng)子查詢的結(jié)果非空時(shí),條件為當(dāng)子查詢的結(jié)果非空時(shí),條件為T(mén)RUE,反之則為,反之則為FALSE。EXISTS前面也可以加前面也可以加NOT,表示檢測(cè)條件為,表示檢測(cè)條件為“不存在不存在”。nEXISTS語(yǔ)句與語(yǔ)句與IN非常類(lèi)似,它們都根據(jù)來(lái)自子查詢的數(shù)非常類(lèi)似,它們都根據(jù)來(lái)自子查詢的數(shù)據(jù)子集測(cè)試列的值。不同之處在于,據(jù)子集測(cè)試列的值。不同之處在于,EXISTS使用聯(lián)接將使用聯(lián)接將列的值與子查詢中的列聯(lián)接起來(lái),而列的值與子查詢中的列聯(lián)接起來(lái),而IN不需要聯(lián)
46、接,它直不需要聯(lián)接,它直接根據(jù)一組以逗號(hào)分隔的值進(jìn)行比較。接根據(jù)一組以逗號(hào)分隔的值進(jìn)行比較。【例例7-32】查詢沒(méi)有選修查詢沒(méi)有選修01課程的學(xué)生的信息課程的學(xué)生的信息nT-SQL語(yǔ)句為:語(yǔ)句為:SELECT * FROM student WHERE NOT EXISTS(SELECT * FROM sc WHERE sno=student.sno AND cno=01)7.2.6 SELECT語(yǔ)句的其他子句語(yǔ)句的其他子句n除了上面介紹的除了上面介紹的SELECT語(yǔ)句的主要子句外,語(yǔ)句的主要子句外,SELECT還有還有2個(gè)常用子句:個(gè)常用子句:qINTO子句子句qUNION子句子句使用它們可以
47、實(shí)現(xiàn)更為完備的功能。使用它們可以實(shí)現(xiàn)更為完備的功能。1. INTO子句子句nSELECT語(yǔ)句使用語(yǔ)句使用INTO子句來(lái)表明查詢結(jié)果的去向。子句來(lái)表明查詢結(jié)果的去向。我們?nèi)绻枰獙⒉樵兊玫降慕Y(jié)果存入新的數(shù)據(jù)表中,我們?nèi)绻枰獙⒉樵兊玫降慕Y(jié)果存入新的數(shù)據(jù)表中,這時(shí)就需要使用語(yǔ)句:這時(shí)就需要使用語(yǔ)句:INTO ,來(lái)創(chuàng)建新表,來(lái)創(chuàng)建新表,存儲(chǔ)紀(jì)錄。存儲(chǔ)紀(jì)錄?!纠?-33】將將student表中所有年齡為表中所有年齡為19歲的學(xué)生信息歲的學(xué)生信息存入新表存入新表age19中。中。nT-SQL語(yǔ)句為:語(yǔ)句為:SELECT * INTO age19 FROM student WHERE sage=19GO
48、SELECT * FROM age192. UNION子句子句nT-SQL支持集合的并(支持集合的并(UNION)運(yùn)算,執(zhí)行聯(lián)合查詢。需)運(yùn)算,執(zhí)行聯(lián)合查詢。需要注意的是,參與并運(yùn)算操作的兩個(gè)查詢語(yǔ)句,其結(jié)果應(yīng)要注意的是,參與并運(yùn)算操作的兩個(gè)查詢語(yǔ)句,其結(jié)果應(yīng)具有相同的字段個(gè)數(shù),以及相同的對(duì)應(yīng)字段的數(shù)據(jù)類(lèi)型。具有相同的字段個(gè)數(shù),以及相同的對(duì)應(yīng)字段的數(shù)據(jù)類(lèi)型。n默認(rèn)情況下,默認(rèn)情況下,UNION將從結(jié)果集中刪除重復(fù)的行。如果將從結(jié)果集中刪除重復(fù)的行。如果使用使用 ALL 關(guān)鍵字,那么結(jié)果中將包含所有行而不刪除重關(guān)鍵字,那么結(jié)果中將包含所有行而不刪除重復(fù)的行。復(fù)的行?!纠?-34】查詢查詢CSA
49、T專(zhuān)業(yè)的女學(xué)生和專(zhuān)業(yè)的女學(xué)生和IM專(zhuān)業(yè)的男學(xué)生信息專(zhuān)業(yè)的男學(xué)生信息nT-SQL語(yǔ)句為:語(yǔ)句為:SELECT * FROM student where sdept=CSAT and ssex=女女UNIONSELECT * FROM student where sdept=IM and ssex=男男7.3 視視 圖圖n7.3.1 視圖概述視圖概述q視圖是一種數(shù)據(jù)庫(kù)對(duì)象,它是從一個(gè)或多個(gè)表或視視圖是一種數(shù)據(jù)庫(kù)對(duì)象,它是從一個(gè)或多個(gè)表或視圖中導(dǎo)出的虛表,即它可以從一個(gè)或多個(gè)表中的一圖中導(dǎo)出的虛表,即它可以從一個(gè)或多個(gè)表中的一個(gè)或多個(gè)列中提取數(shù)據(jù),并按照表的組成行和列來(lái)個(gè)或多個(gè)列中提取數(shù)據(jù),并按照表
50、的組成行和列來(lái)顯示這些信息。顯示這些信息。q視圖與真實(shí)的表也有很多類(lèi)似的地方。例如,視圖視圖與真實(shí)的表也有很多類(lèi)似的地方。例如,視圖也是由若干個(gè)字段也是由若干個(gè)字段(列列)和一些記錄組成的,在某些和一些記錄組成的,在某些條件滿足時(shí),還可以通過(guò)視圖來(lái)插入、更改和刪除條件滿足時(shí),還可以通過(guò)視圖來(lái)插入、更改和刪除數(shù)據(jù)。數(shù)據(jù)。n使用視圖有很多優(yōu)點(diǎn),這些優(yōu)點(diǎn)主要如下:使用視圖有很多優(yōu)點(diǎn),這些優(yōu)點(diǎn)主要如下: n(1) 視圖是作為一個(gè)數(shù)據(jù)庫(kù)對(duì)象存在數(shù)據(jù)庫(kù)中的,便于管視圖是作為一個(gè)數(shù)據(jù)庫(kù)對(duì)象存在數(shù)據(jù)庫(kù)中的,便于管理和維護(hù),而且視圖象表一樣還可以用在查詢語(yǔ)句中,從理和維護(hù),而且視圖象表一樣還可以用在查詢語(yǔ)句中,
51、從而簡(jiǎn)化了檢索數(shù)據(jù)的操作。而簡(jiǎn)化了檢索數(shù)據(jù)的操作。n(2) 可以定制允許用戶查看哪些數(shù)據(jù),讓用戶通過(guò)視圖來(lái)可以定制允許用戶查看哪些數(shù)據(jù),讓用戶通過(guò)視圖來(lái)訪問(wèn)表中的特定字段和記錄,而不對(duì)用戶授予直接訪問(wèn)數(shù)訪問(wèn)表中的特定字段和記錄,而不對(duì)用戶授予直接訪問(wèn)數(shù)據(jù)庫(kù)表的權(quán)限。據(jù)庫(kù)表的權(quán)限。n(3) 可以針對(duì)不同的用戶定義不同的視圖,在用戶視圖上可以針對(duì)不同的用戶定義不同的視圖,在用戶視圖上不包括機(jī)密數(shù)據(jù)字段,從而自動(dòng)提供對(duì)機(jī)密數(shù)據(jù)的保護(hù)。不包括機(jī)密數(shù)據(jù)字段,從而自動(dòng)提供對(duì)機(jī)密數(shù)據(jù)的保護(hù)。n(4) 可以使用視圖將數(shù)據(jù)導(dǎo)出到其他的應(yīng)用程序??梢允褂靡晥D將數(shù)據(jù)導(dǎo)出到其他的應(yīng)用程序。n(5) 允許用戶以不同的方
52、式查看數(shù)據(jù),即使在用戶同時(shí)使允許用戶以不同的方式查看數(shù)據(jù),即使在用戶同時(shí)使用相同的數(shù)據(jù)也可如此。用相同的數(shù)據(jù)也可如此。7.3.2 視圖的創(chuàng)建視圖的創(chuàng)建n1. 使用使用SQL Server Management Studio創(chuàng)建視圖創(chuàng)建視圖n2. 使用使用Transact-SQL語(yǔ)句中的語(yǔ)句中的CREATE VIEW命令創(chuàng)建視圖命令創(chuàng)建視圖q使用使用CREATE VIEW語(yǔ)句創(chuàng)建視圖的基本語(yǔ)法形式語(yǔ)句創(chuàng)建視圖的基本語(yǔ)法形式如下:如下:qCREATE VIEW schema_name. view_name (column , ,n ) qWITH ENCRYPTION SCHEMABINDING
53、VIEW_METADATA qAS select_statement ; q WITH CHECK OPTION n例【例【7-30】:選擇表】:選擇表s和和sc中的部分字段和中的部分字段和(name,age,sex,cno,score)記錄來(lái)創(chuàng)建一個(gè)視圖,限記錄來(lái)創(chuàng)建一個(gè)視圖,限制表制表s中的記錄是計(jì)算機(jī)系的記錄集合,視圖定義為中的記錄是計(jì)算機(jī)系的記錄集合,視圖定義為view_s。nT-SQL語(yǔ)句如下:語(yǔ)句如下:nCREATE VIEW view_snAS nSELECT student.sname,student.sage,student.ssex,o,sc.score nFROM stu
54、dent,scnWHERE student.sno=sc.sno AND student.sdept=計(jì)算機(jī)計(jì)算機(jī);7.3.3 視圖的修改、查看和重命名視圖的修改、查看和重命名1. 視圖的修改視圖的修改(1) 使用使用SSMS圖形化界面修改視圖圖形化界面修改視圖在在SSMS圖形化界面中,右擊要修改的視圖,從彈出圖形化界面中,右擊要修改的視圖,從彈出的快捷菜單中選擇的快捷菜單中選擇“修改修改”命令,出現(xiàn)原視圖。該命令,出現(xiàn)原視圖。該視圖與創(chuàng)建視圖時(shí)相同,可以按照創(chuàng)建視圖的方法視圖與創(chuàng)建視圖時(shí)相同,可以按照創(chuàng)建視圖的方法修改視圖。修改視圖。(2) 使用使用T-SQL語(yǔ)句修改視圖語(yǔ)句修改視圖首先必須
55、擁有使用視圖的權(quán)限,然后才能使用首先必須擁有使用視圖的權(quán)限,然后才能使用 ALTER VIEW 語(yǔ)句語(yǔ)句n例【例【7-31】:修改視圖】:修改視圖V_employees(number,name,age),在該視,在該視圖中增加一個(gè)新的字段圖中增加一個(gè)新的字段employees.salary ,并且定義一個(gè)新的字段名稱(chēng)并且定義一個(gè)新的字段名稱(chēng) e_salary。nT-SQL語(yǔ)句如下:語(yǔ)句如下:nALTER VIEW studentscore(sno,sname,sage,cno,score)nASnSELECT student.sno,student.sname,student.sage,o,s
56、c.scorenFROM student,sc where student.sno=sc.sno;2. 查看視圖信息查看視圖信息n(1) 使用使用SSMS圖形化界面查看視圖圖形化界面查看視圖q在在SSMS中,右擊某個(gè)視圖的名稱(chēng),從彈出的快捷中,右擊某個(gè)視圖的名稱(chēng),從彈出的快捷菜單中選擇菜單中選擇“選擇前選擇前1000行行”或或“編輯前編輯前200行行”命令,在命令,在SQL Server圖形化界面中就會(huì)顯示該視圖形化界面中就會(huì)顯示該視圖輸出的相應(yīng)數(shù)據(jù)圖輸出的相應(yīng)數(shù)據(jù)n(2) 捕獲視圖信息捕獲視圖信息n在在sys.Views視圖中,每個(gè)視圖的對(duì)象在該視圖中,每個(gè)視圖的對(duì)象在該sys.Views中對(duì)應(yīng)一行數(shù)據(jù)??梢允褂弥袑?duì)應(yīng)一行數(shù)據(jù)??梢允褂胹ys.Views查查看當(dāng)前數(shù)據(jù)庫(kù)中的所有視圖信息;還可以通過(guò)看當(dāng)前數(shù)據(jù)庫(kù)中的所有視圖信息;還可以通過(guò)sys.all_sql_modules查看
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 有機(jī)蔬菜怎樣種植
- 品牌策劃與營(yíng)銷(xiāo)策略培訓(xùn)材料
- 電子商務(wù)物流時(shí)效分析對(duì)比表
- 婚姻考題復(fù)習(xí)試題含答案
- 三農(nóng)信息采集與共享平臺(tái)建設(shè)方案
- 農(nóng)業(yè)資源整合與可持續(xù)發(fā)展解決方案
- 出版行業(yè)數(shù)字化內(nèi)容管理系統(tǒng)設(shè)計(jì)
- 高效辦公實(shí)踐教程
- 通訊設(shè)備業(yè)5G基站建設(shè)與維護(hù)管理方案
- 農(nóng)業(yè)科技精準(zhǔn)種植與養(yǎng)殖技術(shù)推廣方案
- 2025屆高考英語(yǔ)一輪復(fù)習(xí)應(yīng)用文之申請(qǐng)信課件
- 人教版九年級(jí)上冊(cè)音樂(lè) 1.5中國(guó)人民解放軍軍歌 教案
- DB34-T 4859-2024 農(nóng)村河道清淤規(guī)范
- 【課件】秦統(tǒng)一中國(guó)+課件-2024-2025學(xué)年統(tǒng)編版七年級(jí)歷史上冊(cè)
- 《單片機(jī)項(xiàng)目化教程(C語(yǔ)言版)(第2版)》全套教學(xué)課件
- 陽(yáng)光食品APP培訓(xùn)考核題庫(kù)(含答案)食品生產(chǎn)企業(yè)端
- 高考總復(fù)習(xí)優(yōu)化設(shè)計(jì)二輪用書(shū)英語(yǔ)(新高考)閱讀理解 文體分類(lèi)練3 說(shuō)明文之科普知識(shí)類(lèi)
- 研究大腦可塑性與學(xué)習(xí)記憶機(jī)制
- 外研版英語(yǔ)四年級(jí)下冊(cè)閱讀理解練習(xí)(含答案)
- 2024施工隊(duì)中途退場(chǎng)協(xié)議書(shū)
- JTG-QB-003-2003公路橋涵標(biāo)準(zhǔn)圖鋼筋混凝土蓋板涵
評(píng)論
0/150
提交評(píng)論