數(shù)據(jù)庫(kù)基礎(chǔ)之?dāng)?shù)據(jù)查詢課件_第1頁(yè)
數(shù)據(jù)庫(kù)基礎(chǔ)之?dāng)?shù)據(jù)查詢課件_第2頁(yè)
數(shù)據(jù)庫(kù)基礎(chǔ)之?dāng)?shù)據(jù)查詢課件_第3頁(yè)
數(shù)據(jù)庫(kù)基礎(chǔ)之?dāng)?shù)據(jù)查詢課件_第4頁(yè)
數(shù)據(jù)庫(kù)基礎(chǔ)之?dāng)?shù)據(jù)查詢課件_第5頁(yè)
已閱讀5頁(yè),還剩151頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第5章數(shù)據(jù)查詢第5章數(shù)據(jù)查詢1本章學(xué)習(xí)目標(biāo)

l

掌握SELECT語(yǔ)句結(jié)構(gòu)

l

熟練使用SELECT語(yǔ)句查詢數(shù)據(jù)本章學(xué)習(xí)目標(biāo)25.1SELECT語(yǔ)句結(jié)構(gòu)SELECT在任何一種SQL語(yǔ)言中,都是使用頻率最高的語(yǔ)句,它具有強(qiáng)大的查詢功能,有的用戶甚至只需要熟練掌握SELECT語(yǔ)句的一部分,就可以輕松地利用數(shù)據(jù)庫(kù)來(lái)完成自己的工作??梢哉f(shuō)SELECT是SQL語(yǔ)言的靈魂。SELECT語(yǔ)句的作用是讓數(shù)據(jù)庫(kù)服務(wù)器根據(jù)客戶端的要求搜尋出用戶所需要的信息資料,并按用戶規(guī)定的格式進(jìn)行整理后返回給客戶端。用戶使用SELECT語(yǔ)句除可以查看普通數(shù)據(jù)庫(kù)中的表格和視圖的信息外,還可以查看SQLServer的系統(tǒng)信息。5.1SELECT語(yǔ)句結(jié)構(gòu)3SELECT語(yǔ)句的語(yǔ)法格式如下:

SELECTselect_list

[INTOnew_table_name]

FROMtable_source

[WHEREsearch_condition]

[GROUPBYgroup_by_expression]

[HAVINGsearch_condition]

[ORDERBYorder_expression[ASC|DESC]]

其中:

l

select_list指明要查詢的選擇列表。列表可以包括若干個(gè)列名或表達(dá)式,列名或表達(dá)式之間用逗號(hào)隔開(kāi),用來(lái)指示應(yīng)該返回哪些數(shù)據(jù)。表達(dá)式可以是列名、函數(shù)或常數(shù)的列表。

l

INTOnew_table_name指定用查詢的結(jié)果創(chuàng)建成一個(gè)新表。new_table_name為新表名稱。SELECT語(yǔ)句的語(yǔ)法格式如下:

SELECTselect4l

FROMtable_source指定所查詢的表或視圖的名稱。l

WHEREsearch_condition指明查詢所要滿足的條件。l

GROUPBYgroup_by_expression根據(jù)指定列中的值對(duì)結(jié)果集進(jìn)行分組。l

HAVINGsearch_condition對(duì)用FROM、WHERE或GROUPBY子句創(chuàng)建的中間結(jié)果集進(jìn)行行的篩選。它通常與GROUPBY子句一起使用。l

[ORDERBYorder_expression[ASC|DESC]]對(duì)查詢結(jié)果集中的行重新排序。ASC和DESC關(guān)鍵字分別用于指定按升序或降序排序。如果省略ASC或DESC,則系統(tǒng)默認(rèn)為升序。l

FROMtable_source指定55.2使用SELECT語(yǔ)句查詢數(shù)據(jù)5.2.1使用SELECT子句SELECT子句的語(yǔ)法為:SELECT[ALL|DISTINCT][TOPn[PERCENT][WITHTIES]]<select_list>其中:l

ALL關(guān)鍵字為默認(rèn)設(shè)置,用于指定查詢結(jié)果集的所有行,包括重復(fù)行。l

DISTINCT用于刪除結(jié)果集中重復(fù)的行。l

TOPn[PERCENT]指定只返回查詢結(jié)果集中的前n行。如果加了PERCENT,則表示只返回查詢結(jié)果集中的前n%行。

WITHTIES用于指定從基本結(jié)果集中返回附加的行。

5.2使用SELECT語(yǔ)句查詢數(shù)據(jù)6l

select_list指明要查詢的選擇列表。列表可以包括若干個(gè)列名或表達(dá)式,列名或表達(dá)式之間用逗號(hào)隔開(kāi),用來(lái)指示應(yīng)該返回哪些數(shù)據(jù)。如果使用星號(hào)*則表示返回FROM子句中指定的表或視圖中的所的列。表達(dá)式可以是列名、函數(shù)或常數(shù)的列表?!纠?-1】查詢學(xué)生基本信息表中的所有信息。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT*FROM學(xué)生基本信息表GO運(yùn)行結(jié)果如圖5-1所示,它將學(xué)生基本信息表的所有信息均顯示出來(lái)。l

select_list指明要查詢的選7圖5-1查詢學(xué)生基本信息表中的所有信息圖5-1查詢學(xué)生基本信息表中的所有信息8【例5-2】在學(xué)生基本信息表中查詢學(xué)生的學(xué)號(hào)、姓名、性別和族別信息。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT學(xué)號(hào),姓名,性別,族別FROM學(xué)生基本信息表GO

運(yùn)行結(jié)果如圖5-2所示。

圖5-2在學(xué)生基本信息表中查詢學(xué)生的學(xué)號(hào)、姓名、性別和族別信息【例5-2】在學(xué)生基本信息表中查詢學(xué)生的學(xué)號(hào)、姓名、性別和族9【例5-3】從學(xué)生基本信息表中查詢學(xué)生由幾個(gè)民族構(gòu)成。

從例2結(jié)果可知,學(xué)生的族別有多行重復(fù),要快速查詢學(xué)生的民族構(gòu)成,實(shí)際上就是對(duì)相同值的族別只需要顯示一行,可使用DISTINCT關(guān)鍵字實(shí)現(xiàn)。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECTDISTINCT族別FROM學(xué)生基本信息表GO運(yùn)行結(jié)果如圖5-3所示。圖5-3從學(xué)生基本信息表中查詢學(xué)生由幾個(gè)民族構(gòu)成【例5-3】從學(xué)生基本信息表中查詢學(xué)生由幾個(gè)民族構(gòu)成。圖5-10【例5-4】顯示課程信息表中前5行的信息。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECTTOP5*FROM學(xué)生基本信息表GO運(yùn)行結(jié)果如圖5-4所示,只顯示查詢結(jié)果的前5行數(shù)據(jù)。

圖5-4只顯示查詢結(jié)果的前5行數(shù)據(jù)

【例5-4】顯示課程信息表中前5行的信息。圖5-4只顯示11【例5-5】從學(xué)生基本信息表中只顯示5%的信息。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECTTOP5PERCENT*FROM學(xué)生基本信息表GO運(yùn)行結(jié)果如圖5-5所示。學(xué)生基本信息表共有106行數(shù)據(jù),6行約占106行的5%,所以使用TOP5PERCENT檢索前5%的數(shù)據(jù)行,其結(jié)果是只顯示6行信息。

圖5-5顯示基本信息表5%的數(shù)據(jù)行,其結(jié)果是只顯示6行信息【例5-5】從學(xué)生基本信息表中只顯示5%的信息。圖5-5125.2.2使用INTO子句使用INTO子句可以創(chuàng)建一個(gè)新表,并將查詢結(jié)果直接插入到新表中。但是用戶必須在要?jiǎng)?chuàng)建新表的數(shù)據(jù)庫(kù)中擁有CREATETABLE權(quán)限,而且INTO子句不能與COMPUTE子句一起使用?!纠?-6】從學(xué)生基本信息表中查詢所有團(tuán)員的信息資料,并形成新表為團(tuán)員基本信息表。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT*INTO團(tuán)員基本信息表FROM學(xué)生基本信息表WHERE政治面貌='團(tuán)員'GOSELECT*FROM團(tuán)員基本信息表GO運(yùn)行結(jié)果如圖5-6所示。5.2.2使用INTO子句13圖5-6使用INTO子句

圖5-6使用INTO子句145.2.3使用FROM子句

FROM子句用于指定SELECT語(yǔ)句查詢的源表、視圖、派生表和聯(lián)接表,中間用逗號(hào)隔開(kāi)。在FROM子句中最多可以使用16個(gè)表或視圖?!纠?-7】從成績(jī)表中查詢學(xué)生成績(jī)。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT*FROM成績(jī)表GO運(yùn)行結(jié)果如圖5-7所示。

