SQL Server 2022數(shù)據(jù)庫技術(shù)項目教程 課件 胡伏湘 項目5-7 數(shù)據(jù)查詢、數(shù)據(jù)庫的編程操作、數(shù)據(jù)庫安全管理_第1頁
SQL Server 2022數(shù)據(jù)庫技術(shù)項目教程 課件 胡伏湘 項目5-7 數(shù)據(jù)查詢、數(shù)據(jù)庫的編程操作、數(shù)據(jù)庫安全管理_第2頁
SQL Server 2022數(shù)據(jù)庫技術(shù)項目教程 課件 胡伏湘 項目5-7 數(shù)據(jù)查詢、數(shù)據(jù)庫的編程操作、數(shù)據(jù)庫安全管理_第3頁
SQL Server 2022數(shù)據(jù)庫技術(shù)項目教程 課件 胡伏湘 項目5-7 數(shù)據(jù)查詢、數(shù)據(jù)庫的編程操作、數(shù)據(jù)庫安全管理_第4頁
SQL Server 2022數(shù)據(jù)庫技術(shù)項目教程 課件 胡伏湘 項目5-7 數(shù)據(jù)查詢、數(shù)據(jù)庫的編程操作、數(shù)據(jù)庫安全管理_第5頁
已閱讀5頁,還剩243頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

