SQL Sever第7章 數(shù)據(jù)的查詢_第1頁
SQL Sever第7章 數(shù)據(jù)的查詢_第2頁
SQL Sever第7章 數(shù)據(jù)的查詢_第3頁
SQL Sever第7章 數(shù)據(jù)的查詢_第4頁
SQL Sever第7章 數(shù)據(jù)的查詢_第5頁
已閱讀5頁,還剩42頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第7章數(shù)據(jù)的查詢數(shù)據(jù)查詢是數(shù)據(jù)庫編程中最基礎(chǔ)的一部分,也是最核心的一部分,它是從數(shù)據(jù)庫中檢索符合條件的數(shù)據(jù)記錄的選擇過程?;赥-SQL語言的SQLServer數(shù)據(jù)查詢,其最基本的語句是SELECT語句。SELECT語句的語法結(jié)構(gòu)基本SELECT查詢基于條件的查詢對查詢結(jié)果排序輸出查詢結(jié)果的新建表存儲聚合函數(shù)在查詢中的使用查詢結(jié)果匯總多表連接查詢嵌套查詢小結(jié)7.1SELECT語句的語法結(jié)構(gòu)SELECT語句功能相當(dāng)強(qiáng)大,語法也比較復(fù)雜,為了對SELECT各語句進(jìn)行詳細(xì)講解說明,首先列出SELECT語句的各個(gè)子句。SELECT語句的語法格式如下:SELECTFieldNameList

[ALL|DISTINCT][TOPn[PERCENT]][INTONewTableName]FROMTableNameList

[WHERECondition][ORDERBYOrder_FieldName[ASC|DESC]][GROUPBYGroup_FieldName][HAVINGHavingCondition]7.2基本SELECT查詢通常我們只是使用最基本的SECLECT查詢語句,因此熟知SELECT語句的基本語法顯得十分重要,最基本的SELECT語句格式為:SELECTFieldNameList

[ALL|DISTINCT]FROMTableNameList

7.2.1查詢表中所有的列如果一個(gè)數(shù)據(jù)表中有很多列,但是需要讀取數(shù)據(jù)表中所有列的值,因此如何將數(shù)據(jù)表簡便的顯示出來成為一個(gè)問題,SQL為我們提供了“*”符號,用來代替所有的字段。7.2.2查詢表中指定列的信息從例7.1中可以看出,使用“*”可以很方便地得出表中所有信息,但是更多時(shí)候用戶查詢時(shí)需要的并不是所有列的信息,因此這種效率低下的使用“*”來查詢所以列的方法并不是很好的方法。常用的比較有效的方法是在查詢時(shí)逐一指定所需要查詢的列名。7.2.3在查詢列表中使用列表達(dá)式在SELECT語句中可以使用算術(shù)運(yùn)算符對文字型數(shù)據(jù)列進(jìn)行加、減、乘、除以及取余(%)運(yùn)算,從而構(gòu)造列表達(dá)式來取得經(jīng)過計(jì)算處理過的查詢結(jié)果。7.2.4重新命名結(jié)果列名有些時(shí)候,為了突出數(shù)據(jù)處理后所代表的意義,數(shù)據(jù)查詢的結(jié)果經(jīng)常要指定列名,這樣更利于程序的可讀性和課理解性。并且,在數(shù)據(jù)庫應(yīng)用中常出現(xiàn)以下問題:列的名稱為英文名稱,查詢結(jié)果不易查看,我們想為其起個(gè)中文別名。多表查詢時(shí)出現(xiàn)相同的列名,如果同時(shí)對多個(gè)表進(jìn)行查詢,結(jié)果表中出現(xiàn)相同的列名,容易引起混淆或者不能引用這些列,只能為這些列起個(gè)別名。當(dāng)SELECT子句的選擇列為表達(dá)式時(shí),當(dāng)SELECT子句的選擇列為表達(dá)式時(shí),在查詢結(jié)果中無法顯示,只能為該表達(dá)式起個(gè)別名。SQL語言提供了兩種方法解決這些問題。1.使用AS關(guān)鍵字2.使用“=”7.2.4重新命名結(jié)果列名7.2.5說明列的定義很多時(shí)候,使用SELECT語句查詢的結(jié)果很難閱讀,因?yàn)轱@示出來的數(shù)據(jù)是一些不連貫的信息。為了增加查詢結(jié)果的可讀性,可以在SELECT語句中增加一些說明列,增加的說明文字用單引號引起來。7.2.6取得查詢結(jié)果的部分行集在SQL語句中,我們使用TOP子句限制返回到結(jié)果集中的行數(shù),其語法如下:TOPn[precent]n指定返回的行數(shù)。如果沒有指定precent,n就是返回的行數(shù),如果指定了percent,n就是返回的結(jié)果集行的百分比。7.2.6取得查詢結(jié)果的部分行集7.3基于條件的查詢在實(shí)際查詢中,我們可能要求查詢部分?jǐn)?shù)據(jù)記錄,即根據(jù)給定的查詢條件,查詢出符合要求的記錄。條件查詢其實(shí)是在二維表的橫向來進(jìn)行篩選。這個(gè)篩選是WHERE自己中指定查詢條件來完成。其具體語法格式如下:SELECTFieldNameList