5.2.3使用FROM子句15圖5-7使用FROM子句

圖5-7使用FROM子句16【例5-8】從相關(guān)表中查詢每一位學(xué)生的學(xué)號(hào)、姓名、課程名稱、成績(jī)。從各表數(shù)據(jù)可知,“學(xué)號(hào)”存在于“學(xué)生基本信息表”和“成績(jī)表”,“姓名”存在于“學(xué)生基本信息表”,“課程名稱”存在于“課程信息表”,“成績(jī)”存在于“成績(jī)表”,要實(shí)現(xiàn)本例查詢,則需要對(duì)“學(xué)生基本信息表”、“課程信息表”、“成績(jī)表”進(jìn)行多表檢索,也可以來(lái)自不同的數(shù)據(jù)庫(kù)。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT學(xué)生基本信息表.學(xué)號(hào),姓名,課程名稱,成績(jī)FROM學(xué)生基本信息表,課程信息表,成績(jī)表WHERE學(xué)生基本信息表.學(xué)號(hào)=成績(jī)表.學(xué)號(hào)AND課程信息表.課程編號(hào)=成績(jī)表.課程編號(hào)GO運(yùn)行結(jié)果如圖5-8所示。

【例5-8】從相關(guān)表中查詢每一位學(xué)生的學(xué)號(hào)、姓名、課程名稱、17圖5-8從相關(guān)表中查詢每一位學(xué)生的學(xué)號(hào)、姓名、課程名稱、成績(jī)

圖5-8從相關(guān)表中查詢每一位學(xué)生的學(xué)號(hào)、姓名、課程名稱、185.2.4使用WHERE子句

WHERE子句用于指明查詢所要滿足的條件。通常情況下,必須定義一個(gè)或多個(gè)條件限制檢索選擇的數(shù)據(jù)行。WHERE子句后跟邏輯表達(dá)式,結(jié)果集將返回表達(dá)式為真的數(shù)據(jù)行。

在WHERE子句中,可以包含比較運(yùn)算符、邏輯運(yùn)算符。比較運(yùn)算符有:=(等于)、>(大于)、>=(對(duì)于等于)、<(小于)、<=(小于等于)、<>(不等于)、!>(不大于)、!<(不小于)、!=(不等于)。邏輯運(yùn)算符有:NOT(非)、AND(與)、OR(或),用來(lái)連接表達(dá)式。例如“1985年1月1日以后出生的女生”可表示為:出生日期>'1985-01-01'AND性別='女';“成績(jī)60分以上”可表示為:成績(jī)>=60或者WHERENOT(成績(jī)<60)等。

數(shù)據(jù)庫(kù)基礎(chǔ)之?dāng)?shù)據(jù)查詢19【例5-9】在課程信息表中查找“Delphi程序設(shè)計(jì)”課程的任課老師。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT任課教師FROM課程信息表WHERE課程名稱='Delphi程序設(shè)計(jì)'GO運(yùn)行結(jié)果如圖5-9所示。

圖5-9在課程信息表中查找“Delphi程序設(shè)計(jì)”課程的任課老師

圖5-9在課程信息表中查找“Delphi程序設(shè)計(jì)”課程的20【例5-10】查詢少數(shù)民族學(xué)生的基本情況。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT*FROM學(xué)生基本信息表WHERE族別<>'漢族'GO運(yùn)行結(jié)果如圖5-10所示。圖5-10查詢少數(shù)民族學(xué)生的基本情況

【例5-10】查詢少數(shù)民族學(xué)生的基本情況。圖5-10查詢21【例5-11】檢索1985年1月1日以后出生的女生基本信息。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT*FROM學(xué)生基本信息表WHERE出生日期>'1985-01-01'AND性別='女'GO運(yùn)行結(jié)果如圖5-11所示。

圖5-11檢索1985年1月1日以后出生的女生基本信息

【例5-11】檢索1985年1月1日以后出生的女生基本信息。225.2.5使用GROUPBY子句本子句寫(xiě)在WHERE子句之后,用于對(duì)查詢的結(jié)果集進(jìn)行分組。當(dāng)使用GROUPBY子句進(jìn)行分組時(shí),SELECT子句的選項(xiàng)列表中可以包含聚合函數(shù),但子句后的各列或包含在聚合函數(shù)中或包含在GROUPBY子句中,否則,SQLServer將返回如下錯(cuò)誤信息:“表名.列名在選擇列表中無(wú)效,因?yàn)樵摿屑炔话诰酆虾瘮?shù)中,也不包含在GROUPBY子句中?!?.2.5使用GROUPBY子句23【例5-12】查詢每位同學(xué)的課程門(mén)數(shù)、總成績(jī)、平均成績(jī)。查詢每位學(xué)生的課程成績(jī)情況,實(shí)際上就是按照“學(xué)號(hào)”列分類統(tǒng)計(jì),可使用GROUPBY學(xué)號(hào)子句,統(tǒng)計(jì)課程門(mén)數(shù)、總成績(jī)、平均成績(jī)分別可以使用聚合函數(shù)COUNT(課程編號(hào))、SUM(成績(jī))、AVG(成績(jī))。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT學(xué)號(hào),COUNT(課程編號(hào))AS'課程門(mén)數(shù)',SUM(成績(jī))AS'總成績(jī)',AVG(成績(jī))AS'平均成績(jī)'FROM成績(jī)表GROUPBY學(xué)號(hào)GO運(yùn)行結(jié)果如圖5-12所示。

【例5-12】查詢每位同學(xué)的課程門(mén)數(shù)、總成績(jī)、平均成績(jī)。24圖5-12查詢每位同學(xué)的課程門(mén)數(shù)、總成績(jī)、平均成績(jī)

5.2.6HAVING子句HAVING用于限定組或聚合函數(shù)的查詢條件,通常用在GROUPBY子句之后。通常,其作用與WHERE子句基本一樣。但WHERE子句是對(duì)原始記錄進(jìn)行過(guò)濾,HAVING子句對(duì)查詢結(jié)果進(jìn)行過(guò)濾,而且SELECT子句和HAVING子句中可以使用聚合函數(shù),WHERE子句中不能使用聚合函數(shù)。

圖5-12查詢每位同學(xué)的課程門(mén)數(shù)、總成績(jī)、平均成績(jī)5.25【例5-13】從學(xué)生基本信息表中統(tǒng)計(jì)各民族學(xué)生人數(shù)。此例實(shí)際上是將要對(duì)學(xué)生按民族進(jìn)行分類統(tǒng)計(jì),可使用聚合函數(shù)COUNT(族別)實(shí)現(xiàn)功能。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT族別,COUNT(族別)AS'學(xué)生人數(shù)'FROM學(xué)生基本信息表GROUPBY族別GO運(yùn)行結(jié)果如圖5-13所示。

圖5-13從學(xué)生基本信息表中統(tǒng)計(jì)各民族學(xué)生人數(shù)

【例5-13】從學(xué)生基本信息表中統(tǒng)計(jì)各民族學(xué)生人數(shù)。圖5-126【例5-14】從學(xué)生基本信息表中統(tǒng)計(jì)漢族學(xué)生的人數(shù)。此例就是在上例統(tǒng)計(jì)出各民族學(xué)生人數(shù)的基礎(chǔ)上進(jìn)一步限定查詢漢族學(xué)生人數(shù),可在GROUPBY子句之后跟HAVING族別='漢族'子句實(shí)現(xiàn)此功能。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT族別,COUNT(族別)AS'學(xué)生人數(shù)'FROM學(xué)生基本信息表GROUPBY族別HAVING族別='漢族'GO運(yùn)行結(jié)果如圖5-14所示。圖5-14從學(xué)生基本信息表中統(tǒng)計(jì)漢族學(xué)生的人數(shù)

【例5-14】從學(xué)生基本信息表中統(tǒng)計(jì)漢族學(xué)生的人數(shù)。圖5-127此例也可使用WHERE子句完成功能。USEXSCJGOSELECT族別,COUNT(族別)AS'學(xué)生人數(shù)'FROM學(xué)生基本信息表WHERE族別='漢族'GROUPBY族別GO運(yùn)行結(jié)果如圖5-15所示。

圖5-15使用WHERE子句完成功能

此例也可使用WHERE子句完成功能。圖5-15使用WHE28【例5-15】顯示平均成績(jī)大于等于80分以上的學(xué)生情況。此例的限定條件是AVG(成績(jī))>=80,只能使用HAVING子句,如果使用WHERE子句限定條件,則系統(tǒng)會(huì)顯示如圖5-16所示的錯(cuò)誤信息。錯(cuò)誤使用WHERE子句的SELECT語(yǔ)句如下:USEXSCJGOSELECT學(xué)號(hào),AVG(成績(jī))AS'平均成績(jī)'FROM成績(jī)表WHEREAVG(成績(jī))>=80GROUPBY學(xué)號(hào)GO運(yùn)行結(jié)果如圖5-16所示。