項目五數(shù)據(jù)查詢?nèi)蝿?wù)5.1基本數(shù)據(jù)查詢?nèi)蝿?wù)5.2多表連接查詢?nèi)蝿?wù)5.3子查詢132任務(wù)5.1基本數(shù)據(jù)查詢5.1.1簡單數(shù)據(jù)查詢5.1.2統(tǒng)計數(shù)據(jù)查詢從數(shù)據(jù)庫中挑選數(shù)據(jù)需要使用SELECT語句,通過SELECT語句從數(shù)據(jù)庫中挑選出我們需要的數(shù)據(jù)的過程稱為匹配查詢或查詢(query),所以SELECT語句也被稱為查詢語句。SELECT語句是SQL語言中使用最多的、最基本的語句。在上圖所示的bookInfo表中,如果我們只想知道每本書的書名和對應(yīng)的價格,則其他字段上的數(shù)據(jù)可能對我們的觀察造成干擾,甚至看錯某本書的真正價格。此時,我們就可以使用SELECT語句選?。ú樵儯┏鑫覀冃枰淖侄螖?shù)據(jù)。在查詢窗口中輸入以下代碼并執(zhí)行。SELECTBookName,PriceFROMbookInfo執(zhí)行結(jié)果如右圖。由上述操作過程可以總結(jié)出,使用SELECT語句查詢出我們需要的列的格式如下:SELECT<列名1[,列名2…]>FROM<表名>【例5-1】從數(shù)據(jù)表readerInfo中查詢ReaderName列、ReaderSex列、Mobile列和Department列中的數(shù)據(jù)。readerInfo表中的數(shù)據(jù)如圖所示。查詢命令如下:SELECTReaderName,ReaderSex,Mobile,DepartmentFROMreaderInfo查詢結(jié)果如圖所示。說明:(1)SELECT子句中的列名順序可以和表結(jié)構(gòu)中列的順序不同(2)在查詢結(jié)果中,列的排列順序與SELECT子句中列名的排列順序一致在某些特殊情況下,我們確實需要查詢表中所有列的數(shù)據(jù),這時可以在SELECT子句中列出所有列的名字。示例如下:SELECTReaderID,BookID,BorrowDate,Deadline,ReturnDateFROMborrowInfo也可以使用*符號代替所有列名,示例如下:SELECT*FROMborrowInfo查詢結(jié)果如圖所示。在對表進行查詢時,還可以同時使用“別名”代替原來的列名,共有3種方法引入列的別名:(1)列名AS別名。(2)列名別名。(3)別名=列名。這3種方法可以在一個SELECT語句混合使用,如果列不指定別名,則別名就是列名本身?!纠?-2】查詢bookInfo表中的BookID、BookNmae、Publisher、Price等列,并在標題欄中顯示書號、書名、出版社、價格字樣,而不是顯示列名。SELECTBookIDAS書號,Bookname書名,出版社=Publisher,PriceAS價格FROMbookInfo查詢結(jié)果如圖所示。前面的例子都是將表中所有的行(記錄)都選取出來,但在實際工作中,一個表中可能有幾萬甚至幾十萬行記錄,不可能也不需要每次都需要選取出全部記錄,在大部分情況下都是要選取出滿足“圖書類型為計算機”“價格在40元以上”等某些條件的記錄。SELECT語句可以通過WHERE子句來指定查詢記錄的條件,格式如下:SELECT<列名1[,列名2…]>FROM<表名>WHERE<條件表達式>在WHERE子句中可以指定“某個列的值等于特定字符串”或“某個列的值大于一個數(shù)字”等條件。執(zhí)行含有這些條件的SELECT語句,就可以查詢出只符合該條件的記錄了【例5-3】查詢bookInfo表中清華大學(xué)出版社出版的圖書的所有記錄。SELECT*FROMbookInfoWHEREPublisher='清華大學(xué)出版社'查詢結(jié)果如圖所示在WHERE子句中,允許用戶在查詢條件(表達式)中使用各類運算符,過濾掉不滿足要求的數(shù)據(jù)行,只挑選符合要求的數(shù)據(jù)行。運算符包括比1、較運算符:>、>=、=、<、<=、!>、!<、<>、!=2、范圍運算符:BETWEEN…AND和NOTBETWEEN…AND3、列表運算符:IN(項1,項2……)、NOTIN(項1,項2……)4、空值判斷符:ISNULL、ISNOTNULL5、邏輯運算符:NOT、AND、OR6、通配符:百分號%、下劃線_、方括號[]、[^]7、模式匹配符:LIKE、NOTLIKE【例5-4】查詢bookInfo表中2019年以后出版的圖書的BookID、BookName、Writer、PublishDate等列中的數(shù)據(jù)。SELECTBookID,BookName,Writer,PublishDateFROMbookInfoWHEREPublishDate>='2020-01-01'查詢結(jié)果如圖所示【例5-5】查詢2020年出版的圖書,只需要BookID列、BookName列、Publisher列中的數(shù)據(jù)。SELECTBookID,BookName,Publisher,PublishDateFROMbookInfoWHEREPublishDateBETWEEN'2020-01-01'AND'2020-12-31'查詢結(jié)果如圖所示【例5-6】查詢“張”姓作者或“劉”姓作者編寫的書。SELECT*FROMbookInfoWHEREWriterLIKE'張%'ORWriterLIKE'劉%'查詢結(jié)果如圖所示【例5-7】查詢電子工業(yè)出版社出版的所有圖書,以及不是清華大學(xué)出版社出版的但價格高于40元的所有圖書。SELECT*FROMbookInfoWHEREPublisher='電子工業(yè)出版社'ORPublisher<>'清華大學(xué)出版社'ANDPrice>40查詢結(jié)果如圖所示【例5-8】在bookInfo表中查詢Remark列為NULL的記錄的BookID列、BookName列、Price列、Remark列中的內(nèi)容。SELECTBookID,BookName,Price,RemarkFROMbookInfoWHERERemarkISNULL查詢結(jié)果如圖所示【例5-9】在bookInfo表中記錄了每本書的價格(Price)和購買的數(shù)量(BuyCount),查詢所有圖書的書名(BookName)、價格(Price)、購進數(shù)(BuyCount),并計算每種書的總價值。SELECTBookName,Price,BuyCount,Price*BuyCountFROMbookInfo查詢結(jié)果如圖所示為了保證TOP子句查詢結(jié)果的確定性,SQL語言允許SELECT語句使用ORDERBY子句對查詢結(jié)果進行排序。語法格式如下:SELECT[Top(n)]<列名1[,列名2…]>FROM<表名>WHERE<條件表達式>ORDERBY<列名1ASC|DESC[,列名2ASC|DESC…]>說明:(1)當使用ORDERBY子句對SELECT查詢結(jié)果進行排序時,可以選擇升序ASC或降序DESC,升序ASC為默認排序順序,可以省略(2)對于NULL值,SQLServer和MySQL默認它是最小值,ORACLE中默認其為最大值,其他數(shù)據(jù)庫管理系統(tǒng)需要自行測試(3)ORDERBY允許使用SELECT子句中定義的“別名”進行排序?!纠?-10】在bookInfo表查詢BuyCount列中的值大于20的,并且BuyCount列中的值最大的前5種圖書的BookID、BookName、Price、BuyCount、BuyDate等列中的數(shù)據(jù)。SELECTTOP(5)BookID,BookName,Price,BuyCount,BuyDateFROMbookInfoWHEREBuyCount>20ORDERBYBuyCountDESC查詢結(jié)果如圖所示【例5-11】在bookInfo表查詢BuyCount列中的值大于20的,并且BuyCount列中的值最大的前5種圖書的BookID、BookName、Price、BuyCount、BuyDate等列中的數(shù)據(jù)。如果BuyCount列中的值相同,則按照BuyDate列進行升序排序。SELECTTOP(5)BookID,BookName,Price,BuyCount,BuyDateFROMbookInfoWHEREBuyCount>20ORDERBYBuyCountDESC,BuyDate查詢結(jié)果如圖所示SQL語言不僅允許SELECT語句進行簡單的計算,還提供聚合函數(shù)用于復(fù)雜的計算。所謂聚合函數(shù)是用于對多條記錄進行記錄統(tǒng)計、數(shù)據(jù)運算的函數(shù),它對多條記錄進行計算,返回一個值。聚合函數(shù)是SQL標準規(guī)定的,大多數(shù)數(shù)據(jù)庫管理系統(tǒng)都支持使用。聚合函數(shù)主要有COUNT(求記錄數(shù))、SUM(求和)、AVG(求平均值)、MAX(求最大值)、MIN(求最小值)這5個。1.COUNT函數(shù)COUNT函數(shù)的功能是求SELECT語句查詢出來的記錄總數(shù),其格式是COUNT(*)或COUNT(DISTINCT列名)。【例5-12】查詢bookInfo表中的記錄數(shù)。SELECTCOUNT(*)AS記錄數(shù)FROMbookInfo查詢結(jié)果如圖所示【例5-13】查詢作者“胡振華”編寫的圖書的數(shù)量。SELECTcount(*)AS圖書數(shù)FROMbookInfoWHEREWriter='胡振華'查詢結(jié)果如圖所示【例5-14】查詢bookInfo表中有多少個作者。SELECTCOUNT(DISTINCTWriter)AS作者數(shù)FROMbookInfo查詢結(jié)果如圖所示2.SUM函數(shù)SUM函數(shù)用于求某個列的總和,其格式是SUM(列名)。SUM函數(shù)要求列的類型只能是數(shù)值型或貨幣型。在統(tǒng)計時,SUM函數(shù)會自動忽略NULL值。【例5-15】查詢bookInfo表中購買圖書(BuyCount)的總數(shù)。SELECTSUM(BuyCount)AS購進圖書總數(shù)FROMbookInfo查詢結(jié)果如圖所示3.AVG函數(shù)AVG函數(shù)用于求某個列的平均值,其格式是AVG(列名),其要求與SUM函數(shù)相同,也會自動忽略掉NULL值?!纠?-16】查詢bookInfo表中清華大學(xué)出版社出版的圖書的平均價格。SELECTAVG(Price)AS平均價格FROMbookInfoWHEREPublisher='清華大學(xué)出版社'查詢結(jié)果如圖所示4.MAX函數(shù)和MIN函數(shù)MAX函數(shù)和MIN函數(shù)分別用于求某個列的最大值和最小值,其格式分別是MAX(列名)和MIN(列名)。MAX函數(shù)和MIN函數(shù)要求列的類型是可以比較大小的,常見的是數(shù)值型、貨幣型、字符型和日期型。在統(tǒng)計時,MAX函數(shù)和MIN函數(shù)會自動忽略NULL值。【例5-17】查詢bookInfo表中的最大價格和最小價格。SELECTMAX(Price)AS最大價格,MIN(Price)AS最小價格FROMbookInfo查詢結(jié)果如圖所示SQL語言除可以對查詢結(jié)果的全部記錄進行計算以外,還可以根據(jù)指定列進行分組計算,如查詢每個出版社各自出版了幾本書。指定分組依據(jù)的列通過GROUPBY子句完成,完整語法格式如下:SELECT[Top(n)][列名1,列名2…]<聚合函數(shù)1()[,聚合函數(shù)2()…]>FROM<表名>WHERE<條件表達式>GROUPBY<列名1[,列名2…]>ORDERBY<列名1[,列名2…]>說明:(1)SELECT子句中必須有“聚合函數(shù)”。雖然沒有聚合函數(shù)而有GROUPBY子句的語句可以正常執(zhí)行,但此時GROUPBY子句就沒有出現(xiàn)的意義了。(2)SELECT子句中可以有一個或多個“列名”,但這些列名必須在GROUPBY子句中出現(xiàn)過。使用聚合函數(shù)計算的列不受這個限制。(3)SELECT子句中可以為列指定“別名”,但GROUPBY子句中不能使用“別名”來分組。(4)分組計算結(jié)果的返回順序也是隨機的,可以使用ORDERBY子句進行排序,但是ORDERBY子句只能寫在GROUPBY子句的后面,同時ORDERBY子句中的列名也必須在GROUPBY子句中出現(xiàn)過?!纠?-18】查詢bookInfo表中每個出版社出版的圖書的平均價格。SELECTPublisher,AVG(Price)FROMbookInfoGROUPBYPublisher查詢結(jié)果如圖所示如果想查詢平均價格大于45元的圖書,則不能使用WHERE子句,需要使用HAVING子句,HAVING子句必須寫在GROUPBY子句之后、ORDERBY子句之前。格式如下:SELECT[Top(n)][列名1,列名2…]<聚合函數(shù)1()[,聚合函數(shù)2()…]>FROM<表名>WHERE<條件表達式>GROUPBY<列名1[,列名2…]>HAVING聚合函數(shù)表達式ORDERBY<列名1[,列名2…]>【例5-19】查詢bookInfo表中每個出版社出版的圖書的平均價格,返回其中平均價格大于45元的出版社名稱和平均價格。SELECTPublisher,AVG(Price)FROMbookInfoGROUPBYPublisherHAVINGAVG(Price)>45查詢結(jié)果如圖所示任務(wù)5.2多表連接查詢5.2.1交叉連接查詢5.2.2內(nèi)連接查詢5.2.3外連接查詢5.2.4自連接查詢在創(chuàng)建數(shù)據(jù)庫時,由于各方面的原因,所有數(shù)據(jù)不能存放在一個表中。例如,在libsys數(shù)據(jù)庫中,bookinfo表中只存放了圖書名稱、作者等信息,圖書的借閱信息被存放到了borrowinfo表中,讀者的姓名、部門等信息被存放到了readerinfo表中。此時如果想知道某本書被誰借走了,就必須綜合這3個表中的信息才能得到答案。這種情況我們稱為連接查詢。在查詢數(shù)據(jù)時,如果數(shù)據(jù)的來源是數(shù)據(jù)庫中兩個或兩個以上的表,則系統(tǒng)先按照一定的規(guī)則將這些表中的數(shù)據(jù)組合到一起,構(gòu)成一個虛擬的大表,然后就可以像普通表一樣,在這個虛擬表中查詢數(shù)據(jù)了。在通常情況下,多個表之間有著公共的字段或者通過外鍵約束來建立連接關(guān)系。如果兩個表沒有任何相同的字段,則可以通過比較類型相同的兩個列中的值的大小進行查詢。交叉連接又稱笛卡兒積,系統(tǒng)會將一個表中的每條記錄和其他表中的每條記錄分別組合,形成若干條記錄,構(gòu)成一個新的虛擬表。交叉連接查詢的語法格式如下:SELECT列名1[,列名2…]FROM表名1CROSSJOIN表名2[CROSSJOIN表名3…][WHERE查詢條件]【例5-20】在readerInfo表和borrowInfo表的交叉連接中,查詢讀者姓名(ReaderName字段)為“胡大龍”的記錄,只需返回readerInfo表中的ReaderID列和ReaderName列內(nèi)的數(shù)據(jù),以及borrowInfo表中的ReaderID列和BookID列內(nèi)的數(shù)據(jù)。SELECTreaderInfo.ReaderID,ReaderName,borrowInfo.ReaderID,BookIDFROMreaderInfo,borrowinfoWHEREReaderName='胡大龍'查詢結(jié)果如圖所示說明:(1)從第二條到之后的記錄,可以看到借書人的ReaderID字段與胡大龍的ReaderID字段根本不一樣,但數(shù)據(jù)庫依然機械地按照交叉連接的規(guī)則將它們組合到了一起,這樣的數(shù)據(jù)對了解信息根本沒什么用,甚至?xí)礤e誤(2)在交叉連接查詢中,關(guān)鍵字CROSSJOIN可以省略,用逗號代替(3)由于兩個表中都有ReaderID列,因此要以“表名.列名”的形式指定哪個ReaderID列顯示在哪個位置。ReaderName列和BookID列各自只存在于一個表中,就不用通過“表名”進行區(qū)分了。在交叉連接中,由于是沒有限制的,其中一個表的每條記錄都會和另一個表中的每條記錄連接在一起,因此產(chǎn)生的數(shù)據(jù)絕大部分是無效信息。那么如果給記錄的連接加上一個限制,則得到的數(shù)據(jù)就是有效信息了,這就是內(nèi)連接。內(nèi)連接查詢的語法格式如下:SELECT列名1[,列名2…]FROM表名1INNERJOIN表名2ON連接條件[INNERJOIN表名3ON連接條件…][WHERE查詢條件]在內(nèi)連接中,以兩個表為例,如果查詢語句為以下形式:SELECT*FROM表1INNERJOIN表2ON編號=序號查詢結(jié)果如圖所示【例5-21】在readerInfo表和borrowInfo表的內(nèi)連接中,查詢曾經(jīng)借過書的每位讀者的編號、姓名和所借圖書的編號。SELECTreaderInfo.ReaderID,ReaderName,borrowInfo.ReaderID,BookIDFROMreaderInfoINNERJOINborrowInfoONreaderInfo.ReaderID=borrowInfo.ReaderID查詢結(jié)果如圖所示內(nèi)連接是使用最頻繁的連接語句,SQL語言提供了一種簡單寫法:SELECT列名1[,列名2…]FROM表名1,表名2[,表名3…]WHERE查詢條件【例5-23】通過readerInfo、borrowInfo、bookInfo這3個表,查詢每位讀者都曾經(jīng)借過哪些圖書。SELECTR.ReaderID,ReaderName,B1.BookID,BookNameFROMreaderInfoR,borrowInfoB1,bookInfoB2WHERER.ReaderID=B1.ReaderIDANDB1.BookID=B2.BookID查詢結(jié)果如圖所示說明:(1)為了降低書寫表名的難度,F(xiàn)ROM子句中為每個表起了一個“別名”,格式和用法與列的“別名”類似。(2)在這種格式中,如果缺少WHERE子句,就變成了交叉連接語句。(3)SELECT子句中的B1.BookID列也可以使用B2.BookID,查詢結(jié)果不變。這說明borrowInfo表作為連接readerInfo表與bookInfo表的橋梁,可以不返回該表中的任何一個列在SQL中的外連接查詢分為左連接、右連接和全連接,語法格式和內(nèi)連接查詢的語法格式類似,只有一個單詞不同。外連接查詢的語法格式如下:SELECT列名1[,列名2…]FROM表名1LEFT(或RIGHT,或FUll)JOIN表名2ON連接條件[LEFT(或RIGHT,或FUll)JOIN表名3ON連接條件…][WHERE查詢條件]以兩個表為例,如果查詢語句為以下形式:SELECT*FROM表1LEFT(或RIGHT,或FUll)JOIN表2ON編號=序號查詢結(jié)果如圖所示【例5-22】在readerInfo表和borrowInfo表中查詢,要求返回每位讀者的編號、姓名,曾借過書的讀者就返回圖書的編號,沒借過書的讀者就返回NULL。SELECTreaderInfo.ReaderID,ReaderName,BookIDFROMreaderInfoLEFTJOINborrowInfoONreaderInfo.ReaderID=borrowInfo.ReaderID查詢結(jié)果如圖所示在如圖所示的readerInfo表中,如果想查詢哪些讀者的年齡比胡大龍的年齡大,應(yīng)該如何編寫查詢語句?是否可以使用以下語句?SELECTReaderID,ReaderName,ReaderSex,ReaderAge,Department,ReaderType,MobileFROMreaderInfoWHEREReaderAge>39【例5-24】在readerInfo表中,查詢年齡比胡大龍的年齡大的所有讀者的姓名和年齡。思考過程:(1)姓名和年齡都在readerInfo表中,那么如何進行連接查詢呢?可以想象將readerInfo表抄寫兩份,這樣就有兩個表可以連接了。SELECTa.ReaderNamea表中的姓名,a.ReaderAgea表中的年齡,b.ReaderNameb表中的姓名,b.ReaderAgeb表中的年齡FROMreaderInfoa,readerInfob說明:①由于是一個表與自己連接,表名相同,因此為了區(qū)分列的來源,必須為表起別名。②為了便于理解,語句中為每個列也命名了別名。③由于沒有WHERE查詢條件,因此上述語句生成了交叉連接查詢結(jié)果,右圖顯示了查詢結(jié)果的一部分(2)在上述語句的基礎(chǔ)上,加入WHERE查詢條件:SELECTa.ReaderNamea表中的姓名,a.ReaderAgea表中的年齡,b.ReaderNameb表中的姓名,b.ReaderAgeb表中的年齡FROMreaderInfoa,readerInfobWHEREa.ReaderName='胡大龍'可以得到如圖所示的內(nèi)連接查詢結(jié)果(3)在上述語句的基礎(chǔ)上,再加入查詢條件“a表中的年齡<b表中的年齡”,并對查詢的列進行修改,就可以得到最終查詢語句:SELECTb.ReaderName,b.ReaderAgeFROMreaderInfoa,readerInfobWHEREa.ReaderName='胡大龍'ANDa.ReaderAge<b.ReaderAge可以得到如圖所示的內(nèi)連接查詢結(jié)果,這種一個表與自身進行連接查詢的方法被稱為自連接查詢。任務(wù)5.3子查詢和聯(lián)合查詢5.3.1子查詢5.3.2聯(lián)合查詢當數(shù)據(jù)存放在多個表中,想要查詢相關(guān)信息時,除使用連接查詢以外,還可以使用子查詢完成相關(guān)任務(wù)。在大多數(shù)情況下,連接查詢的速度比子查詢的速度快,推薦使用連接查詢。但是,當需要連接的表超過3個時,連接查詢語句的復(fù)雜度太高,不利于Bug修復(fù)和后期維護,此時推薦使用子查詢。使用子查詢實現(xiàn)多表查詢,語句結(jié)構(gòu)更加清晰,編寫相對簡單,更加容易反映查詢的思路。對于任務(wù)5.2中“查詢哪些讀者的年齡比胡大龍的年齡大”的問題,有人提出如果WHERE子句中可以直接使用查詢結(jié)果,就可以寫出以下語句解決問題:SELECTReaderName,ReaderAgeFROMreaderInfoWHEREReaderAge>(查詢胡大龍年齡的SELECT語句)SQL確實支持這種查詢方式,稱為子查詢。上面的查詢語句可以改寫成以下形式:SELECTReaderName,ReaderAgeFROMreaderInfoWHEREReaderAge>(SELECTReaderAgeFROMreaderInfoWHEREReaderName='胡大龍’)當一個SELECT語句被放在其他SQL語句中時,這個SELECT語句就被稱為子查詢。子查詢也被稱為內(nèi)部查詢或內(nèi)部選擇,而包含子查詢的語句也被稱為外部查詢或外部選擇。子查詢語句必須放英文圓括號中。子查詢不能包含COMPUTE或FORBROWSE子句,并且ORDERBY子句只能在子查詢包含TOP子句時出現(xiàn)。SQLServer數(shù)據(jù)庫不支持子查詢包含ntext、text和image數(shù)據(jù)類型的結(jié)果。子查詢可以嵌套在SELECT、INSERT、UPDATE或DELETE語句或其他子查詢語句中。當子查詢嵌套在另一個子查詢中時,SQLServer允許最多32層的子查詢嵌套。SQL允許在任何可以使用表達式的地方使用子查詢。【例5-25】在libsys數(shù)據(jù)庫中查詢借閱了ISBN書號為“9787220976553”的讀者情況。用子查詢實現(xiàn),命令如下:SELECT*FROMreaderInfoWHEREReaderIDIN(SELECTReaderIDFROMborrowInfoWHEREBookID='9787220976553')查詢結(jié)果如圖所示說明:(1)本例中語句的執(zhí)行過程是:先執(zhí)行子查詢語句“SELECTReaderIDFROMborrowInfoWHEREBookID='9787220976553’”其結(jié)果(稱為中間結(jié)果)并不顯示出來,而是作為外部查詢語句“SELECT*FROMreaderInfoWHEREReaderIDIN”

的條件,再執(zhí)行外部查詢,返回運行結(jié)果。(2)由于不清楚子查詢會返回多少個數(shù)據(jù),因此外部查詢語句的WHERE子句只能使用IN運算符,不能使用=運算符?!纠?-26】使用子查詢來查詢圖書《數(shù)據(jù)庫應(yīng)用技術(shù)》目前在哪些讀者手中,要求返回ReaderName、列Department、列Mobile列。分析:(1)先通過bookInfo表查詢到《數(shù)據(jù)庫應(yīng)用技術(shù)》的BookID(2)然后在readerinfo表中通過BookID查詢到當前借閱人員的ReaderID(3)最后才能在borrowInfo表中通過ReaderID查詢到借閱人員的ReaderName、Department、Mobile因此本題要用到3個表才能實現(xiàn)。另外,本題還有一個隱藏條件,即借了未還,這是通過分析用戶需求而得到的結(jié)論。根據(jù)分析得到如下查詢語句SELECTReaderName,Department,MobileFROMreaderInfoWHEREReaderIDIN(SELECTReaderIDFROMborrowInfoWHEREReturnDateISNULLANDBookIDIN(SELECTBookIDFROMbookInfoWHEREBookName='數(shù)據(jù)庫應(yīng)用技術(shù)'))【例5-26】也可以用連接查詢實現(xiàn),語句如下:SELECTReaderName,Department,MobileFROMreaderInfoASr,borrowinfoASb1,bookInfoASb2WHEREr.ReaderID=b1.ReaderIDANDb1.BookID=b2.BookIDANDb2.BookName='數(shù)據(jù)庫應(yīng)用技術(shù)'ANDb1.ReturnDateISNULL查詢結(jié)果如圖所示【例5-27】查詢截止當前時間,最后一個借書的讀者的借書證號(ReaderID)、姓名(ReaderName)、所在部門(Department)。SELECTReaderID,ReaderName,DepartmentFROMreaderInfoWHEREReaderID=(SELECTTOP1ReaderIDFROMborrowInfoORDERBYBorrowDateDESC)查詢結(jié)果如圖所示阿里巴巴工程師的故事SQL提供了UNION和UNIONALL運算符,可以將多個SELECT查詢結(jié)果連接成一個查詢結(jié)果。語法格式如下:SELECT列名列表FROM表名WHERE條件UNIONSELECT列名列表FROM表名WHERE條件[UNIONSELECT列名列表FROM表名WHERE條件…]【例5-28】在readerInfo表中查詢年齡小于35歲的讀者的姓名和年齡,在bookInfo表中查詢購買數(shù)量大于25的圖書的書名和購買數(shù)量,將兩個查詢結(jié)果連接為一個查詢結(jié)果。SELECTReaderName,ReaderAgeFROMreaderInfoWHEREReaderAge<35UNIONALLSELECTBookName,BuyCountFROMbookInfoWHEREBuyCount>25查詢結(jié)果如圖所示。說明:(1)UNION運算符就是機械地將多個SELECT語句的查詢結(jié)果在垂直方向上連接成一個查詢結(jié)果。(2)參與連接的每個查詢結(jié)果的列數(shù)必須相同,數(shù)據(jù)類型必須兼容且順序必須相同。(3)連接生成查詢結(jié)果的列名由第一個SELECT語句決定。(4)當多個查詢結(jié)果中存在完全相等的多個記錄時,UNION運算符會自動去重,只留下一條記錄。UNIONALL運算符不會去重,會將所有記錄保留下來。(5)ORDERBY只能寫在最后一個SELECT語句的后面,并且是對連接結(jié)果中的所有記錄進行排序。UNION運算符最大的用處是將行轉(zhuǎn)換成列。【例5-29】在readerInfo表中,查詢所有讀者年齡的最大值、最小值和平均值,以3行的形式返回。根據(jù)聚合函數(shù)的用法,以前我們只能寫出如下語句:SELECTMAX(ReaderAge)AS最大值,MIN(ReaderAge)AS最小值,AVG(ReaderAge)AS平均值FROMreaderInfo查詢結(jié)果如圖所示,只能在一行中返回所有數(shù)據(jù)。如果要在3行中返回數(shù)據(jù),就可以使用UNION運算符,語句如下:SELECT'平均值'AS類別,AVG(ReaderAge)AS數(shù)據(jù)FROMreaderInfoUNIONSELECT'最大值'AS類別,MAX(ReaderAge)AS數(shù)據(jù)FROMreaderInfoUNIONSELECT'最小值'AS類別,MIN(ReaderAge)AS數(shù)據(jù)FROMreaderInfo查詢結(jié)果如圖所示謝謝觀看!項目六數(shù)據(jù)庫的編程操作任務(wù)6.1建立視圖任務(wù)6.2游標的創(chuàng)建與應(yīng)用任務(wù)6.3存儲過程的創(chuàng)建與管理任務(wù)6.4觸發(fā)器的創(chuàng)建與管理任務(wù)6.5索引與事務(wù)的應(yīng)用12345任務(wù)6.1建立視圖6.1.1創(chuàng)建視圖6.1.2應(yīng)用視圖6.1.3修改視圖建立視圖6.1.1創(chuàng)建視圖視圖View是數(shù)據(jù)庫的另一種對象,與表的級別相同,以表的方式顯示,有列名和若干行數(shù)據(jù)。視圖是一個虛擬表,它的數(shù)據(jù)來源于表(一個或多個表,稱為基表),甚至是視圖,其內(nèi)容由SELECT語句定義。視圖就如同一張表一樣,對表能夠進行的一般操作都可以應(yīng)用于視圖,例如查詢、插入、修改、刪除操作等。任務(wù)6.1建立視圖6.1.1創(chuàng)建視圖

視點集中視圖相當于提供了一個特定的“窗口”,用戶所看到的數(shù)據(jù)只跟用戶的需求有關(guān)系。1234方便操作視圖可以將幾個表的數(shù)據(jù)集中到一起,對該視圖的操作相當于對表操作。數(shù)據(jù)安全通過視圖,用戶只能查詢和修改他們所能見到的數(shù)據(jù),但不能看到其它沒有權(quán)限的數(shù)據(jù)或者敏感信息。定制數(shù)據(jù)視圖能夠?qū)崿F(xiàn)讓不同的用戶以不同的方式看到不同或相同的數(shù)據(jù)集。使用視圖四大優(yōu)點任務(wù)6.1建立視圖6.1.1創(chuàng)建視圖視圖分為兩類:用戶視圖和系統(tǒng)視圖,前者是由用戶建立的,后者是由系統(tǒng)自動建立的,伴隨數(shù)據(jù)庫存在。在系統(tǒng)視圖中,一種以INFORMATION_SCHEMA開頭,視圖名全部用大寫字母表示,表示與系統(tǒng)信息和模式相關(guān),初始記錄為空;還有一種以sys(系統(tǒng))開頭,視圖名全部用小寫字母表示,記錄了當前數(shù)據(jù)庫的數(shù)據(jù)信息。系統(tǒng)視圖不可以修改,用戶視圖不可以修改表結(jié)構(gòu),但可以進行增刪改操作。系統(tǒng)視圖sys.all_objects的記錄內(nèi)容如下圖所示:任務(wù)6.1建立視圖6.1.1創(chuàng)建視圖視圖的創(chuàng)建方法有兩種:一種是使用SSMS管理器窗口,另一種是使用SQL命令。本任務(wù)的例題均以libsys數(shù)據(jù)庫為例。使用SSMS管理器窗口創(chuàng)建視圖主要包括篩選表及字段、輸入條件、設(shè)置視圖名等步驟。任務(wù)6.1建立視圖6.1.1創(chuàng)建視圖例6-1創(chuàng)建視圖View1_bookInfo,其功能是存儲bookInfo表中由電子工業(yè)出版社出版的圖書的編號、名稱、類型、作者姓名、出版單位、銷售價格、采購數(shù)量和庫存數(shù)量。第1步,添加表。在SSMS管理器窗口中依次展開“數(shù)據(jù)庫”→“l(fā)ibsys”節(jié)點,右擊“視圖”節(jié)點,在彈出的快捷菜單中選擇“新建視圖...”命令,在彈出的“添加表”對話框的“表”選項卡中選擇bookInfo表,如圖所示,單擊“添加”按鈕,任務(wù)6.1建立視圖6.1.1創(chuàng)建視圖第2步,選擇視圖包含的列。以粗體格式顯示的列名表示該列為主鍵,*代表全部列。選擇BookID、BookName、BookType、Writer、Publisher、Price、BuyCount、AbleCount共8個列。任務(wù)6.1建立視圖6.1.1創(chuàng)建視圖第3步,設(shè)置篩選表達式。在“Publisher”所在行的“篩選器”文本框中輸入篩選條件“='電子工業(yè)出版社'”。任務(wù)6.1建立視圖6.1.1創(chuàng)建視圖第4步,輸入視圖名,保存視圖。單擊工具欄中的“保存”按鈕,在彈出的“選擇名稱”對話框的“輸入視圖名稱”文本框中輸入視圖名“View1_bookInfo”,然后單擊“確定”按鈕。第5步,顯示視圖的內(nèi)容。在代碼窗口中右擊,在彈出的快捷菜單中選擇“執(zhí)行SQL”命令,或者在“對象資源管理器”窗口中右擊視圖名View1_bookInfo,在彈出的快捷菜單中選擇“選擇前1000行”命令,即可顯示視圖的內(nèi)容。任務(wù)6.1建立視圖6.1.1創(chuàng)建視圖用Transact-SQL命令創(chuàng)建視圖:CREATEVIEW[schema_name.]view_name[(column[,...n])][WITH<view_attribute>[,...n]]ASselect_statement[WITHCHECKOPTION][;]<view_attribute>::={[ENCRYPTION][SCHEMABINDING][VIEW_METADATA]}任務(wù)6.1建立視圖6.1.1創(chuàng)建視圖格式說明:(1)schema_name:視圖所屬架構(gòu)的名稱。(2)view_name:視圖名稱。視圖名稱必須符合有關(guān)標識符的規(guī)則。(3)column:視圖中的列使用的名稱。(4)AS:指定視圖要執(zhí)行的操作。(5)select_statement:定義視圖的SELECT語句,該語句可以使用多個表和其他視圖。(6)WITHCHECKOPTION:對視圖進行UPDATE、INSERT和DELETE操作時,要保證更新、插入或刪除的記錄滿足視圖中SELECT語句的條件表達式。(7)可以使用WITHENCYPTION對存放的CREATEVIEW的文本加密。(8)SCHEMABINDING:將視圖綁定到基礎(chǔ)表的架構(gòu)。(9)VIEW_METADATA:指定為引用視圖的查詢請求瀏覽模式的元數(shù)據(jù)時,SQLServer實例將向DB-Library、ODBC和OLEDBAPI返回有關(guān)視圖的元數(shù)據(jù)信息。任務(wù)6.1建立視圖6.1.1創(chuàng)建視圖例6-2創(chuàng)建視圖View2_TeacherReader,其功能是獲得所有教師讀者的借書證號、姓名、所在部門、讀者類型、聯(lián)系電話和電子郵箱。CREATEVIEWView2_TeacherReaderASSELECTReaderID,ReaderName,Department,ReaderType,Mobile,EmailFROMreaderInfoWHEREReaderType='教師'任務(wù)6.1建立視圖6.1.1創(chuàng)建視圖例6-3創(chuàng)建視圖View3_NoReturnReader,其功能是獲取當前尚未歸還圖書的圖書編號、圖書名稱、讀者姓名、讀者類型、借書日期、應(yīng)歸還日期和實際歸還日期。要求將CREATEVIEW語句的原始文本轉(zhuǎn)換為模糊格式(可以通過WITHENCRYPTION實現(xiàn))。CREATEVIEWView3_NoReturnReaderWITHENCRYPTIONASSELECTbk.BookID,bk.BookName,rd.ReaderName,rd.ReaderType,br.BorrowDate,br.Deadline,br.ReturnDateFROMborrowInfobrINNERJOINbookInfobkONbr.BookID=bk.BookIDINNERJOINreaderInfordONbr.ReaderID=rd.ReaderIDWHEREbr.ReturnDateISNULL任務(wù)6.1建立視圖6.1.2應(yīng)用視圖視圖是一個虛擬表,本身并不存儲數(shù)據(jù),它的數(shù)據(jù)來源于表,因此對視圖的操作實際上就是對表的操作。與表相比,使用視圖對表進行添加記錄、更新記錄和刪除記錄等操作會更加簡潔方便,命令格式與表操作的命令格式相同,只需將表名修改成視圖名即可。只要滿足以下條件,就可以通過視圖修改基表中的數(shù)據(jù):(1)任何修改(包括UPDATE、INSERT和DELETE語句)都只能引用一個基表中的列。(2)視圖中正在修改的列必須直接引用表列中的基礎(chǔ)數(shù)據(jù)。(3)被修改的列不受GROUPBY子句、HAVING子句或DISTINCT子句的影響。(4)在視圖的查詢語句中,TOP子句不能與WITHCHECKOPTION子句一起使用。任務(wù)6.1建立視圖6.1.2應(yīng)用視圖1、通過視圖插入表數(shù)據(jù)例6-4利用例6-1所建立的視圖View1_bookinfo(功能是存儲表bookinfo中電子工業(yè)出版社出版的圖書的相關(guān)信息)向表bookinfo添加一條記錄。INSERTINTOView1_bookInfoVALUES('9787121446795','SpringBoot實用教程','計算機','鄭阿奇','電子工業(yè)出版社',66.5,20,18)任務(wù)6.1建立視圖6.1.2應(yīng)用視圖2、通過視圖更新表記錄使用UPDATE命令通過視圖可以更新基表中的記錄,該命令的要求與INSERT命令的要求相同,命令格式與更新表中記錄的命令格式相同。例6-5利用例6-1所創(chuàng)建的View1_bookInfo視圖修改bookInfo表中的記錄,要求將圖書類型(BookType字段)由“經(jīng)濟管理”修改為“經(jīng)管類”。UPDATEView1_bookInfoSETBookType='經(jīng)管類'WHEREBookType='經(jīng)濟管理'任務(wù)6.1建立視圖6.1.2應(yīng)用視圖3、通過視圖刪除表記錄使用DELETE命令通過視圖可以刪除基表中的記錄,該命令的要求與INSERT命令的要求相同,命令格式與刪除表中記錄的命令格式相同。例6-6利用例6-1所創(chuàng)建的View1_bookInfo視圖刪除bookInfo表中圖書編號是9787121446795的記錄。DELETEFROMView1_bookinfoWHEREBookID='9787121446795'任務(wù)6.1建立視圖6.1.3修改視圖1、修改視圖(1)使用SSMS管理器窗口修改視圖例6-7修改View1_bookInfo視圖,將其功能修改為存儲bookInfo表中由清華大學(xué)出版社出版的圖書的編號、名稱、類型、作者姓名、出版單位和銷售價格。第1步,在SSMS管理器窗口中依次展開“數(shù)據(jù)庫”→“l(fā)ibsys”→“視圖”節(jié)點。第2步,右擊要修改的視圖的名稱View1_bookInfo,在彈出的快捷菜單中選擇“設(shè)計”命令,打開查詢設(shè)計器的圖表窗格。第3步,在查詢設(shè)計器的圖表窗格中,通過以下一種或多種方式修改視圖:任務(wù)6.1建立視圖6.1.3修改視圖勾選要添加的元素的復(fù)選框,或者取消勾選要刪除的元素的復(fù)選框。在圖表窗格中右擊,在彈出的快捷菜單中選擇“添加表”命令,然后在彈出的“添加表”對話框的“表”選項卡中選擇要添加的表,單擊“添加”按鈕,然后關(guān)閉該對話框。系統(tǒng)會自動將該表中的所有列顯示出來,此時可以選擇要添加到視圖的列。右擊要刪除的表的標題欄,在彈出的快捷菜單中選擇“刪除”命令。這里取消BuyCount列和AbleCount列的選中狀態(tài),在“Publisher”所在行的“篩選器”文本框中輸入篩選條件“='清華大學(xué)出版社'”。第4步,單擊工具欄中的“保存”按鈕保存視圖。任務(wù)6.1建立視圖6.1.3修改視圖(2)使用Transact-SQL命令修改視圖ALTERVIEW[schema_name.]view_name[(column[,...n])][WITH<view_attribute>[,...n]]ASselect_statement[WITHCHECKOPTION][;]<view_attribute>::={[ENCRYPTION][SCHEMABINDING][VIEW_METADATA]}任務(wù)6.1建立視圖6.1.3修改視圖例6-8修改View2_TeacherReader視圖,將其功能修改為獲得所有教師讀者的借書證號、姓名、性別、聯(lián)系電話和電子郵箱。第1步,在SSMS管理器窗口中連接到數(shù)據(jù)庫引擎的實例“l(fā)ibsys”。第2步,單擊工具欄中的“新建查詢”按鈕,打開一個新的“查詢編輯器”窗口。第3步,在“查詢編輯器”窗口中輸入以下SQL命令,然后單擊“執(zhí)行”按鈕。ALTERVIEWView2_TeacherReaderASSELECTReaderID,ReaderName,ReaderSex,Mobile,EmailFROMdbo.readerinfoWHERE(ReaderType='教師')任務(wù)6.1建立視圖6.1.3修改視圖3、刪除視圖(1)使用SSMS管理器窗口刪除視圖例6-9刪除視圖View1_bookinfo。第1步,在SSMS管理器窗口中依次展開“數(shù)據(jù)庫”→“l(fā)ibsys”→“視圖”節(jié)點。第2步,右擊要刪除的視圖的名稱View1_bookInfo,在彈出的快捷菜單中選擇“刪除”命令。第3步,在彈出的“刪除對象”對話框中單擊“確定”按鈕。任務(wù)6.1建立視圖6.1.3修改視圖3、刪除視圖(2)使用Transact-SQL命令修改視圖刪除視圖的命令格式如下:DROPVIEW[IFEXISTS][schema_name.]view_name[...,n][;]說明:IFEXISTS:如果視圖存在,則刪除。schema_name:視圖所屬架構(gòu)的名稱。view_name:要刪除的視圖的名稱。任務(wù)6.1建立視圖6.1.3修改視圖例6-10刪除視圖View2_TeacherReader。第1步,在SSMS管理器窗口中連接到數(shù)據(jù)庫引擎的實例“l(fā)ibsys”。第2步,單擊工具欄中的“新建查詢”按鈕,打開一個新的“查詢編輯器”窗口。第3步,在“查詢編輯器”窗口中輸入以下SQL命令,然后單擊“執(zhí)行”按鈕。DROPVIEWView2_TeacherReader任務(wù)6.1任務(wù)6.2游標的創(chuàng)建與應(yīng)用

