SQL Sever第7章 數據的查詢_第1頁
SQL Sever第7章 數據的查詢_第2頁
SQL Sever第7章 數據的查詢_第3頁
SQL Sever第7章 數據的查詢_第4頁
SQL Sever第7章 數據的查詢_第5頁
已閱讀5頁,還剩42頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第7章數據的查詢數據查詢是數據庫編程中最基礎的一部分,也是最核心的一部分,它是從數據庫中檢索符合條件的數據記錄的選擇過程。基于T-SQL語言的SQLServer數據查詢,其最基本的語句是SELECT語句。SELECT語句的語法結構基本SELECT查詢基于條件的查詢對查詢結果排序輸出查詢結果的新建表存儲聚合函數在查詢中的使用查詢結果匯總多表連接查詢嵌套查詢小結7.1SELECT語句的語法結構SELECT語句功能相當強大,語法也比較復雜,為了對SELECT各語句進行詳細講解說明,首先列出SELECT語句的各個子句。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查詢表中所有的列如果一個數據表中有很多列,但是需要讀取數據表中所有列的值,因此如何將數據表簡便的顯示出來成為一個問題,SQL為我們提供了“*”符號,用來代替所有的字段。7.2.2查詢表中指定列的信息從例7.1中可以看出,使用“*”可以很方便地得出表中所有信息,但是更多時候用戶查詢時需要的并不是所有列的信息,因此這種效率低下的使用“*”來查詢所以列的方法并不是很好的方法。常用的比較有效的方法是在查詢時逐一指定所需要查詢的列名。7.2.3在查詢列表中使用列表達式在SELECT語句中可以使用算術運算符對文字型數據列進行加、減、乘、除以及取余(%)運算,從而構造列表達式來取得經過計算處理過的查詢結果。7.2.4重新命名結果列名有些時候,為了突出數據處理后所代表的意義,數據查詢的結果經常要指定列名,這樣更利于程序的可讀性和課理解性。并且,在數據庫應用中常出現以下問題:列的名稱為英文名稱,查詢結果不易查看,我們想為其起個中文別名。多表查詢時出現相同的列名,如果同時對多個表進行查詢,結果表中出現相同的列名,容易引起混淆或者不能引用這些列,只能為這些列起個別名。當SELECT子句的選擇列為表達式時,當SELECT子句的選擇列為表達式時,在查詢結果中無法顯示,只能為該表達式起個別名。SQL語言提供了兩種方法解決這些問題。1.使用AS關鍵字2.使用“=”7.2.4重新命名結果列名7.2.5說明列的定義很多時候,使用SELECT語句查詢的結果很難閱讀,因為顯示出來的數據是一些不連貫的信息。為了增加查詢結果的可讀性,可以在SELECT語句中增加一些說明列,增加的說明文字用單引號引起來。7.2.6取得查詢結果的部分行集在SQL語句中,我們使用TOP子句限制返回到結果集中的行數,其語法如下:TOPn[precent]n指定返回的行數。如果沒有指定precent,n就是返回的行數,如果指定了percent,n就是返回的結果集行的百分比。7.2.6取得查詢結果的部分行集7.3基于條件的查詢在實際查詢中,我們可能要求查詢部分數據記錄,即根據給定的查詢條件,查詢出符合要求的記錄。條件查詢其實是在二維表的橫向來進行篩選。這個篩選是WHERE自己中指定查詢條件來完成。其具體語法格式如下:SELECTFieldNameList

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

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

[ALL|DISTINCT]FROMTableNameList

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

[ALL|DISTINCT][INTONewTableName]FROMTableNameList

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

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

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

[ALL|DISTINCT]FROMTableNameList

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

溫馨提示

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

最新文檔

評論

0/150

提交評論