圖5-16顯示平均成績(jī)大于等于80分以上的學(xué)生情況

【例5-15】顯示平均成績(jī)大于等于80分以上的學(xué)生情況。圖529使用HAVING子句的正確語(yǔ)句如下:USEXSCJGOSELECT學(xué)號(hào),AVG(成績(jī))AS'平均成績(jī)'FROM成績(jī)表GROUPBY學(xué)號(hào)HAVINGAVG(成績(jī))>=80GO運(yùn)行結(jié)果如圖5-17所示。

圖5-17使用HAVING子句查詢平均成績(jī)大于等于80分以上的學(xué)生情況

使用HAVING子句的正確語(yǔ)句如下:圖5-17使用HAV305.2.7ORDERBY子句ORDERBY子句對(duì)查詢結(jié)果集中的行進(jìn)行重新排序。ASC和DESC關(guān)鍵字分別用于指定按升序或降序排序。如果省略ASC或DESC,則系統(tǒng)默認(rèn)為升序??梢栽贠RDERBY子句中指定多個(gè)排序列,即嵌套排序,檢索結(jié)果首先按第1列進(jìn)行排序,對(duì)第1列值相同的那些數(shù)據(jù)行,再按照第2列排序……依此類推。要求ORDERBY子句要寫(xiě)在WHERE子句的后面,而且在ORDERBY子句中不能使用ntext、text和image列。5.2.7ORDERBY子句31【例5-16】將學(xué)生平均成績(jī)按升序排序。

在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT學(xué)號(hào),AVG(成績(jī))AS'平均成績(jī)'FROM成績(jī)表GROUPBY學(xué)號(hào)ORDERBYAVG(成績(jī))GO運(yùn)行結(jié)果如圖5-18所示,省略關(guān)鍵字ASC,系統(tǒng)默認(rèn)為升序排序。

圖5-18將學(xué)生平均成績(jī)按升序排序

【例5-16】將學(xué)生平均成績(jī)按升序排序。圖5-18將學(xué)生32【例5-17】查詢成績(jī)表中的全部信息,要求查詢結(jié)果首先按學(xué)號(hào)升序排序,學(xué)號(hào)相同時(shí),按成績(jī)降序排序。

在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT*FROM成績(jī)表ORDERBY學(xué)號(hào),成績(jī)DESCGO

運(yùn)行結(jié)果如圖5-19所示。

圖5-19查詢成績(jī)表中的全部信息

【例5-17】查詢成績(jī)表中的全部信息,要求查詢結(jié)果首先按學(xué)號(hào)335.2.8使用COMPUTE子句

COMPUTE子句用在WHERE子句之后,用來(lái)計(jì)算總計(jì)并進(jìn)行分組小計(jì),可使用聚合函數(shù),總計(jì)值或小計(jì)值將作為附加新行出現(xiàn)在檢索結(jié)果中。使用COMPUTE子句時(shí)必須使用ORDERBY對(duì)COMPUTEBY中BY指定的列進(jìn)行排序,否則將出現(xiàn)錯(cuò)誤信息?!纠?-18】按學(xué)號(hào)顯示學(xué)生成績(jī),并計(jì)算每人的平均成績(jī)和總成績(jī)。此例要求按人對(duì)課程及成績(jī)進(jìn)行分組顯示,并計(jì)算每人的平均成績(jī)、總成績(jī)。則顯示成績(jī)應(yīng)按學(xué)號(hào)分類,分組計(jì)算平均成績(jī)、總成績(jī)的語(yǔ)句為COMPUTEAVG(成績(jī)),SUM(成績(jī))BY學(xué)號(hào),使用COMPUTEBY子句首先要用ORDERBY子句對(duì)要分組的學(xué)號(hào)列排序,即ORDERBY學(xué)號(hào)。5.2.8使用COMPUTE子句【例5-18】按學(xué)號(hào)顯示34在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT*FROM成績(jī)表ORDERBY學(xué)號(hào)COMPUTEAVG(成績(jī)),SUM(成績(jī))BY學(xué)號(hào)GO運(yùn)行結(jié)果如圖5-20所示。

圖5-20按學(xué)號(hào)顯示學(xué)生成績(jī),并計(jì)算每人的平均成績(jī)和總成績(jī)

在查詢分析器中運(yùn)行如下命令:圖5-20按學(xué)號(hào)顯示學(xué)生成績(jī)355.3使用其它子句或關(guān)鍵字查詢數(shù)據(jù)5.3.1聯(lián)合查詢

聯(lián)合查詢是指將兩個(gè)或兩個(gè)以上的SELECT語(yǔ)句通過(guò)UNION運(yùn)算符連接起來(lái)的查詢。聯(lián)合查詢可以將兩個(gè)或更多查詢的結(jié)果組合為單個(gè)結(jié)果集,該結(jié)果集包含聯(lián)合查詢中所有查詢的全部行。使用UNION組合多個(gè)查詢的結(jié)果時(shí),必須注意:所有查詢中的列數(shù)和列的順序必須相同且數(shù)據(jù)類型必須兼容。5.3使用其它子句或關(guān)鍵字查詢數(shù)據(jù)36【例5-19】從系部表中檢索系部名稱,從班級(jí)表中檢索班級(jí)名稱。從系部表中檢索系部名稱的SELECT語(yǔ)句為:SELECT系部名稱FROM系部表,從班級(jí)表中檢索班級(jí)名稱的SELECT語(yǔ)句為:SELECT班級(jí)名稱FROM班級(jí)表,合并這兩個(gè)查詢結(jié)果,需要使用UNION運(yùn)算符。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT系部名稱FROM系部表UNIONSELECT班級(jí)名稱FROM班級(jí)表GO運(yùn)行結(jié)果如圖5-21所示,UNION結(jié)果集的列標(biāo)題取自第一個(gè)SELECT語(yǔ)句。

【例5-19】從系部表中檢索系部名稱,從班級(jí)表中檢索班級(jí)名稱37圖5-21UNION結(jié)果集的列標(biāo)題取自第一個(gè)SELECT語(yǔ)句

圖5-21UNION結(jié)果集的列標(biāo)題取自第一個(gè)SELECT385.3.2檢索某一范圍內(nèi)的信息

檢索在某一范圍內(nèi)的信息,需要使用WHERE子句限定查詢條件,這個(gè)條件通常是一個(gè)邏輯表達(dá)式。在表達(dá)式中除了可以使用比較運(yùn)算符=(等于)、<(小于)、>(大于)、<>(不等于)等外,還可使用范圍運(yùn)算符BETWEEN、NOTBETWEEN、IN、LIKE、ISNULL等,邏輯運(yùn)算符NOT(非)、OR(或)、AND(與)等來(lái)限定查詢條件。

1.使用BETWEEN關(guān)鍵字BETWEEN關(guān)鍵字總是與AND一起使用,用來(lái)檢索在一個(gè)指定范圍內(nèi)的信息,NOTBETWEEN檢索不在某一范圍內(nèi)的信息。5.3.2檢索某一范圍內(nèi)的信息39【例5-20】查詢1985年出生的學(xué)生基本信息。1985年出生的學(xué)生即出生日期在1985年1月1日至12月31日之間的學(xué)生。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT*FROM學(xué)生基本信息表WHERE出生日期BETWEEN'1985-01-01'AND'1985-12-31'GO運(yùn)行結(jié)果如圖5-22所示。

【例5-20】查詢1985年出生的學(xué)生基本信息。40圖5-22查詢1985年出生的學(xué)生基本信息

圖5-22查詢1985年出生的學(xué)生基本信息41【例5-21】查詢不及格學(xué)生成績(jī)信息。查詢不及格學(xué)生成績(jī)信息,也就是查詢0—59之間的學(xué)生成績(jī),可用BETWEEN關(guān)鍵字表示為:WHERE成績(jī)BETWEEN0AND59。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT*FROM成績(jī)表WHERE成績(jī)BETWEEN0AND59GO運(yùn)行結(jié)果如圖5-23所示。圖5-23查詢不及格學(xué)生成績(jī)信息

【例5-21】查詢不及格學(xué)生成績(jī)信息。圖5-23查詢不及422.使用IN關(guān)鍵字IN關(guān)鍵字允許用戶選擇與列表中的值相匹配的行,指定項(xiàng)必須用括號(hào)括起來(lái),并用逗號(hào)隔開(kāi),表示“或”的關(guān)系。NOTIN表示含義正好相反。