6.2.1游標的創(chuàng)建6.2.2游標的應(yīng)用6.2.3關(guān)閉與釋放游標游標的創(chuàng)建與應(yīng)用6.2.1游標的創(chuàng)建關(guān)系型數(shù)據(jù)庫中的操作會對整個行集起作用。這種由語句返回的完整行集稱為結(jié)果集,應(yīng)用程序并不總能將整個結(jié)果集作為一個單元進行有效的處理。這些應(yīng)用程序需要一種機制以便每次處理一行或一部分行,游標可以滿足上述要求。游標的基本操作包括創(chuàng)建游標、打開游標、循環(huán)讀取游標、關(guān)閉游標和刪除游標。任務(wù)6.2游標的創(chuàng)建與應(yīng)用6.2.1游標的創(chuàng)建創(chuàng)建游標的命令格式是:DECLAREcursor_nameCURSOR[LOCAL|GLOBAL][FORWARD_ONLY|SCROLL][STATIC|KEYSET|DYNAMIC|FAST_FORWARD][READ_ONLY|SCROLL_LOCKS|OPTIMISTIC][TYPE_WARNING]FORselect_statement[FORUPDATE[OFcolumn_name[,...n]]][;]任務(wù)6.2游標的創(chuàng)建與應(yīng)用6.2.1游標的創(chuàng)建格式說明:(1)cursor_name:游標名稱,游標名稱必須符合有關(guān)標識符的規(guī)則。(2)LOCAL:局部游標。該游標僅在創(chuàng)建它的批處理、存儲過程或觸發(fā)器作用域內(nèi)有效。(3)GLOBAL:全局游標。該游標在當前連接范圍內(nèi)均有效。如果GLOBAL和LOCAL參數(shù)都未指定,由數(shù)據(jù)庫選項中的“默認游標”值(GLOBAL或LOCAL)決定。(4)FORWARD_ONLY:指定游標只能向前移動,并從第一行滾動到最后一行。FETCHNEXT是唯一支持的提取選項。(5)STATIC:指定游標始終以第一次打開時的樣式顯示結(jié)果集,并制作數(shù)據(jù)的臨時副本,供游標使用。(6)KEYSET:指定當游標打開時,游標中行的成員身份和順序已經(jīng)固定。任務(wù)6.2游標的創(chuàng)建與應(yīng)用6.2.1游標的創(chuàng)建(7)DYNAMIC:定義一個游標,無論更改是發(fā)生于游標內(nèi)部還是由游標外的其他用戶執(zhí)行,在你四處滾動游標并提取新紀錄時,該游標均能反映對其結(jié)果集中的行所做的所有數(shù)據(jù)更改。(8)FAST_FORWARD:指定已啟用了性能優(yōu)化的FORWARD_ONLY和READ_ONLY游標。如果還指定了SCROLL或FOR_UPDATE,則無法指定FAST_FORWARD。此類型的游標不允許從游標內(nèi)修改數(shù)據(jù)。(9)READ_ONLY:禁止通過該游標進行更新。無法在UPDATE或DELETE語句的WHERECURRENTOF子句中引用游標。(10)SCROLL_LOCKS:指定通過游標進行的定位更新或刪除一定會成功。任務(wù)6.2游標的創(chuàng)建與應(yīng)用6.2.1游標的創(chuàng)建(11)OPTIMISTIC:指定如果行自讀入游標以來已得到更新,則通過游標進行的定位更新或定位刪除不成功。(12)TYPE_WARNING:指定如果游標從所請求的類型隱式轉(zhuǎn)換為另一種類型,則向客戶端發(fā)送警告消息。(13)select_statement:定義游標結(jié)果集的標SELEC語句。在游標聲明的select_statement中不允許使用關(guān)鍵字COMPUTE、COMPUTEBY、FORBROWSE和INTO。(14)FORUPDATE[OFcolumn_name[,...n]]:定義游標中可更新的列。如果提供了OF<column_name>[,<...n>],則只允許修改所列出的列。如果指定了UPDATE,但未指定列的列表,則除非指定了READ_ONLY并發(fā)選項,否則可以更新所有的列。任務(wù)6.2游標的創(chuàng)建與應(yīng)用6.2.1游標的創(chuàng)建例6-11創(chuàng)建游標book_cursor。第1步,在SSMS管理器窗口中連接到數(shù)據(jù)庫引擎的實例“l(fā)ibsys”。第2步,單擊工具欄中的“新建查詢”按鈕,打開一個新的“查詢編輯器”窗口。第3步,在“查詢編輯器”窗口中輸入以下SQL命令,然后單擊“執(zhí)行”按鈕。USElibsysGODECLAREbook_cursorCURSORFORSELECT*FROMbookinfo;任務(wù)6.2游標的創(chuàng)建與應(yīng)用6.2.2游標的應(yīng)用創(chuàng)建好游標以后,可以使用opencursor_name;打開游標,然后再使用FETCHcursor_name;檢索游標數(shù)據(jù)。1、使用游標提取數(shù)據(jù)FETCH[[NEXT|PRIOR|FIRST|LAST|ABSOLUTE{n|@nvar}|RELATIVE{n|@nvar}]FROM]{{[GLOBAL]cursor_name}|@cursor_variable_name}[INTO@variable_name[,...n]]任務(wù)6.2游標的創(chuàng)建與應(yīng)用6.2.2游標的應(yīng)用(1)NEXT:返回緊跟在當前行之后的結(jié)果行,并將當前行增加到返回的行。如果FETCHNEXT為對游標的第一次提取操作,則返回結(jié)果集中的第一行。NEXT為默認的游標提取選項。(2)PRIOR:返回緊鄰當前行前面的結(jié)果行,并且當前行遞減為返回行。(3)FIRST:返回游標中的第一行并將其作為當前行。(4)LAST:返回游標中的最后一行并將其作為當前行。(5)ABSOLUTE{n|@nvar}:如果n或@nvar為正,則返回從游標起始處開始向后的第n行,并將返回行變成新的當前行。如果n或@nvar為負,則返回從游標末尾處開始向前的第n行,并將返回行變成新的當前行。如果n或@nvar為0,則不返回行。n必須是整數(shù)常量,并且@nvar必須是smallint、tinyint或int。任務(wù)6.2游標的創(chuàng)建與應(yīng)用6.2.2游標的應(yīng)用(6)RELATIVE{n|@nvar}:如果n或@nvar為正,則返回從當前行開始向后的第n行,并將返回行變成新的當前行。如果n或@nvar為負,則返回從當前行開始向前的第n行,并將返回行變成新的當前行。如果n或@nvar為0,則返回當前行。在對游標進行第一次提取時,如果在將n或@nvar設(shè)置為負數(shù)或0的情況下指定FETCHRELATIVE,則不返回行。n必須是整數(shù)常量,并且@nvar必須是smallint、tinyint或int。(7)GLOBAL:指定cursor_name引用全局游標。(8)cursor_name:要從中進行提取的開放游標的名稱。當同時存在以cursor_name作為名稱的全局游標和局部游標時,如果指定GLOBAL,則cursor_name指全局游標,如果未指定GLOBAL,則指局部游標。任務(wù)6.2游標的創(chuàng)建與應(yīng)用6.2.2游標的應(yīng)用(9)@cursor_variable_name:游標變量名,引用要從中進行提取操作的已經(jīng)打開的游標。(10)INTO@variable_name[,...n]:允許將提取操作的列數(shù)據(jù)放到局部變量中。列表中的各個變量從左到右與游標結(jié)果集中的相應(yīng)列相關(guān)聯(lián)。各變量的數(shù)據(jù)類型必須與相應(yīng)的結(jié)果集列的數(shù)據(jù)類型匹配,或是結(jié)果集列數(shù)據(jù)類型所支持的隱式轉(zhuǎn)換。變量的數(shù)目必須與游標選擇列表中的列數(shù)一致。任務(wù)6.2游標的創(chuàng)建與應(yīng)用6.2.2游標的應(yīng)用例6-12利用游標book_cursor每次從bookInfo表中獲取一條記錄。在例6-11所打開的“查詢編輯器”窗口中輸入以下命令:OPENbook_cursor--打開游標FETCHNEXTFROMbook_cursor;--獲取下一條記錄此時顯示bookInfo表中的第一條記錄,當需要顯示下一條記錄時,只需選中上述的“FETCHNEXTFROMbook_cursor;”語句,然后單擊“執(zhí)行”按鈕即可,重復(fù)執(zhí)行該步驟,可以依次顯示bookInfo表中的記錄。任務(wù)6.2游標的創(chuàng)建與應(yīng)用6.2.2游標的應(yīng)用例6-13利用游標逐條讀取讀者信息表中的記錄,每條記錄包括讀者編號、讀者姓名、讀者部門、讀者電話。第1步,在SSMS管理器窗口中連接到數(shù)據(jù)庫引擎的實例“l(fā)ibsys”。第2步,單擊工具欄中的“新建查詢”按鈕,打開一個新的“查詢編輯器”窗口。第3步,在“查詢編輯器”窗口中輸入以下命令,然后單擊“執(zhí)行”按鈕。USElibsysGO--聲明游標DECLAREreader_cursorCURSORFORSELECTReaderID,ReaderName,Department,MobileFROMreaderInfo;--打開游標任務(wù)6.2游標的創(chuàng)建與應(yīng)用6.2.2游標的應(yīng)用OPENreader_cursor--聲明局部變量,用來存儲FETCH語句返回的值DECLARE@idCHAR(10),@nameCHAR(10),@deptVARCHAR(30),@mobileVARCHAR(12);--讀取第一條記錄,把讀取到的數(shù)據(jù)保存到變量中FETCHNEXTFROMreader_cursorINTO@id,@name,@dept,@mobile;--循環(huán)讀取游標結(jié)果集中的記錄print'讀取游標數(shù)據(jù)如下:';任務(wù)6.2游標的創(chuàng)建與應(yīng)用6.2.2游標的應(yīng)用--判斷FETCH語句是否成功,如果成功,則@@fetch_status返回0,否則返回負數(shù)while(@@fetch_status=0)beginprint'借書證號:'+@id+',讀者姓名:'+@name+',所在部門:'+@dept+',聯(lián)系電話:'+@mobile;--繼續(xù)讀取下一條記錄