[ALL|DISTINCT][TOPn[PERCENT]]FROMTableNameList

[WHERECondition]根據(jù)Condition的不同來實(shí)現(xiàn)不同的查詢。7.3.1使用關(guān)系表達(dá)式表示查詢條件在WHERE的條件中,可以將關(guān)系運(yùn)算符和列名構(gòu)成關(guān)系表達(dá)式,從而實(shí)現(xiàn)條件查詢。主要的關(guān)系運(yùn)算符有:>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、=(等于)、<>(不等于)。7.3.2使用邏輯表達(dá)式表示查詢條件前面,我們所用到的是對單一條件的查詢,對記錄的篩選鼻尖簡單。WHERE子句中可以使用邏輯運(yùn)算符將若干查詢條件連接起來,從而更精確的篩選記錄行,可用以下邏輯運(yùn)算符。(1)AND,用AND連接兩個(gè)關(guān)系表達(dá)式,只有兩個(gè)關(guān)系表達(dá)式都成立時(shí)結(jié)果才為真,只要兩個(gè)關(guān)系(2)OR,用OR連接兩個(gè)關(guān)系表達(dá)式,只要兩個(gè)關(guān)系表達(dá)式有一個(gè)成立時(shí)結(jié)果就為真。如果連個(gè)關(guān)系表達(dá)式都不成立時(shí),其結(jié)果為假。7.3.2使用邏輯表達(dá)式表示查詢條件7.3.3使用LIKE關(guān)鍵字進(jìn)行模糊查詢一些時(shí)候,我們要查詢的條件是不確定的。例如,對于要查詢的人名,我們不能準(zhǔn)確的獲得其信息,我們只知道姓,或者只知道名,在這種情況下,我們就需要知道的信息進(jìn)行模糊查詢。在SQL中,給出LIKE運(yùn)算法來進(jìn)行字符串的模糊匹配。即查找指定的屬性列值與匹配串相匹配匹配字符串可使用通配符。語法格式:[NOT]LIKE‘<匹配符>’通配符及其含義:%:代表任意多個(gè)字符。_:代表單個(gè)任意字符。[]:指定某個(gè)字符的取值范圍。[^]:指定某個(gè)字符排除的取值范圍。7.3.3使用LIKE關(guān)鍵字進(jìn)行模糊查詢7.3.4使用BETWEEN…AND關(guān)鍵字表示查詢條件我們在平時(shí)進(jìn)行SQL操作時(shí)除了運(yùn)用比較運(yùn)算符進(jìn)行查詢,也可以使用BETWEEN關(guān)鍵字指定某個(gè)范圍內(nèi)查詢。其語法格式如下:[NOT]BETWEEN數(shù)值一AND數(shù)值二7.3.5IN關(guān)鍵字表示查詢條件IN關(guān)鍵字可以查詢符合列表中任何一個(gè)值的記錄。它可以取出不連續(xù)的,離散的一些列值。如要查詢年齡為23歲,25歲,26歲的學(xué)生信息時(shí),雖然用邏輯運(yùn)算符和比較運(yùn)算符可以完成,但是這樣過于繁瑣,因此,使用IN關(guān)鍵字成為一種需要。其語法格式如下:列名IN(列值1,列值2…….)7.3.5IN關(guān)鍵字表示查詢條件7.3.6NULL關(guān)鍵字的使用在數(shù)據(jù)表中,有些字段可以設(shè)置為空,這些字段可能沒有輸入值,這時(shí)改字段的值為空(NULL),使用NULL或者NOTNULL關(guān)鍵字可以查詢某一個(gè)字段值為空或者不為空的記錄。7.4對查詢結(jié)果排序輸出一般情況下,使用SQL語言進(jìn)行數(shù)據(jù)庫查詢得到的數(shù)據(jù)記錄行是無序的,它只是按照記錄在表的順序排列。但是我們?yōu)榱孙@性的表示其中各條記錄的關(guān)系,我們需要將這些數(shù)據(jù)記錄按照一定的順序排列,這時(shí)可以使用ORDERBY子句,從而將查詢結(jié)果按指定的列進(jìn)行排序。查詢排序的語法格式為:SELECTFieldNameList