【例5-22】查詢課程編號(hào)為002、003、007、014的課程編號(hào)、課程名稱、任課教師和上課時(shí)間。課程編號(hào)為002、003、007、014可以寫(xiě)成:WHERE課程編號(hào)IN('002','003','007','014'),也可寫(xiě)成WHERE課程編號(hào)=’002’OR課程編號(hào)=’003’OR課程編號(hào)=’007’OR課程編號(hào)=’014’。顯然,使用IN關(guān)鍵字進(jìn)行檢索比使用3個(gè)OR運(yùn)算符進(jìn)行檢索更為簡(jiǎn)單,而且易于理解和閱讀。在查詢分析器中運(yùn)行如下命令:

USEXSCJGOSELECT課程編號(hào),課程名稱,任課教師,上課時(shí)間FROM課程信息表WHERE課程編號(hào)IN('002','003','007','014')GO運(yùn)行結(jié)果如圖5-24所示

2.使用IN關(guān)鍵字在查詢分析器中運(yùn)行如下命令:43圖5-24查詢課程編號(hào)為002、003、007、014的課程編號(hào)、課程名稱、任課教師和上課時(shí)間

在查詢分析器中運(yùn)行以下命令,也可得到相同的查詢結(jié)果,但這種寫(xiě)法顯然比較繁瑣。USEXSCJGOSELECT課程編號(hào),課程名稱,任課教師,上課時(shí)間FROM課程信息表WHERE課程編號(hào)=’002’OR課程編號(hào)=’003’OR課程編號(hào)=’007’OR課程編號(hào)=’014’GO圖5-24查詢課程編號(hào)為002、003、007、014的443.使用LIKE關(guān)鍵字LIKE關(guān)鍵字用于查詢與指定的某些字符串表達(dá)式模糊匹配的數(shù)據(jù)行。LIKE后的表達(dá)式被定義為字符串,必須用單引號(hào)(’’)括起來(lái),字符串中可以使用4種通配符。它們是:l

%:可匹配任意類型和長(zhǎng)度的字符串。l

_(下劃線):可匹配任何單個(gè)字符。l

[]:指定范圍或集合中的任何單個(gè)字符。l[^]:不屬于指定范圍或集合的任何單個(gè)字符。

例如:LIKE‘劉%’匹配以“劉”開(kāi)始的字符串;LIKE‘%技術(shù)%’匹配的是前后字符為任意,中間含有“技術(shù)”兩個(gè)字的字符串;LIKE‘_秀%’匹配的是第2個(gè)字為“秀”的任意字符串。[a-i]匹配的是a、b、c、d、e、f、g、h、I單個(gè)字符;LIKE‘m[^w-z]%’匹配所有以字母m開(kāi)始并且第2個(gè)字母不為w、x、y、z的所有字符串。3.使用LIKE關(guān)鍵字l

%:可匹配任意類型45【例5-23】檢索所有姓劉的學(xué)生基本信息。匹配所有姓劉的學(xué)生可以表示為:姓名LIKE‘劉%’。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT*FROM學(xué)生基本信息表WHERE姓名LIKE'劉%'GO運(yùn)行結(jié)果如圖5-25所示。

圖5-25檢索所有姓劉的學(xué)生基本信息

【例5-23】檢索所有姓劉的學(xué)生基本信息。圖5-25檢索46【例5-24】檢索包含“技術(shù)”兩字的課程信息。匹配“技術(shù)”兩字的課程名稱可以表示為:課程名稱LIKE‘%技術(shù)%’。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT*FROM課程信息表WHERE課程名稱LIKE'%技術(shù)%'GO運(yùn)行結(jié)果如圖5-26所示。

圖5-26檢索包含“技術(shù)”兩字的課程信息

【例5-24】檢索包含“技術(shù)”兩字的課程信息。圖5-2647【例5-25】檢索少數(shù)民族學(xué)生的基本信息。少數(shù)民族學(xué)生或以表示為:WHERE族別NOTLIKE‘漢族’。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT*FROM學(xué)生基本信息表WHERE族別NOTLIKE'漢族'GO運(yùn)行結(jié)果如圖5-27所示。

圖5-27檢索少數(shù)民族學(xué)生的基本信息

【例5-25】檢索少數(shù)民族學(xué)生的基本信息。圖5-27檢索48【例5-26】查詢第2個(gè)字為“麗”的學(xué)生信息。在學(xué)生基本信息表中,匹配第2個(gè)字為“麗”的學(xué)生姓名應(yīng)表示為:姓名LIKE‘_麗%’。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT*FROM學(xué)生基本信息表WHERE姓名LIKE'_麗%'GO運(yùn)行結(jié)果如圖5-28所示。

圖5-28查詢第2個(gè)字為“麗”的學(xué)生信息

【例5-26】查詢第2個(gè)字為“麗”的學(xué)生信息。圖5-28494、使用ISNULL關(guān)鍵字ISNULL關(guān)鍵字可以檢索數(shù)據(jù)列中沒(méi)有賦值的行?!纠?-27】查詢課程信息表中教師未定的課程信息。課程信息表中教師未定的表達(dá)式可以表示為:WHERE任課教師ISNULL。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT*FROM課程信息表WHERE任課教師ISNULLGO運(yùn)行結(jié)果如圖5-29所示,因?yàn)闆](méi)有任課教師為空(NULL)的課程,所以查詢結(jié)果為0行。圖5-29查詢課程信息表中教師未定的課程信息

4、使用ISNULL關(guān)鍵字圖5-29查詢課程信息表中教505.3.3指定結(jié)果集的列的別名有時(shí)需要為查詢結(jié)果集中的某些列增加可讀性或者為沒(méi)有名稱的導(dǎo)出列指定名稱,可使用AS子句。【例5-28】統(tǒng)計(jì)成績(jī)表中各門(mén)課程的學(xué)生人數(shù)、總成績(jī)、平均成績(jī)。統(tǒng)計(jì)成績(jī)表中各門(mén)課程信息,需要將學(xué)生成績(jī)按課程編號(hào)分組GROUPBY課程編號(hào),統(tǒng)計(jì)學(xué)生人數(shù)、總成績(jī)、平均成績(jī)分別需要使用聚合函數(shù)COUNT(學(xué)號(hào))、SUM(成績(jī))、AVG(成績(jī))。因?yàn)樾律傻膶W(xué)生人數(shù)、總成績(jī)、平均成績(jī)?nèi)袥](méi)有列名,所以可使用AS子句實(shí)現(xiàn)。5.3.3指定結(jié)果集的列的別名51在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT課程編號(hào),COUNT(學(xué)號(hào))AS'學(xué)生人數(shù)',SUM(成績(jī))AS'總成績(jī)',AVG(成績(jī))AS'平均成績(jī)'FROM成績(jī)表GROUPBY課程編號(hào)GO運(yùn)行結(jié)果如圖5-30所示。

圖5-30統(tǒng)計(jì)成績(jī)表中各門(mén)課程的學(xué)生人數(shù)、總成績(jī)、平均成績(jī)

在查詢分析器中運(yùn)行如下命令:圖5-30統(tǒng)計(jì)成績(jī)表中各門(mén)525.3.4子查詢子查詢是在查詢中包含另一個(gè)查詢的查詢。它本身是一個(gè)SELECT查詢,可以代替表達(dá)式出現(xiàn)在WHERE子句中。它返回單個(gè)值且嵌套在SELECT、INSERT、UPDATE、DELETE語(yǔ)句或其它子查詢中。任何允許使用表達(dá)式的地方都可以使用子查詢。子查詢的SELECT查詢總是使用圓括號(hào)括起來(lái),且不能包括COMPUTE子句,如果同時(shí)指定TOP子句,則可能只包括ORDERBY子句。

【例5-37】檢索單科成績(jī)高于全班平均分的學(xué)生成績(jī)信息。此例中,全班平均成績(jī)?yōu)镾ELECTAVG(成績(jī))AS'平均成績(jī)'FROM成績(jī)表,單科成績(jī)高于全班平均分可以表述為WHERE成績(jī)>(SELECTAVG(成績(jī))FROM成績(jī)表)。5.3.4子查詢53在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECTAVG(成績(jī))AS'平均成績(jī)'FROM成績(jī)表GOSELECT*FROM成績(jī)表WHERE成績(jī)>(SELECTAVG(成績(jī))FROM成績(jī)表)GO運(yùn)行結(jié)果如圖5-39所示。

圖5-39檢索單科成績(jī)高于全班平均分的學(xué)生成績(jī)信息