FETCHNEXTFROMreader_cursorINTO@id,@name,@dept,@mobile;END--關(guān)閉游標CLOSEreader_cursor;任務(wù)6.2游標的創(chuàng)建與應(yīng)用6.2.2游標的應(yīng)用執(zhí)行結(jié)果如下:任務(wù)6.2游標的創(chuàng)建與應(yīng)用6.2.2游標的應(yīng)用2、使用游標更新刪除數(shù)據(jù)(1)使用游標更新數(shù)據(jù)例6-14使用游標逐條將bookInfo表中BookType列內(nèi)的值由“經(jīng)濟管理”修改成“經(jīng)管類”第1步,在SSMS管理器窗口中連接到數(shù)據(jù)庫引擎的實例“l(fā)ibsys”。第2步,單擊工具欄中的“新建查詢”按鈕,打開一個新的“查詢編輯器”窗口。第3步,在“查詢編輯器”窗口中輸入以下命令,然后單擊“執(zhí)行”按鈕。--聲明變量,用來存儲FETCH語句返回的值DECLARE@IdCHAR(20);--聲明游標DECLAREIdCursorCURSORFOR(SELECTBookIDFROMbookInfoWHEREbookType='經(jīng)濟管理')FORUPDATEOFBookType;--打開游標任務(wù)6.2游標的創(chuàng)建與應(yīng)用6.2.2游標的應(yīng)用OPENIdCursor;--獲取游標中的第一條記錄FETCHNEXTFROMIdCursorINTO@Id;--當成功獲取游標中的記錄時,循環(huán)執(zhí)行WHILE@@FETCH_STATUS=0BEGIN--逐條將BookType列中的值由“經(jīng)濟管理”修改成“經(jīng)管類”