[ALL|DISTINCT]FROMTableNameList

[WHERECondition][ORDERBYOrder_FieldName[ASC|DESC]]7.4對查詢結(jié)果排序輸出7.5查詢結(jié)果的新建表存儲一些時(shí)候,查詢出來的信息作為重要的資源需要進(jìn)行保存以便進(jìn)行更進(jìn)一步的加工處理,因此將其保存成為一種需要。SELECT語句提供了這種方法,在查詢數(shù)據(jù)時(shí),可以設(shè)定將數(shù)據(jù)存儲到一個(gè)新建表中。將查詢結(jié)果存入表中的語法如下:SELECTFieldNameList

[ALL|DISTINCT][INTONewTableName]FROMTableNameList

7.5查詢結(jié)果的新建表存儲7.6聚合函數(shù)在查詢中的使用聚合函數(shù)是對一組值執(zhí)行計(jì)算并返回單一的值。聚合函數(shù)忽略空值。聚合函數(shù)經(jīng)常與SELECT語句的GROUPBY子句一同使用。所有聚合函數(shù)都具有確定性。任何時(shí)候用一組給定的輸入值調(diào)用它們時(shí),都返回相同的值。7.6.1SUM函數(shù)這個(gè)函數(shù)通常在SELECT語句中使用,返回系列值的總數(shù)。其語法格式如下:SUM([ALL[DISTINCT]表達(dá)式)【例7-20】顯示一個(gè)公司一年銷售業(yè)績總和,假設(shè)月銷售價(jià)格總額存在price列中,數(shù)據(jù)表名為ProductOrders,執(zhí)行腳本代碼如下:SELECTSUM(price)AStotal_price

FROMProductOrders7.6.2AVG函數(shù)AVG函數(shù)(平均函數(shù))使用方法和SUM類似,它給我們提供系列值的算術(shù)平均數(shù)。其語法格式如下:AVG([ALL[DISTINCT]表達(dá)式)【例7-21】計(jì)算某公司每月的銷售額,假設(shè)月銷售價(jià)格總額存在price列中,數(shù)據(jù)表名為ProductOrders,執(zhí)行腳本代碼如下:SELECTAVG(price)AStotal_price

FROMProductOrders7.6.3MAX函數(shù)MAX()函數(shù)返回給定數(shù)據(jù)集中的最大值。我們可以給該函數(shù)一個(gè)字段名稱來返回表中給定字段的最大值。還可以在MAX()函數(shù)中使用表達(dá)式和GROUPBY從句來加強(qiáng)查找功能。其語法格式如下:MAX(表達(dá)式)【例7-22】查詢某公司一年中銷售額最大的值,假設(shè)月銷售價(jià)格總額存在price列中,數(shù)據(jù)表名為ProductOrders,執(zhí)行腳本代碼如下:SELECTMAX(price)AS“maxPrice”FROMProductOrders7.6.4MIN函數(shù)MIN()函數(shù)的用法與MAX函數(shù)類似,但返回表達(dá)式的最小值。其語法格式如下:MIN(表達(dá)式)【例7-23】查詢某公司一年中銷售額最小的值,假設(shè)月銷售價(jià)格總額存在price列中,數(shù)據(jù)表名為ProductOrders,執(zhí)行腳本代碼如下:SELECTMIN(price)AS“MinPrice”FROMProductOrders7.6.5COUNT和COUNT(*)函數(shù)SQL提供了COUNT函數(shù)來查詢滿足設(shè)定標(biāo)準(zhǔn)的記錄的數(shù)量。我們可以使用單獨(dú)COUNT(*)語法來檢索一個(gè)表內(nèi)的行數(shù)。此外,還可以利用WHERE子句來設(shè)置計(jì)數(shù)條件,返回特定記錄的條數(shù)。COUNT和COUNT(*)語法如下:COUNT([ALL[DISTINCT]表達(dá)式)COUNT(*)7.7查詢結(jié)果的匯總數(shù)據(jù)匯總是對查詢結(jié)果集進(jìn)行求總和、求平均、求最大值、求最小值的計(jì)算的匯總統(tǒng)計(jì)。前面例子的統(tǒng)計(jì)函數(shù)是對整個(gè)數(shù)據(jù)表中的數(shù)據(jù)進(jìn)行統(tǒng)計(jì),但實(shí)際應(yīng)用中往往需要進(jìn)行分組統(tǒng)計(jì)和匯總,此時(shí)我們就需要用GROUPBY子句進(jìn)行匯總。GGROUPBY列名是指按照指定的列名進(jìn)行分組(即列值相同的記錄組成一組),對每一組進(jìn)行匯總計(jì)算。其語法格式如下:SELECTFieldNameList

[ALL|DISTINCT]FROMTableNameList

[WHERECondition][GROUPBYGroup_FieldName][HAVINGHavingCondition]7.7查詢結(jié)果的匯總7.8多表連接查詢前面的查詢都是對單一表進(jìn)行操作,但是在數(shù)據(jù)庫實(shí)際編程中,往往需要查詢許多數(shù)據(jù),有可能這些數(shù)據(jù)出現(xiàn)在兩個(gè)或者兩個(gè)以上的表中,我們卻希望這些數(shù)據(jù)出現(xiàn)在一個(gè)結(jié)果集中,這就要用到連接查詢。在SQLSERVER中,可以使用ANSI連接語法形式,使連接協(xié)助FROM中,使用JOIN…ON關(guān)鍵字。另一種是早起的SQLServer連接語法形式,連接寫在WHERE子句中。在SQLServer2005中,推薦使用ANSI形式的連接。兩種形式的語法如下:SQLServer連接的語法格式:SELECT查詢列表FROM表1,表2WHERE表1.列1<比較運(yùn)算符>表2.列27.8.1內(nèi)連接內(nèi)連接也稱為等同連接,返回的結(jié)果集是兩個(gè)表中所有相匹配的數(shù)據(jù),而舍棄不匹配的數(shù)據(jù)。也就是說,在這種查詢中,DBMS只返回來自源表中的相關(guān)的行,即查詢的結(jié)果表包含的兩源表行,必須滿足ON子句中的搜索條件。作為對照,如果在源表中的行在另一表中沒有對應(yīng)(相關(guān))的行,則該行就被過濾掉,不會包括在結(jié)果表中。內(nèi)連接使用比較運(yùn)算符來完成。內(nèi)連接可分為兩種。1:等值連接,使用等于號(=)比較被連接列的列值,在查詢結(jié)果中列出被連接表中的所有列,包括其中的重復(fù)列;2:不等連接,在連接條件中,可以使用其他比較運(yùn)算符,比較被連接的列的列值。這些運(yùn)算符包括>、>=、<=、<、!>、!<和<>。7.8.2外連接不管是內(nèi)連接還是帶WHERE子句的多表查詢,都組合自多個(gè)表,并生成結(jié)果表。換句話說,如果任何一個(gè)源表中的行在另一個(gè)源表中沒有匹配,DBMS將不把該行放在最后的結(jié)果表中。而外連接告訴ODBC生成的結(jié)果表,不僅包含符合連接條件的行,而且還包括左表(左外連接時(shí))、右表(右外連接時(shí))或兩個(gè)邊接表(全外連接)中的所有數(shù)據(jù)行。SQL的外連接共有3種類型:左外連接,關(guān)鍵字為LEFTOUTERJOIN、右外連接,關(guān)鍵字為RIGHTOUTERJOIN和全外連接,關(guān)鍵字為FULLOUTERJOIN。外連接的用法和內(nèi)連接一樣,只是將INNERJOIN關(guān)鍵字替換為相應(yīng)的外連接關(guān)鍵字即可。7.8.3交叉連接(CROSSJOIN)除了在FROM子句中使用逗號間隔連接的表外,SQL還支持另一種被稱為交叉連接的操作,它們都返回被連接的兩個(gè)表所有數(shù)據(jù)行的笛卡爾積,返回到的數(shù)據(jù)行數(shù)等于第一個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)。唯一的不同在于,交叉連接分開列名時(shí),使用CROSSJOIN關(guān)鍵字而不是逗號。7.8.4自連接連接除了可以在多個(gè)不同的表中進(jìn)行外,也可以在同一個(gè)表中進(jìn)行連接,即自連接。自連接可以看做一張表的兩個(gè)副本之間進(jìn)行的連接。在自連接中,必須知道兩個(gè)別名,使之在邏輯上成為兩張表。7.9嵌套查詢關(guān)于查詢的嵌套,即在一個(gè)外層查詢中包含另一個(gè)內(nèi)層查詢,相當(dāng)于在一個(gè)SELECT語句中的WHERE子句中,包含有另一個(gè)SELECT語句,或者將一個(gè)SELECT語句作為另一個(gè)SELECT語句的新增列。嵌套查詢也叫做子查詢,可完成復(fù)雜的查詢操作。通常情況下,嵌套查詢可以寫出連接的形式,但是有事寫成連接形式會比較復(fù)雜,不容易理解,因此將其寫成嵌套的形式,以將復(fù)雜的查詢分解成簡單的、容易理解的嵌套查詢。使用子查詢一般要注意以下幾點(diǎn):先執(zhí)行括號里面的SQL語句,一層層到外面;內(nèi)部查詢只執(zhí)行一次;如果里層的結(jié)果集返回多個(gè),不能用=><>=<=等比較符要用IN.。7.9.1子查詢作為新增列【例7-31】用子查詢顯示學(xué)號,并把對應(yīng)學(xué)生的平均成績輸出。USEstu--打開數(shù)據(jù)庫stuSELECTavg_score=(SELECTAVG(score)FROMscore)FROMscoreorderbyscore.id--顯示學(xué)生平均成績7.9.1子查詢作為新增列7.9.2使用IN關(guān)鍵字進(jìn)行子查詢IN表示屬于,即如果表達(dá)式的值屬于子查詢返回得到結(jié)果的值,則滿足查詢條件。相反,NOTIN表示不屬于。其語法格式如下:WHERE表達(dá)式[NOT]IN(子查詢)7.9.3使用比較運(yùn)算符比較運(yùn)算符包括:>(大于),<(小于),>=(大于等于),<=(小于等于),<>(不等于)。其語法格式如下:WHERE表達(dá)式比較運(yùn)算符[ANY\ALL](子查詢)7.9.4使用BETWEEN關(guān)鍵字為了求出在

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論