在查詢分析器中運(yùn)行如下命令:圖5545.4連接查詢用戶在前面所作的查詢大多是對(duì)單個(gè)表進(jìn)行的查詢,而在數(shù)據(jù)庫(kù)的應(yīng)用中,經(jīng)常需要從多個(gè)相關(guān)的表中查詢數(shù)據(jù),這就需要使用連接查詢。用戶通過(guò)連接可以使用一個(gè)表中的數(shù)據(jù)來(lái)查詢其他表的數(shù)據(jù),從而大大增加了靈活性。由于連接涉及多個(gè)表及其之間的引用,所以列的引用均必須明確,對(duì)于重復(fù)的列名必須用表名限定。對(duì)多個(gè)表或視圖進(jìn)行查詢,需要在FROM子句或WHERE子句中定義連接條件。在FROM子句中定義連接的語(yǔ)法形式為:FROM表1[連接類型]JOIN表2ON表1.列=表2.列在WHERE子句中定義連接的語(yǔ)法形式為:FROM表1,表2WHERE表1.列

連接操作

表2.列但由于在FROM子句中指定連接條件有助于區(qū)分連接條件與WHERE子句中指定的搜索條件,所以建議使用FROM子句的方法。5.4連接查詢55連接的類型有內(nèi)連接、外連接、交叉連接3種。5.4.1內(nèi)聯(lián)接內(nèi)連接(INNERJOIN)是組合兩個(gè)表的常用方法,它將兩個(gè)表中的列進(jìn)行比較,將兩個(gè)表中滿足連接條件的行組合起來(lái),作為結(jié)果。內(nèi)連接有等值連接、自然連接和不等值連接3種。1.相等連接相等連接是將要連接的列值使用等值運(yùn)算符(=)作相等比較后所作的連接,返回所有列(包括重復(fù)列)。因?yàn)檫B接的列要顯示兩次,所以會(huì)產(chǎn)生冗余?!纠?-29】檢索系部信息和班級(jí)信息。此例要檢索系部表和班級(jí)表的所有信息,即顯示兩個(gè)表的所有信息??稍赟ELECT子句中使用*、系部表.*或班級(jí)表.*,連接條件是兩個(gè)表的系部編號(hào)的值要相等,即系部表.系部編號(hào)=班級(jí)表.系部編號(hào)。

連接的類型有內(nèi)連接、外連接、交叉連接3種。56在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT*FROM系部表,班級(jí)表WHERE系部表.系部編號(hào)=班級(jí)表.系部編號(hào)GO運(yùn)行結(jié)果如圖5-31所示,檢索結(jié)果中有完全相同的兩列系部編號(hào),數(shù)據(jù)產(chǎn)生了冗余。

5-31檢索系部信息和班級(jí)信息

在查詢分析器中運(yùn)行如下命令:57使用ANSI連接語(yǔ)法的SELECT語(yǔ)句如下:USEXSCJGOSELECT*FROM系部表INNERJOIN班級(jí)表ON系部表.系部編號(hào)=班級(jí)表.系部編號(hào)GO運(yùn)行結(jié)果與圖5-31所示相同。2.自然連接自然連接是將要連接的列作相等比較的連接,但連接的列只顯示一次,因而消除了等值連接產(chǎn)生的冗余?!纠?-30】檢索系部信息和班級(jí)信息,要求連接的列只顯示一次。本例與上例的區(qū)別是對(duì)連接的列只顯示一列,用SELECT子句可以寫(xiě)成:SELECT系部表.*,班級(jí)編號(hào),班級(jí)名稱。使用ANSI連接語(yǔ)法的SELECT語(yǔ)句如下:58在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT系部表.*,班級(jí)編號(hào),班級(jí)名稱FROM系部表,班級(jí)表WHERE系部表.系部編號(hào)=班級(jí)表.系部編號(hào)GO運(yùn)行結(jié)果如圖5-32所示。

5-32檢索系部信息和班級(jí)信息,要求連接的列只顯示一次

在查詢分析器中運(yùn)行如下命令:5-32檢索系部信息和班級(jí)信59使用ANSI連接語(yǔ)法的SELECT語(yǔ)句如下:USEXSCJGOSELECT系部表.*,班級(jí)編號(hào),班級(jí)名稱FROM系部表INNERJOIN班級(jí)表ON系部表.系部編號(hào)=班級(jí)表.系部編號(hào)GO運(yùn)行結(jié)果與圖5-32所示相同。3、不等值連接不等值連接就是在連接時(shí)不使用等值運(yùn)算符,而采用比較運(yùn)算符進(jìn)行連接。使用ANSI連接語(yǔ)法的SELECT語(yǔ)句如下:60【例5-31】檢索沒(méi)有錄入成績(jī)的課課程情況。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECTDISTINCT課程信息表.*FROM課程信息表,成績(jī)表WHERE課程信息表.課程編號(hào)<>成績(jī)表.課程編號(hào)GO運(yùn)行結(jié)果如圖5-33所示。

【例5-31】檢索沒(méi)有錄入成績(jī)的課課程情況。615-33檢索沒(méi)有錄入成績(jī)的學(xué)生基本信息

5-33檢索沒(méi)有錄入成績(jī)的學(xué)生基本信息625.4.2外連接外連接(OUTERJOIN)只限制一個(gè)表,而對(duì)另外一個(gè)表不加限制(即所有的行都出現(xiàn)在結(jié)果集中)。外連接分為左外連接(LEFTOUTERJOIN)、右外連接(RIGHTOUTERJOIN)和全外連接(FULLOUTERJOIN)。括號(hào)中為使用FROM子句定義外連接的關(guān)鍵字,使用中可以省略O(shè)UTER。1、左外連接(LEFTOUTERJOIN)左外連接對(duì)連接條件中左邊的表不加限制。左外連接需要在FROM子句中采用下列語(yǔ)法格式:FROM左表名LEFT[OUTER]JOIN右表名ON連接條件

5.4.2外連接63【例5-32】使用左外連接檢索學(xué)生成績(jī)信息(學(xué)號(hào),姓名,課程名稱)。

在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT學(xué)號(hào),課程信息表.課程編號(hào),課程信息表.課程名稱,成績(jī)

FROM課程信息表LEFTJOIN成績(jī)表ON課程信息表.課程編號(hào)=成績(jī)表.課程編號(hào)GO運(yùn)行結(jié)果如圖5-34所示(所影響的行數(shù)為343行)。

圖5-34使用左外連接檢索學(xué)生成績(jī)信息