UPDATEbookInfoSETBookType='經(jīng)管類'WHEREBookID=@Id;--移動游標到下一條記錄

FETCHNEXTFROMIdCursorINTO@Id;END;CLOSEIdCursor;任務(wù)6.2游標的創(chuàng)建與應(yīng)用6.2.2游標的應(yīng)用(2)使用游標刪除數(shù)據(jù)例6-15使用游標逐條刪除borrowInfo表中ReturnDate列內(nèi)的值為空的記錄。第1步,在SSMS管理器窗口中連接到數(shù)據(jù)庫引擎的實例“l(fā)ibsys”。第2步,單擊工具欄中的“新建查詢”按鈕,打開一個新的“查詢編輯器”窗口。第3步,在“查詢編輯器”窗口中輸入以下命令,然后單擊“執(zhí)行”按鈕。--聲明變量,用來存儲游標獲得的數(shù)據(jù)DECLARE@ReaderIDCHAR(10);DECLARE@BookIDCHAR(20);DECLARE@BorrowDateDATE;--聲明游標,獲取ReturnDate列中的值為空的記錄DECLAREborrowCursorCURSORFORSELECTReaderID,BookID,BorrowDateFROMborrowInfoWHEREReturnDateISNULL;任務(wù)6.2游標的創(chuàng)建與應(yīng)用6.2.2游標的應(yīng)用--打開游標OPENborrowCursor;--獲取游標中的第一條記錄FETCHNEXTFROMborrowCursorINTO@ReaderID,@BookID,@BorrowDate;--當成功獲取游標中的記錄時,循環(huán)執(zhí)行WHILE@@FETCH_STATUS=0BEGIN--逐條刪除歸還日期為空的圖書借閱記錄