【例5-32】使用左外連接檢索學(xué)生成績(jī)信息(學(xué)號(hào),姓名,課程642.右外連接(RIGHTOUTERJOIN)右外連接對(duì)右邊的表不加限制。右外連接需要在FROM子句采用下列語(yǔ)法格式:FROM左表名RIGHT[OUTER]JOIN右表名ON連接條件【例5-33】使用右外連接檢索學(xué)生成績(jī)信息(學(xué)號(hào),姓名,課程名稱)。

在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT學(xué)號(hào),課程信息表.課程編號(hào),課程信息表.課程名稱,成績(jī)

FROM課程信息表RIGHTJOIN成績(jī)表ON課程信息表.課程編號(hào)=成績(jī)表.課程編號(hào)GO運(yùn)行結(jié)果如圖5-35所示(所影響的行數(shù)為322行)。

2.右外連接(RIGHTOUTERJOIN)65圖5-35使用右外連接檢索學(xué)生成績(jī)信息3、全外連接(FULLOUTERJOIN)全外連接對(duì)兩個(gè)表都不加限制,所有兩個(gè)表中的行都會(huì)包括在結(jié)果集中。使用全外連接需要在FROM子句采用下列語(yǔ)法格式:FROM左表名FULL[OUTER]JOIN右表名ON連接條件【例5-34】使用全外連接檢索學(xué)生成績(jī)信息(學(xué)號(hào),姓名,課程名稱)。

圖5-35使用右外連接檢索學(xué)生成績(jī)信息3、全外連接(FU66在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT學(xué)號(hào),課程信息表.課程編號(hào),課程信息表.課程名稱,成績(jī)

FROM課程信息表FULLJOIN成績(jī)表ON課程信息表.課程編號(hào)=成績(jī)表.課程編號(hào)GO運(yùn)行結(jié)果如圖5-36所示(所影響的行數(shù)為343行)。

圖5-36使用全外連接檢索學(xué)生成績(jī)信息

在查詢分析器中運(yùn)行如下命令:圖5-36使用全外連接檢索學(xué)675.4.3交叉聯(lián)接(CROSSJOIN)交叉連接也叫非限制連接,它將兩個(gè)表不加任何約束地組合起來(lái)。在數(shù)學(xué)上,就是兩個(gè)表的笛卡爾積。交叉連接后得到的結(jié)果集的行數(shù)是兩個(gè)被連接表的行數(shù)的乘積。【例5-35】計(jì)算系部表和班級(jí)表的交叉連接。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT*FROM班級(jí)表CROSSJOIN系部表GO運(yùn)行結(jié)果如圖5-37所示,檢索結(jié)果為48行,由班級(jí)表的8行和系部表的6行組合而成(6×8=48),由連接結(jié)果可以看出,這種交叉連接的結(jié)果沒(méi)有實(shí)際意義。

5.4.3交叉聯(lián)接(CROSSJOIN)68圖5-37計(jì)算系部表和班級(jí)表的交叉連接此例也可用FROM子句寫(xiě)成如下語(yǔ)句,運(yùn)行結(jié)果相同。USEXSCJGOSELECT*FROM班級(jí)表,系部表GO在實(shí)際應(yīng)用中使用交叉連接產(chǎn)生的結(jié)果集一般沒(méi)有什么意義,但在數(shù)據(jù)庫(kù)的數(shù)學(xué)模式上有重要的作用。圖5-37計(jì)算系部表和班級(jí)表的交叉連接此例也可用FROM695.4.4自聯(lián)接(SELFJOIN)自連接就是一個(gè)表與它自身的不同行進(jìn)行連接。因?yàn)楸砻贔ROM子句中出現(xiàn)兩次,所以需要對(duì)表指定兩個(gè)別名,使之在邏輯上成為兩張表。在SELECT子句中引用的列名也要使用表的別名進(jìn)行限定。【例5-36】查找同名同姓的學(xué)生信息。該例是對(duì)學(xué)生基本信息表進(jìn)行行自連接,這里將學(xué)生基本信息表分別定義別名為A1、A2,將FROM子句寫(xiě)成FROM學(xué)生基本信息表A1,學(xué)生基本信息表A2,連接條件為WHEREA1.姓名=A2.姓名ANDA1.學(xué)號(hào)<>A2.學(xué)號(hào)。

5.4.4自聯(lián)接(SELFJOIN)70在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECTA1.*FROM學(xué)生基本信息表A1,學(xué)生基本信息表A2WHEREA1.姓名=A2.姓名ANDA1.學(xué)號(hào)<>A2.學(xué)號(hào)GO運(yùn)行結(jié)果如圖5-38所示

圖5-38使用自連接查找同名同姓的學(xué)生信息

在查詢分析器中運(yùn)行如下命令:圖5-38使用自連接查找同名71本章小結(jié)

本章主要介紹了SELECT語(yǔ)句在數(shù)據(jù)查詢中的應(yīng)用技術(shù),SELECT語(yǔ)句在SQL語(yǔ)言中功能最為強(qiáng)大,應(yīng)用最為廣泛。要求同學(xué)們掌握SELECT語(yǔ)句結(jié)構(gòu),能夠熟練使用SELECT語(yǔ)句查詢數(shù)據(jù)。本章小結(jié)72練習(xí)與上機(jī)一.選擇題1、在SELECT語(yǔ)句中,下列哪種子句用于選擇列表()。A、SELECT子句B、INTO子句C、FROM子句D、WHERE子句2、在SELECT語(yǔ)句中,下列哪種子句用于將查詢結(jié)果存儲(chǔ)在一個(gè)新表中()。A、SELECT子句B、INTO子句C、FROM子句D、WHERE子句3、在SELECT語(yǔ)句中,下列哪種子句用于指出所查詢的數(shù)據(jù)表名()。A、SELECT子句B、INTO子句C、FROM子句D、WHERE子句練習(xí)與上機(jī)734、在SELECT語(yǔ)句中,下列哪種子句用于對(duì)數(shù)據(jù)按照某個(gè)字段分組()。A、SELECT子句B、INTO子句C、FROM子句D、WHERE子句5、在SELECT語(yǔ)句中,下列哪種子句用于對(duì)分組統(tǒng)計(jì)進(jìn)一步設(shè)置條件()。A、HAVING子句B、GROUPBY子句C、ORDERBY子句D、WHERE子句6、在SELECT語(yǔ)句中,下列哪種子句用于對(duì)搜索的結(jié)果進(jìn)行排序()。A、HAVING子句B、GROUPBY子句C、ORDERBY子句D、WHERE子句7、在SELECT語(yǔ)句中,如果想要返回的結(jié)果集中不包含相同的行,應(yīng)該使用關(guān)鍵字()。A、TOPB、ASC、DISTINCTD、JOIN4、在SELECT語(yǔ)句中,下列哪種子句用于對(duì)數(shù)據(jù)按照某個(gè)字段74二.填空題1、SELECT語(yǔ)句的子句有__________、_____________、____________、____________、________、_________等。2、連接查詢的類型有__________、_____________、____________等3種。3、內(nèi)連接有__________、_____________、____________等。4、外連接有__________、_____________、____________等。三.簡(jiǎn)答題1.說(shuō)明SELECT語(yǔ)句的基本語(yǔ)法結(jié)構(gòu)。2、使用SELECT語(yǔ)句時(shí),在選擇列表中更改列標(biāo)題有哪三種格式?

二.填空題75四.上機(jī)練習(xí)1.打開(kāi)XSCJ數(shù)據(jù)庫(kù);2.查看學(xué)生基本信息表中的全部信息;3.顯示學(xué)生基本信息表中每位學(xué)生的學(xué)號(hào)、姓名、出生日期;4.從學(xué)生基本信息表中查看政治面貌,要求取消政治面貌代碼相同的行;5.顯示成績(jī)表的前10行;6.從成績(jī)表和課程信息表中查看所有學(xué)生的SQLServer2000數(shù)據(jù)庫(kù)應(yīng)用課程成績(jī);7.從成績(jī)表和課程信息表中查看SQLServer2000數(shù)據(jù)庫(kù)應(yīng)用課程的最高分、最低分、平均成績(jī);8.將成績(jī)表中課程ID=003的課程成績(jī)按降序排序;9.從成績(jī)表中查看課程ID為‘002’、‘003’、‘006’的學(xué)生成績(jī);10.從學(xué)生基本信息表中查看新疆的學(xué)生基本信息;11.查看伊犁的學(xué)生信息;12.查看所有姓馬的學(xué)生信息;13.查看90分以上學(xué)生的成績(jī)、課程名稱、學(xué)生姓名;14.對(duì)所有學(xué)生按學(xué)號(hào)分組并計(jì)算每人本學(xué)期平均成績(jī);15.顯示所有學(xué)生的學(xué)號(hào)、姓名、課程名稱、成績(jī);

四.上機(jī)練習(xí)76項(xiàng)目實(shí)訓(xùn)1.查詢pubs數(shù)據(jù)庫(kù)的authors表中的作者的姓(au_lname)、名(au_fname)和電話號(hào)碼(phone)。2.使用TOP關(guān)鍵字,從Northwind數(shù)據(jù)庫(kù)的customers表中搜索返回前20%的數(shù)據(jù)。3.查詢Northwind數(shù)據(jù)庫(kù)的Orders表中的數(shù)據(jù),并將其中的貨物重量feight增加50%。4.使用WHERE子句從Northwind數(shù)據(jù)庫(kù)的Products表中檢索出所有單位價(jià)格(UnitPrice)超過(guò)50美元的貨物名稱(ProductName)、貨物代號(hào)(ProductID)以及每單位重量(QuantityPerUnit)。5.在Northwind數(shù)據(jù)庫(kù)的Employees表中搜索出職務(wù)(Title)為銷(xiāo)售代表(SalesRepresentative),稱呼(TitleOfCourtesy)為小姐(MS)的所有職員的名(FirstName)、姓(LastName)和生日(BirhthDate)。項(xiàng)目實(shí)訓(xùn)776.查詢?cè)贜orthwind數(shù)據(jù)庫(kù)的Employees表中以字母A作Firstname第一個(gè)字母的雇員的Firstname和Lastname。7.查詢Northwind數(shù)據(jù)庫(kù)Employees表中所有雇員的Firstname和Lastname,并按生日BirthDate從小到大進(jìn)行排列。8.在Northwind數(shù)據(jù)庫(kù)的Products表中查詢出每個(gè)供應(yīng)商(Suppliers)所提供的每一種平均價(jià)格(Unitprice)超過(guò)15美元的產(chǎn)品,并按供應(yīng)商的ID分類。6.查詢?cè)贜orthwind數(shù)據(jù)庫(kù)的Employees表中以78第5章數(shù)據(jù)查詢第5章數(shù)據(jù)查詢79本章學(xué)習(xí)目標(biāo)

l

掌握SELECT語(yǔ)句結(jié)構(gòu)

l