DELETEFROMborrowInfoWHEREReaderID=@ReaderIDANDBookID=@bookIdANDBorrowDate=@BorrowDate;--移動游標到下一條記錄FETCHNEXTFROMborrowCursorINTO@ReaderID,@BookID,@BorrowDate;任務(wù)6.2游標的創(chuàng)建與應(yīng)用6.2.2游標的應(yīng)用END;CLOSEborrowCursor;結(jié)果顯示5行受影響。再次查詢borrowInfo表中的所有記錄,發(fā)現(xiàn)查詢結(jié)果中沒有歸還日期為空的記錄。任務(wù)6.2游標的創(chuàng)建與應(yīng)用6.2.3關(guān)閉與釋放游標關(guān)閉游標使用完游標后,需要關(guān)閉游標。關(guān)閉游標的命令格式是:closecursor_name;格式說明:cursor_name表示游標名稱。釋放游標如果游標不再使用,可以釋放游標。釋放游標的命令格式是:deallocatecursor_name;格式說明:cursor_name表示游標名稱。任務(wù)6.2任務(wù)6.3存儲過程的創(chuàng)建與管理6.3.1創(chuàng)建存儲過程6.3.2調(diào)用存儲過程6.3.3管理存儲過程存儲過程的創(chuàng)建與管理6.3.1創(chuàng)建存儲過程存儲過程(StoredProcedure)簡稱過程,就是為了完成一定的功能而編寫的程序段,由一系列SQL語句構(gòu)成,相當于C語言中的函數(shù)或Java語言中的方法,通過調(diào)用存儲過程名來執(zhí)行存儲過程。存儲過程存放在數(shù)據(jù)庫對象中,屬于數(shù)據(jù)庫,與表和視圖的級別相同。任務(wù)6.3存儲過程的創(chuàng)建與管理6.3.1創(chuàng)建存儲過程1、用SSMS管理器窗口創(chuàng)建存儲過程例6-16創(chuàng)建存儲過程P0_GetBookInfoTest,其功能是獲取bookInfo表中指定作者和出版單位的圖書的信息(包括圖書編號、圖書名稱、作者姓名、出版單位和銷售價格)。第1步,在SSMS管理器窗口中依次展開“數(shù)據(jù)庫”→“l(fā)ibsys”→“可編程性”節(jié)點,右擊“存儲過程”節(jié)點,在彈出的快捷菜單中選擇“新建”→“存儲過程”命令,打開包含創(chuàng)建存儲過程的語句的窗口。第2步,在“查詢”菜單中選擇“指定模板參數(shù)的值”命令。任務(wù)6.3存儲過程的創(chuàng)建與

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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

提交評論