熟練使用SELECT語(yǔ)句查詢數(shù)據(jù)本章學(xué)習(xí)目標(biāo)805.1SELECT語(yǔ)句結(jié)構(gòu)SELECT在任何一種SQL語(yǔ)言中,都是使用頻率最高的語(yǔ)句,它具有強(qiáng)大的查詢功能,有的用戶甚至只需要熟練掌握SELECT語(yǔ)句的一部分,就可以輕松地利用數(shù)據(jù)庫(kù)來(lái)完成自己的工作。可以說(shuō)SELECT是SQL語(yǔ)言的靈魂。SELECT語(yǔ)句的作用是讓數(shù)據(jù)庫(kù)服務(wù)器根據(jù)客戶端的要求搜尋出用戶所需要的信息資料,并按用戶規(guī)定的格式進(jìn)行整理后返回給客戶端。用戶使用SELECT語(yǔ)句除可以查看普通數(shù)據(jù)庫(kù)中的表格和視圖的信息外,還可以查看SQLServer的系統(tǒng)信息。5.1SELECT語(yǔ)句結(jié)構(gòu)81SELECT語(yǔ)句的語(yǔ)法格式如下:

SELECTselect_list

[INTOnew_table_name]

FROMtable_source

[WHEREsearch_condition]

[GROUPBYgroup_by_expression]

[HAVINGsearch_condition]

[ORDERBYorder_expression[ASC|DESC]]

其中:

l

select_list指明要查詢的選擇列表。列表可以包括若干個(gè)列名或表達(dá)式,列名或表達(dá)式之間用逗號(hào)隔開(kāi),用來(lái)指示應(yīng)該返回哪些數(shù)據(jù)。表達(dá)式可以是列名、函數(shù)或常數(shù)的列表。

l

INTOnew_table_name指定用查詢的結(jié)果創(chuàng)建成一個(gè)新表。new_table_name為新表名稱。SELECT語(yǔ)句的語(yǔ)法格式如下:

SELECTselect82l

FROMtable_source指定所查詢的表或視圖的名稱。l

WHEREsearch_condition指明查詢所要滿足的條件。l

GROUPBYgroup_by_expression根據(jù)指定列中的值對(duì)結(jié)果集進(jìn)行分組。l

HAVINGsearch_condition對(duì)用FROM、WHERE或GROUPBY子句創(chuàng)建的中間結(jié)果集進(jìn)行行的篩選。它通常與GROUPBY子句一起使用。l

[ORDERBYorder_expression[ASC|DESC]]對(duì)查詢結(jié)果集中的行重新排序。ASC和DESC關(guān)鍵字分別用于指定按升序或降序排序。如果省略ASC或DESC,則系統(tǒng)默認(rèn)為升序。l

FROMtable_source指定835.2使用SELECT語(yǔ)句查詢數(shù)據(jù)5.2.1使用SELECT子句SELECT子句的語(yǔ)法為:SELECT[ALL|DISTINCT][TOPn[PERCENT][WITHTIES]]<select_list>其中:l

ALL關(guān)鍵字為默認(rèn)設(shè)置,用于指定查詢結(jié)果集的所有行,包括重復(fù)行。l

DISTINCT用于刪除結(jié)果集中重復(fù)的行。l

TOPn[PERCENT]指定只返回查詢結(jié)果集中的前n行。如果加了PERCENT,則表示只返回查詢結(jié)果集中的前n%行。

WITHTIES用于指定從基本結(jié)果集中返回附加的行。

5.2使用SELECT語(yǔ)句查詢數(shù)據(jù)84l

select_list指明要查詢的選擇列表。列表可以包括若干個(gè)列名或表達(dá)式,列名或表達(dá)式之間用逗號(hào)隔開(kāi),用來(lái)指示應(yīng)該返回哪些數(shù)據(jù)。如果使用星號(hào)*則表示返回FROM子句中指定的表或視圖中的所的列。表達(dá)式可以是列名、函數(shù)或常數(shù)的列表。【例5-1】查詢學(xué)生基本信息表中的所有信息。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT*FROM學(xué)生基本信息表GO運(yùn)行結(jié)果如圖5-1所示,它將學(xué)生基本信息表的所有信息均顯示出來(lái)。l

select_list指明要查詢的選85圖5-1查詢學(xué)生基本信息表中的所有信息圖5-1查詢學(xué)生基本信息表中的所有信息86【例5-2】在學(xué)生基本信息表中查詢學(xué)生的學(xué)號(hào)、姓名、性別和族別信息。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT學(xué)號(hào),姓名,性別,族別FROM學(xué)生基本信息表GO

運(yùn)行結(jié)果如圖5-2所示。

圖5-2在學(xué)生基本信息表中查詢學(xué)生的學(xué)號(hào)、姓名、性別和族別信息【例5-2】在學(xué)生基本信息表中查詢學(xué)生的學(xué)號(hào)、姓名、性別和族87【例5-3】從學(xué)生基本信息表中查詢學(xué)生由幾個(gè)民族構(gòu)成。

從例2結(jié)果可知,學(xué)生的族別有多行重復(fù),要快速查詢學(xué)生的民族構(gòu)成,實(shí)際上就是對(duì)相同值的族別只需要顯示一行,可使用DISTINCT關(guān)鍵字實(shí)現(xiàn)。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECTDISTINCT族別FROM學(xué)生基本信息表GO運(yùn)行結(jié)果如圖5-3所示。圖5-3從學(xué)生基本信息表中查詢學(xué)生由幾個(gè)民族構(gòu)成【例5-3】從學(xué)生基本信息表中查詢學(xué)生由幾個(gè)民族構(gòu)成。圖5-88【例5-4】顯示課程信息表中前5行的信息。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECTTOP5*FROM學(xué)生基本信息表GO運(yùn)行結(jié)果如圖5-4所示,只顯示查詢結(jié)果的前5行數(shù)據(jù)。

圖5-4只顯示查詢結(jié)果的前5行數(shù)據(jù)

【例5-4】顯示課程信息表中前5行的信息。圖5-4只顯示89【例5-5】從學(xué)生基本信息表中只顯示5%的信息。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECTTOP5PERCENT*FROM學(xué)生基本信息表GO運(yùn)行結(jié)果如圖5-5所示。學(xué)生基本信息表共有106行數(shù)據(jù),6行約占106行的5%,所以使用TOP5PERCENT檢索前5%的數(shù)據(jù)行,其結(jié)果是只顯示6行信息。

圖5-5顯示基本信息表5%的數(shù)據(jù)行,其結(jié)果是只顯示6行信息【例5-5】從學(xué)生基本信息表中只顯示5%的信息。圖5-5905.2.2使用INTO子句使用INTO子句可以創(chuàng)建一個(gè)新表,并將查詢結(jié)果直接插入到新表中。但是用戶必須在要?jiǎng)?chuàng)建新表的數(shù)據(jù)庫(kù)中擁有CREATETABLE權(quán)限,而且INTO子句不能與COMPUTE子句一起使用?!纠?-6】從學(xué)生基本信息表中查詢所有團(tuán)員的信息資料,并形成新表為團(tuán)員基本信息表。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT*INTO團(tuán)員基本信息表FROM學(xué)生基本信息表WHERE政治面貌='團(tuán)員'GOSELECT*FROM團(tuán)員基本信息表GO運(yùn)行結(jié)果如圖5-6所示。5.2.2使用INTO子句91圖5-6使用INTO子句

圖5-6使用INTO子句925.2.3使用FROM子句

FROM子句用于指定SELECT語(yǔ)句查詢的源表、視圖、派生表和聯(lián)接表,中間用逗號(hào)隔開(kāi)。在FROM子句中最多可以使用16個(gè)表或視圖。【例5-7】從成績(jī)表中查詢學(xué)生成績(jī)。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT*FROM成績(jī)表GO運(yùn)行結(jié)果如圖5-7所示。

5.2.3使用FROM子句93圖5-7使用FROM子句

圖5-7使用FROM子句94【例5-8】從相關(guān)表中查詢每一位學(xué)生的學(xué)號(hào)、姓名、課程名稱、成績(jī)。從各表數(shù)據(jù)可知,“學(xué)號(hào)”存在于“學(xué)生基本信息表”和“成績(jī)表”,“姓名”存在于“學(xué)生基本信息表”,“課程名稱”存在于“課程信息表”,“成績(jī)”存在于“成績(jī)表”,要實(shí)現(xiàn)本例查詢,則需要對(duì)“學(xué)生基本信息表”、“課程信息表”、“成績(jī)表”進(jìn)行多表檢索,也可以來(lái)自不同的數(shù)據(jù)庫(kù)。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT學(xué)生基本信息表.學(xué)號(hào),姓名,課程名稱,成績(jī)FROM學(xué)生基本信息表,課程信息表,成績(jī)表WHERE學(xué)生基本信息表.學(xué)號(hào)=成績(jī)表.學(xué)號(hào)AND課程信息表.課程編號(hào)=成績(jī)表.課程編號(hào)GO運(yùn)行結(jié)果如圖5-8所示。

【例5-8】從相關(guān)表中查詢每一位學(xué)生的學(xué)號(hào)、姓名、課程名稱、95圖5-8從相關(guān)表中查詢每一位學(xué)生的學(xué)號(hào)、姓名、課程名稱、成績(jī)

圖5-8從相關(guān)表中查詢每一位學(xué)生的學(xué)號(hào)、姓名、課程名稱、965.2.4使用WHERE子句

WHERE子句用于指明查詢所要滿足的條件。通常情況下,必須定義一個(gè)或多個(gè)條件限制檢索選擇的數(shù)據(jù)行。WHERE子句后跟邏輯表達(dá)式,結(jié)果集將返回表達(dá)式為真的數(shù)據(jù)行。

在WHERE子句中,可以包含比較運(yùn)算符、邏輯運(yùn)算符。比較運(yùn)算符有:=(等于)、>(大于)、>=(對(duì)于等于)、<(小于)、<=(小于等于)、<>(不等于)、!>(不大于)、!<(不小于)、!=(不等于)。邏輯運(yùn)算符有:NOT(非)、AND(與)、OR(或),用來(lái)連接表達(dá)式。例如“1985年1月1日以后出生的女生”可表示為:出生日期>'1985-01-01'AND性別='女';“成績(jī)60分以上”可表示為:成績(jī)>=60或者WHERENOT(成績(jī)<60)等。

數(shù)據(jù)庫(kù)基礎(chǔ)之?dāng)?shù)據(jù)查詢97【例5-9】在課程信息表中查找“Delphi程序設(shè)計(jì)”課程的任課老師。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT任課教師FROM課程信息表WHERE課程名稱='Delphi程序設(shè)計(jì)'GO運(yùn)行結(jié)果如圖5-9所示。

圖5-9在課程信息表中查找“Delphi程序設(shè)計(jì)”課程的任課老師

圖5-9在課程信息表中查找“Delphi程序設(shè)計(jì)”課程的98【例5-10】查詢少數(shù)民族學(xué)生的基本情況。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT*FROM學(xué)生基本信息表WHERE族別<>'漢族'GO運(yùn)行結(jié)果如圖5-10所示。圖5-10查詢少數(shù)民族學(xué)生的基本情況

【例5-10】查詢少數(shù)民族學(xué)生的基本情況。圖5-10查詢99【例5-11】檢索1985年1月1日以后出生的女生基本信息。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT*FROM學(xué)生基本信息表WHERE出生日期>'1985-01-01'AND性別='女'GO運(yùn)行結(jié)果如圖5-11所示。

圖5-11檢索1985年1月1日以后出生的女生基本信息

【例5-11】檢索1985年1月1日以后出生的女生基本信息。1005.2.5使用GROUPBY子句本子句寫(xiě)在WHERE子句之后,用于對(duì)查詢的結(jié)果集進(jìn)行分組。當(dāng)使用GROUPBY子句進(jìn)行分組時(shí),SELECT子句的選項(xiàng)列表中可以包含聚合函數(shù),但子句后的各列或包含在聚合函數(shù)中或包含在GROUPBY子句中,否則,SQLServer將返回如下錯(cuò)誤信息:“表名.列名在選擇列表中無(wú)效,因?yàn)樵摿屑炔话诰酆虾瘮?shù)中,也不包含在GROUPBY子句中?!?.2.5使用GROUPBY子句101【例5-12】查詢每位同學(xué)的課程門(mén)數(shù)、總成績(jī)、平均成績(jī)。查詢每位學(xué)生的課程成績(jī)情況,實(shí)際上就是按照“學(xué)號(hào)”列分類統(tǒng)計(jì),可使用GROUPBY學(xué)號(hào)子句,統(tǒng)計(jì)課程門(mén)數(shù)、總成績(jī)、平均成績(jī)分別可以使用聚合函數(shù)COUNT(課程編號(hào))、SUM(成績(jī))、AVG(成績(jī))。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT學(xué)號(hào),COUNT(課程編號(hào))AS'課程門(mén)數(shù)',SUM(成績(jī))AS'總成績(jī)',AVG(成績(jī))AS'平均成績(jī)'FROM成績(jī)表GROUPBY學(xué)號(hào)GO運(yùn)行結(jié)果如圖5-12所示。

【例5-12】查詢每位同學(xué)的課程門(mén)數(shù)、總成績(jī)、平均成績(jī)。102圖5-12查詢每位同學(xué)的課程門(mén)數(shù)、總成績(jī)、平均成績(jī)

5.2.6HAVING子句HAVING用于限定組或聚合函數(shù)的查詢條件,通常用在GROUPBY子句之后。通常,其作用與WHERE子句基本一樣。但WHERE子句是對(duì)原始記錄進(jìn)行過(guò)濾,HAVING子句對(duì)查詢結(jié)果進(jìn)行過(guò)濾,而且SELECT子句和HAVING子句中可以使用聚合函數(shù),WHERE子句中不能使用聚合函數(shù)。

圖5-12查詢每位同學(xué)的課程門(mén)數(shù)、總成績(jī)、平均成績(jī)5.103【例5-13】從學(xué)生基本信息表中統(tǒng)計(jì)各民族學(xué)生人數(shù)。此例實(shí)際上是將要對(duì)學(xué)生按民族進(jìn)行分類統(tǒng)計(jì),可使用聚合函數(shù)COUNT(族別)實(shí)現(xiàn)功能。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT族別,COUNT(族別)AS'學(xué)生人數(shù)'FROM學(xué)生基本信息表GROUPBY族別GO運(yùn)行結(jié)果如圖5-13所示。

圖5-13從學(xué)生基本信息表中統(tǒng)計(jì)各民族學(xué)生人數(shù)

【例5-13】從學(xué)生基本信息表中統(tǒng)計(jì)各民族學(xué)生人數(shù)。圖5-1104【例5-14】從學(xué)生基本信息表中統(tǒng)計(jì)漢族學(xué)生的人數(shù)。此例就是在上例統(tǒng)計(jì)出各民族學(xué)生人數(shù)的基礎(chǔ)上進(jìn)一步限定查詢漢族學(xué)生人數(shù),可在GROUPBY子句之后跟HAVING族別='漢族'子句實(shí)現(xiàn)此功能。在查詢分析器中運(yùn)行如下命令:USEXSCJGOSELECT族別,COUNT(族別)AS'學(xué)生人數(shù)'FROM學(xué)生基本信息表GROUPBY族別HAVING族別='漢族'GO運(yùn)行結(jié)果如圖5-14所示。圖5-14從學(xué)生基本信息表中統(tǒng)計(jì)漢族學(xué)生的人數(shù)

【例5-14】從學(xué)生基本信息表中統(tǒng)計(jì)漢族學(xué)生的人數(shù)。圖5-1105此例也可使用WHERE子句完成功能。USEXSCJGOSELECT族別,COUNT(族別)AS'學(xué)生人數(shù)'FROM學(xué)生基本信息表WHERE族別='漢族'GROUPBY族別GO運(yùn)行結(jié)果如圖5-15所示。

圖5-15使用WHERE子句完成功能

此例也可使用WHERE子句完成功能。圖5-15使用WHE106【例5-15】顯示平均成績(jī)大于等于80分以上的學(xué)生情況。此例的限定條件是AVG(成績(jī))>=80,只能使用HAVING子句,如果使用WHERE子句限定條件,則系統(tǒng)會(huì)顯示如圖5-16所示的錯(cuò)誤信息。錯(cuò)誤使用WHERE子句的SELECT語(yǔ)句如下:USEXSCJGOSELECT學(xué)號(hào),AVG(成績(jī))AS'平均成績(jī)'FROM成績(jī)表WHEREAVG(成績(jī))>=80GROUPBY學(xué)號(hào)GO運(yùn)行結(jié)果如圖5-16所示。

圖5-16顯示平均成績(jī)大于等于80分以上的學(xué)生情況

【例5-15】顯示平均成績(jī)大于等于80分以上的學(xué)生情況。圖5107使用HAVING子句的正確語(yǔ)句如下:USEXSCJGOSELECT學(xué)號(hào),AVG(成績(jī))AS'平均成績(jī)'FROM成績(jī)表GROUPBY學(xué)號(hào)HAVINGAVG(成績(jī))>=80GO運(yùn)行結(jié)果如圖5-17所示。

圖5-17使用HAVING子句查詢平均成績(jī)大于等于80分以上的學(xué)生情況

使用HAVING子句的正確語(yǔ)句如下:圖5-17使用HAV1085.2.7ORDERBY子句ORDERBY子句對(duì)查詢結(jié)果集中的行進(jìn)行重新排序。ASC和DESC關(guān)鍵字分別用于指定按升序或降序排序。如果省略ASC或DESC,則系統(tǒng)默認(rèn)為升序??梢栽贠RDERBY子句中指定多個(gè)排序列,即嵌套排序,檢索結(jié)果首先按第1列進(jìn)行排序,對(duì)第1列值相同的那些數(shù)據(jù)行,再按照第2列排序……依此類推。要求ORDER

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論