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

下載本文檔

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

文檔簡介

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

2、如下:SELECT select_list INTO new_table_name FROM table_source WHERE search_condition GROUP BY group_by_expression HAVING search_condition ORDER BY order_expression ASC | DESC 其中: l select_list 指明要查詢的選擇列表。列表可以包括若干個列名或表達(dá)式,列名或表達(dá)式之間用逗號隔開,用來指示應(yīng)該返回哪些數(shù)據(jù)。表達(dá)式可以是列名、函數(shù)或常數(shù)的列表。l INTO new_table_name 指定用查詢的結(jié)果創(chuàng)建成一個新表

3、。new_table_name為新表名稱。lFROM table_source 指定所查詢的表或視圖的名稱。lWHERE search_condition 指明查詢所要滿足的條件。lGROUP BY group_by_expression 根據(jù)指定列中的值對結(jié)果集進(jìn)行分組。l HAVING search_condition 對用FROM、WHERE或GROUP BY子句創(chuàng)建的中間結(jié)果集進(jìn)行行的篩選。它通常與GROUP BY子句一起使用。l ORDER BY order_expression ASC | DESC 對查詢結(jié)果集中的行重新排序。ASC 和DESC關(guān)鍵字分別用于指定按升序或降序排序。

4、如果省略ASC或DESC,則系統(tǒng)默認(rèn)為升序。5.2 使用SELECT語句查詢數(shù)據(jù)5.2.1 使用SELECT子句SELECT子句的語法為:SELECT ALL | DISTINCT TOP n PERCENT WITH TIES 其中:l ALL關(guān)鍵字 為默認(rèn)設(shè)置,用于指定查詢結(jié)果集的所有行,包括重復(fù)行。l DISTINCT 用于刪除結(jié)果集中重復(fù)的行。l TOP n PERCENT 指定只返回查詢結(jié)果集中的前n行。如果加了PERCENT,則表示只返回查詢結(jié)果集中的前n%行。 WITH TIES 用于指定從基本結(jié)果集中返回附加的行。 l select_list 指明要查詢的選擇列表。列表可以包括

5、若干個列名或表達(dá)式,列名或表達(dá)式之間用逗號隔開,用來指示應(yīng)該返回哪些數(shù)據(jù)。如果使用星號*則表示返回FROM子句中指定的表或視圖中的所的列。表達(dá)式可以是列名、函數(shù)或常數(shù)的列表?!纠?-1】查詢學(xué)生基本信息表中的所有信息。在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT * FROM 學(xué)生基本信息表GO運(yùn)行結(jié)果如圖5-1所示,它將學(xué)生基本信息表的所有信息均顯示出來。圖5-1 查詢學(xué)生基本信息表中的所有信息【例5-2】在學(xué)生基本信息表中查詢學(xué)生的學(xué)號、姓名、性別和族別信息。在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT 學(xué)號,姓名,性別,族別 FROM 學(xué)生基本信息表GO

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

7、學(xué)生基本信息表GO運(yùn)行結(jié)果如圖5-4所示,只顯示查詢結(jié)果的前5行數(shù)據(jù)。 圖5-4 只顯示查詢結(jié)果的前5行數(shù)據(jù) 【例5-5】從學(xué)生基本信息表中只顯示5%的信息。在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT TOP 5 PERCENT * FROM 學(xué)生基本信息表GO 運(yùn)行結(jié)果如圖5-5所示。學(xué)生基本信息表共有106行數(shù)據(jù),6行約占106行的5%,所以使用TOP 5 PERCENT檢索前5%的數(shù)據(jù)行,其結(jié)果是只顯示6行信息。 圖5-5 顯示基本信息表5%的數(shù)據(jù)行,其結(jié)果是只顯示6行信息5.2.2 使用INTO子句使用INTO子句可以創(chuàng)建一個新表,并將查詢結(jié)果直接插入到新表中。但是用

8、戶必須在要創(chuàng)建新表的數(shù)據(jù)庫中擁有CREATE TABLE權(quán)限,而且INTO子句不能與COMPUTE子句一起使用?!纠?-6】從學(xué)生基本信息表中查詢所有團(tuán)員的信息資料,并形成新表為團(tuán)員基本信息表。在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT * INTO 團(tuán)員基本信息表 FROM 學(xué)生基本信息表WHERE 政治面貌=團(tuán)員GOSELECT * FROM 團(tuán)員基本信息表GO運(yùn)行結(jié)果如圖5-6所示。圖5-6 使用INTO子句 5.2.3 使用FROM子句 FROM子句用于指定SELECT語句查詢的源表、視圖、派生表和聯(lián)接表,中間用逗號隔開。在FROM子句中最多可以使用16個表或視圖?!?/p>

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

10、稱,成績 FROM 學(xué)生基本信息表,課程信息表,成績表WHERE 學(xué)生基本信息表.學(xué)號=成績表.學(xué)號 AND 課程信息表.課程編號=成績表.課程編號GO運(yùn)行結(jié)果如圖5-8所示。 圖5-8 從相關(guān)表中查詢每一位學(xué)生的學(xué)號、姓名、課程名稱、成績 5.2.4 使用WHERE子句 WHERE子句用于指明查詢所要滿足的條件。通常情況下,必須定義一個或多個條件限制檢索選擇的數(shù)據(jù)行。WHERE子句后跟邏輯表達(dá)式,結(jié)果集將返回表達(dá)式為真的數(shù)據(jù)行。 在WHERE子句中,可以包含比較運(yùn)算符、邏輯運(yùn)算符。比較運(yùn)算符有:=(等于)、(大于)、=(對于等于)、(小于)、=(小于等于)、(不等于)、!(不大于)、!198

11、5-01-01 AND 性別=女;“成績60分以上”可表示為:成績=60或者WHERE NOT (成績60)等。 【例5-9】在課程信息表中查找“Delphi程序設(shè)計(jì)”課程的任課老師。在查詢分析器中運(yùn)行如下命令: USE XSCJGOSELECT 任課教師 FROM 課程信息表WHERE 課程名稱=Delphi程序設(shè)計(jì)GO運(yùn)行結(jié)果如圖5-9所示。 圖5-9 在課程信息表中查找“Delphi程序設(shè)計(jì)”課程的任課老師 【例5-10】查詢少數(shù)民族學(xué)生的基本情況。在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT * FROM 學(xué)生基本信息表WHERE 族別漢族GO運(yùn)行結(jié)果如圖5-10所示。

12、圖5-10 查詢少數(shù)民族學(xué)生的基本情況 【例5-11】檢索1985年1月1日以后出生的女生基本信息。在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT * FROM 學(xué)生基本信息表WHERE 出生日期1985-01-01 AND 性別=女GO運(yùn)行結(jié)果如圖5-11所示。 圖5-11 檢索1985年1月1日以后出生的女生基本信息 5.2.5 使用GROUP BY子句 本子句寫在WHERE子句之后,用于對查詢的結(jié)果集進(jìn)行分組。當(dāng)使用GROUP BY子句進(jìn)行分組時,SELECT子句的選項(xiàng)列表中可以包含聚合函數(shù),但子句后的各列或包含在聚合函數(shù)中或包含在GROUP BY子句中,否則,SQL Se

13、rver將返回如下錯誤信息:“表名.列名在選擇列表中無效,因?yàn)樵摿屑炔话诰酆虾瘮?shù)中,也不包含在GROUP BY子句中?!薄纠?-12】查詢每位同學(xué)的課程門數(shù)、總成績、平均成績。查詢每位學(xué)生的課程成績情況,實(shí)際上就是按照“學(xué)號”列分類統(tǒng)計(jì),可使用GROUP BY 學(xué)號子句,統(tǒng)計(jì)課程門數(shù)、總成績、平均成績分別可以使用聚合函數(shù)COUNT(課程編號)、SUM(成績)、AVG(成績)。在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT 學(xué)號,COUNT(課程編號) AS 課程門數(shù),SUM(成績) AS 總成績,AVG(成績) AS 平均成績 FROM 成績表GROUP BY 學(xué)號GO運(yùn)行結(jié)

14、果如圖5-12所示。 圖5-12 查詢每位同學(xué)的課程門數(shù)、總成績、平均成績 5.2.6 HAVING子句 HAVING用于限定組或聚合函數(shù)的查詢條件,通常用在GROUP BY子句之后。通常,其作用與WHERE子句基本一樣。但WHERE子句是對原始記錄進(jìn)行過濾,HAVING子句對查詢結(jié)果進(jìn)行過濾,而且SELECT子句和HAVING子句中可以使用聚合函數(shù),WHERE子句中不能使用聚合函數(shù)。 【例5-13】從學(xué)生基本信息表中統(tǒng)計(jì)各民族學(xué)生人數(shù)。此例實(shí)際上是將要對學(xué)生按民族進(jìn)行分類統(tǒng)計(jì),可使用聚合函數(shù)COUNT(族別)實(shí)現(xiàn)功能。在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT 族別,COU

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

16、數(shù) 此例也可使用WHERE子句完成功能。USE XSCJGOSELECT 族別,COUNT(族別) AS 學(xué)生人數(shù) FROM 學(xué)生基本信息表WHERE 族別=漢族GROUP BY 族別GO運(yùn)行結(jié)果如圖5-15所示。 圖5-15 使用WHERE子句完成功能 【例5-15】顯示平均成績大于等于80分以上的學(xué)生情況。此例的限定條件是AVG(成績)=80,只能使用HAVING子句,如果使用WHERE子句限定條件,則系統(tǒng)會顯示如圖5-16所示的錯誤信息。錯誤使用WHERE子句的SELECT語句如下:USE XSCJGOSELECT 學(xué)號,AVG(成績) AS 平均成績 FROM 成績表WHERE AVG

17、(成績)=80GROUP BY 學(xué)號GO運(yùn)行結(jié)果如圖5-16所示。 圖5-16 顯示平均成績大于等于80分以上的學(xué)生情況 使用HAVING子句的正確語句如下:USE XSCJGOSELECT 學(xué)號,AVG(成績) AS 平均成績 FROM 成績表GROUP BY 學(xué)號HAVING AVG(成績)=80GO運(yùn)行結(jié)果如圖5-17所示。 圖5-17 使用HAVING子句查詢平均成績大于等于80分以上的學(xué)生情況 5.2.7 ORDER BY子句 ORDER BY子句對查詢結(jié)果集中的行進(jìn)行重新排序。ASC 和DESC關(guān)鍵字分別用于指定按升序或降序排序。如果省略ASC或DESC,則系統(tǒng)默認(rèn)為升序??梢栽贠

18、RDER BY子句中指定多個排序列,即嵌套排序,檢索結(jié)果首先按第1列進(jìn)行排序,對第1列值相同的那些數(shù)據(jù)行,再按照第2列排序依此類推。要求ORDER BY子句要寫在WHERE子句的后面,而且在ORDER BY子句中不能使用ntext、text和image列。【例5-16】將學(xué)生平均成績按升序排序。 在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT 學(xué)號,AVG(成績) AS 平均成績 FROM 成績表GROUP BY 學(xué)號ORDER BY AVG(成績)GO運(yùn)行結(jié)果如圖5-18所示,省略關(guān)鍵字ASC,系統(tǒng)默認(rèn)為升序排序。 圖5-18 將學(xué)生平均成績按升序排序 【例5-17】查詢成績表

19、中的全部信息,要求查詢結(jié)果首先按學(xué)號升序排序,學(xué)號相同時,按成績降序排序。 在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT * FROM 成績表ORDER BY 學(xué)號,成績 DESCGO 運(yùn)行結(jié)果如圖5-19所示。 圖5-19 查詢成績表中的全部信息 5.2.8 使用COMPUTE子句 COMPUTE子句用在WHERE子句之后,用來計(jì)算總計(jì)并進(jìn)行分組小計(jì),可使用聚合函數(shù),總計(jì)值或小計(jì)值將作為附加新行出現(xiàn)在檢索結(jié)果中。使用COMPUTE子句時必須使用ORDER BY對COMPUTE BY中BY指定的列進(jìn)行排序,否則將出現(xiàn)錯誤信息。 【例5-18】按學(xué)號顯示學(xué)生成績,并計(jì)算每人的平均

20、成績和總成績。 此例要求按人對課程及成績進(jìn)行分組顯示,并計(jì)算每人的平均成績、總成績。則顯示成績應(yīng)按學(xué)號分類,分組計(jì)算平均成績、總成績的語句為COMPUTE AVG(成績),SUM(成績) BY 學(xué)號,使用COMPUTE BY子句首先要用ORDER BY子句對要分組的學(xué)號列排序,即ORDER BY 學(xué)號。在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT *FROM 成績表ORDER BY 學(xué)號COMPUTE AVG(成績),SUM(成績) BY 學(xué)號GO運(yùn)行結(jié)果如圖5-20所示。 圖5-20 按學(xué)號顯示學(xué)生成績,并計(jì)算每人的平均成績和總成績 5.3 使用其它子句或關(guān)鍵字查詢數(shù)據(jù)5.3

21、.1 聯(lián)合查詢 聯(lián)合查詢是指將兩個或兩個以上的SELECT語句通過UNION運(yùn)算符連接起來的查詢。聯(lián)合查詢可以將兩個或更多查詢的結(jié)果組合為單個結(jié)果集,該結(jié)果集包含聯(lián)合查詢中所有查詢的全部行。使用UNION組合多個查詢的結(jié)果時,必須注意:所有查詢中的列數(shù)和列的順序必須相同且數(shù)據(jù)類型必須兼容?!纠?-19】從系部表中檢索系部名稱,從班級表中檢索班級名稱。從系部表中檢索系部名稱的SELECT語句為:SELECT 系部名稱 FROM 系部表,從班級表中檢索班級名稱的SELECT語句為:SELECT 班級名稱 FROM 班級表,合并這兩個查詢結(jié)果,需要使用UNION運(yùn)算符。在查詢分析器中運(yùn)行如下命令:

22、USE XSCJGOSELECT 系部名稱 FROM 系部表UNIONSELECT 班級名稱 FROM 班級表GO 運(yùn)行結(jié)果如圖5-21所示,UNION結(jié)果集的列標(biāo)題取自第一個SELECT語句。 圖5-21 UNION結(jié)果集的列標(biāo)題取自第一個SELECT語句 5.3.2 檢索某一范圍內(nèi)的信息 檢索在某一范圍內(nèi)的信息,需要使用WHERE子句限定查詢條件,這個條件通常是一個邏輯表達(dá)式。在表達(dá)式中除了可以使用比較運(yùn)算符=(等于)、(大于)、(不等于)等外,還可使用范圍運(yùn)算符BETWEEN、NOT BETWEEN、IN、LIKE、IS NULL等,邏輯運(yùn)算符NOT(非)、OR(或)、AND(與)等來限

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

24、不及格學(xué)生成績信息,也就是查詢059之間的學(xué)生成績,可用BETWEEN關(guān)鍵字表示為:WHERE 成績 BETWEEN 0 AND 59。在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT * FROM 成績表WHERE 成績 BETWEEN 0 AND 59GO運(yùn)行結(jié)果如圖5-23所示。圖5-23 查詢不及格學(xué)生成績信息 2使用IN關(guān)鍵字 IN關(guān)鍵字允許用戶選擇與列表中的值相匹配的行,指定項(xiàng)必須用括號括起來,并用逗號隔開,表示“或”的關(guān)系。NOT IN表示含義正好相反。 【例5-22】查詢課程編號為002、003、007、014的課程編號、課程名稱、任課教師和上課時間。課程編號為00

25、2、003、007、014可以寫成:WHERE 課程編號 IN(002,003,007,014),也可寫成WHERE 課程編號=002 OR課程編號=003 OR課程編號=007 OR課程編號=014 。顯然,使用IN關(guān)鍵字進(jìn)行檢索比使用3個OR運(yùn)算符進(jìn)行檢索更為簡單,而且易于理解和閱讀。在查詢分析器中運(yùn)行如下命令: USE XSCJGOSELECT 課程編號,課程名稱,任課教師,上課時間 FROM 課程信息表WHERE 課程編號 IN(002,003,007,014) GO運(yùn)行結(jié)果如圖5-24所示 圖5-24 查詢課程編號為002、003、007、014的課程編號、課程名稱、任課教師和上課時

26、間 在查詢分析器中運(yùn)行以下命令,也可得到相同的查詢結(jié)果,但這種寫法顯然比較繁瑣。USE XSCJGOSELECT 課程編號,課程名稱,任課教師,上課時間 FROM 課程信息表WHERE 課程編號=002 OR課程編號=003 OR課程編號=007 OR課程編號=014 GO3使用LIKE關(guān)鍵字 LIKE關(guān)鍵字用于查詢與指定的某些字符串表達(dá)式模糊匹配的數(shù)據(jù)行。LIKE后的表達(dá)式被定義為字符串,必須用單引號()括起來,字符串中可以使用4種通配符。它們是:l %:可匹配任意類型和長度的字符串。l _(下劃線):可匹配任何單個字符。l :指定范圍或集合中的任何單個字符。l :不屬于指定范圍或集合的任何

27、單個字符。 例如:LIKE 劉%匹配以“劉”開始的字符串;LIKE %技術(shù)%匹配的是前后字符為任意,中間含有“技術(shù)”兩個字的字符串;LIKE _秀%匹配的是第2個字為“秀”的任意字符串。 a-i匹配的是a、b、c、d、e、f、g、h、I單個字符;LIKE mw-z %匹配所有以字母m開始并且第2個字母不為w、x、y、z的所有字符串。 【例5-23】檢索所有姓劉的學(xué)生基本信息。匹配所有姓劉的學(xué)生可以表示為:姓名 LIKE 劉%。在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT * FROM 學(xué)生基本信息表WHERE 姓名 LIKE 劉% GO運(yùn)行結(jié)果如圖5-25所示。 圖5-25 檢

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

29、5-27所示。 圖5-27 檢索少數(shù)民族學(xué)生的基本信息 【例5-26】查詢第2 個字為“麗”的學(xué)生信息。在學(xué)生基本信息表中,匹配第2 個字為“麗”的學(xué)生姓名應(yīng)表示為:姓名 LIKE _麗%。在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT * FROM 學(xué)生基本信息表WHERE 姓名 LIKE _麗% GO運(yùn)行結(jié)果如圖5-28所示。 圖5-28 查詢第2 個字為“麗”的學(xué)生信息 4、使用IS NULL關(guān)鍵字IS NULL 關(guān)鍵字可以檢索數(shù)據(jù)列中沒有賦值的行?!纠?-27】查詢課程信息表中教師未定的課程信息。課程信息表中教師未定的表達(dá)式可以表示為:WHERE 任課教師 IS NULL

30、。在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT * FROM 課程信息表WHERE 任課教師 IS NULL GO運(yùn)行結(jié)果如圖5-29所示,因?yàn)闆]有任課教師為空(NULL)的課程,所以查詢結(jié)果為0行。圖5-29 查詢課程信息表中教師未定的課程信息 5.3.3 指定結(jié)果集的列的別名有時需要為查詢結(jié)果集中的某些列增加可讀性或者為沒有名稱的導(dǎo)出列指定名稱,可使用AS子句。【例5-28】統(tǒng)計(jì)成績表中各門課程的學(xué)生人數(shù)、總成績、平均成績。統(tǒng)計(jì)成績表中各門課程信息,需要將學(xué)生成績按課程編號分組GROUP BY 課程編號,統(tǒng)計(jì)學(xué)生人數(shù)、總成績、平均成績分別需要使用聚合函數(shù)COUNT(學(xué)號)、

31、SUM(成績)、AVG(成績)。因?yàn)樾律傻膶W(xué)生人數(shù)、總成績、平均成績?nèi)袥]有列名,所以可使用AS子句實(shí)現(xiàn)。 在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT 課程編號,COUNT(學(xué)號) AS 學(xué)生人數(shù),SUM(成績) AS 總成績,AVG(成績) AS 平均成績 FROM 成績表GROUP BY 課程編號GO運(yùn)行結(jié)果如圖5-30所示。 圖5-30 統(tǒng)計(jì)成績表中各門課程的學(xué)生人數(shù)、總成績、平均成績 5.3.4 子查詢子查詢是在查詢中包含另一個查詢的查詢。它本身是一個SELECT查詢,可以代替表達(dá)式出現(xiàn)在WHERE子句中。它返回單個值且嵌套在 SELECT、INSERT、UPDAT

32、E、DELETE 語句或其它子查詢中。任何允許使用表達(dá)式的地方都可以使用子查詢。子查詢的 SELECT 查詢總是使用圓括號括起來,且不能包括 COMPUTE子句,如果同時指定 TOP 子句,則可能只包括 ORDER BY 子句。 【例5-37】檢索單科成績高于全班平均分的學(xué)生成績信息。此例中,全班平均成績?yōu)镾ELECT AVG(成績) AS 平均成績 FROM 成績表,單科成績高于全班平均分可以表述為WHERE 成績(SELECT AVG(成績) FROM 成績表)。在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT AVG(成績) AS 平均成績 FROM 成績表GOSELECT

33、* FROM 成績表WHERE 成績(SELECT AVG(成績) FROM 成績表)GO運(yùn)行結(jié)果如圖5-39所示。 圖5-39 檢索單科成績高于全班平均分的學(xué)生成績信息 5.4 連接查詢用戶在前面所作的查詢大多是對單個表進(jìn)行的查詢,而在數(shù)據(jù)庫的應(yīng)用中,經(jīng)常需要從多個相關(guān)的表中查詢數(shù)據(jù),這就需要使用連接查詢。用戶通過連接可以使用一個表中的數(shù)據(jù)來查詢其他表的數(shù)據(jù),從而大大增加了靈活性。由于連接涉及多個表及其之間的引用,所以列的引用均必須明確,對于重復(fù)的列名必須用表名限定。對多個表或視圖進(jìn)行查詢,需要在FROM子句或WHERE子句中定義連接條件。在FROM子句中定義連接的語法形式為:FROM 表1

34、 連接類型 JOIN 表2 ON 表1.列=表2.列在WHERE子句中定義連接的語法形式為:FROM 表1,表2WHERE表1.列 連接操作 表2.列但由于在FROM子句中指定連接條件有助于區(qū)分連接條件與WHERE子句中指定的搜索條件,所以建議使用FROM子句的方法。連接的類型有內(nèi)連接、外連接、交叉連接3種。5.4.1 內(nèi)聯(lián)接內(nèi)連接(INNER JOIN)是組合兩個表的常用方法,它將兩個表中的列進(jìn)行比較,將兩個表中滿足連接條件的行組合起來,作為結(jié)果。內(nèi)連接有等值連接、自然連接和不等值連接3種。1相等連接相等連接是將要連接的列值使用等值運(yùn)算符(=)作相等比較后所作的連接,返回所有列(包括重復(fù)列)

35、。因?yàn)檫B接的列要顯示兩次,所以會產(chǎn)生冗余。【例5-29】檢索系部信息和班級信息。此例要檢索系部表和班級表的所有信息,即顯示兩個表的所有信息??稍赟ELECT子句中使用*、系部表.*或班級表.*,連接條件是兩個表的系部編號的值要相等,即系部表.系部編號=班級表.系部編號。 在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT * FROM 系部表,班級表WHERE 系部表.系部編號=班級表.系部編號GO運(yùn)行結(jié)果如圖5-31所示,檢索結(jié)果中有完全相同的兩列系部編號,數(shù)據(jù)產(chǎn)生了冗余。 5-31 檢索系部信息和班級信息 使用ANSI連接語法的SELECT語句如下:USE XSCJGOSELEC

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

37、 5-32 檢索系部信息和班級信息,要求連接的列只顯示一次 使用ANSI連接語法的SELECT語句如下:USE XSCJGOSELECT 系部表.*,班級編號,班級名稱 FROM 系部表 INNER JOIN 班級表ON 系部表.系部編號=班級表.系部編號GO運(yùn)行結(jié)果與圖5-32所示相同。3、不等值連接不等值連接就是在連接時不使用等值運(yùn)算符,而采用比較運(yùn)算符進(jìn)行連接。【例5-31】檢索沒有錄入成績的課課程情況。在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT DISTINCT 課程信息表.* FROM 課程信息表,成績表WHERE 課程信息表.課程編號成績表.課程編號GO運(yùn)行結(jié)果如

38、圖5-33所示。 5-33 檢索沒有錄入成績的學(xué)生基本信息 5.4.2 外連接外連接(OUTER JOIN)只限制一個表,而對另外一個表不加限制(即所有的行都出現(xiàn)在結(jié)果集中)。外連接分為左外連接(LEFT OUTER JOIN)、右外連接(RIGHT OUTER JOIN)和全外連接(FULL OUTER JOIN)。括號中為使用FROM子句定義外連接的關(guān)鍵字,使用中可以省略O(shè)UTER。1、左外連接(LEFT OUTER JOIN)左外連接對連接條件中左邊的表不加限制。左外連接需要在FROM子句中采用下列語法格式:FROM 左表名 LEFT OUTER JOIN 右表名 ON 連接條件 【例5

39、-32】使用左外連接檢索學(xué)生成績信息(學(xué)號,姓名,課程名稱)。 在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT 學(xué)號,課程信息表.課程編號,課程信息表.課程名稱,成績 FROM 課程信息表 LEFT JOIN 成績表 ON 課程信息表.課程編號=成績表.課程編號GO運(yùn)行結(jié)果如圖5-34所示(所影響的行數(shù)為 343 行)。 圖5-34 使用左外連接檢索學(xué)生成績信息 2右外連接(RIGHT OUTER JOIN)右外連接對右邊的表不加限制。右外連接需要在FROM子句采用下列語法格式:FROM 左表名 RIGHT OUTER JOIN 右表名 ON 連接條件【例5-33】使用右外連接檢

40、索學(xué)生成績信息(學(xué)號,姓名,課程名稱)。 在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT 學(xué)號,課程信息表.課程編號,課程信息表.課程名稱,成績 FROM 課程信息表 RIGHT JOIN 成績表 ON 課程信息表.課程編號=成績表.課程編號GO運(yùn)行結(jié)果如圖5-35所示(所影響的行數(shù)為 322 行)。 圖5-35 使用右外連接檢索學(xué)生成績信息3、全外連接(FULL OUTER JOIN)全外連接對兩個表都不加限制,所有兩個表中的行都會包括在結(jié)果集中。使用全外連接需要在FROM子句采用下列語法格式:FROM 左表名 FULL OUTER JOIN 右表名 ON 連接條件【例5-34

41、】使用全外連接檢索學(xué)生成績信息(學(xué)號,姓名,課程名稱)。 在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT 學(xué)號,課程信息表.課程編號,課程信息表.課程名稱,成績 FROM 課程信息表 FULL JOIN 成績表 ON 課程信息表.課程編號=成績表.課程編號GO運(yùn)行結(jié)果如圖5-36所示(所影響的行數(shù)為 343 行)。 圖5-36 使用全外連接檢索學(xué)生成績信息 5.4.3 交叉聯(lián)接(CROSS JOIN)交叉連接也叫非限制連接,它將兩個表不加任何約束地組合起來。在數(shù)學(xué)上,就是兩個表的笛卡爾積。交叉連接后得到的結(jié)果集的行數(shù)是兩個被連接表的行數(shù)的乘積?!纠?-35】計(jì)算系部表和班級表的交

42、叉連接。在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT * FROM 班級表 CROSS JOIN 系部表GO運(yùn)行結(jié)果如圖5-37所示,檢索結(jié)果為48行,由班級表的8行和系部表的6行組合而成(68=48),由連接結(jié)果可以看出,這種交叉連接的結(jié)果沒有實(shí)際意義。 圖5-37 計(jì)算系部表和班級表的交叉連接此例也可用FROM子句寫成如下語句,運(yùn)行結(jié)果相同。USE XSCJGOSELECT * FROM 班級表,系部表GO 在實(shí)際應(yīng)用中使用交叉連接產(chǎn)生的結(jié)果集一般沒有什么意義,但在數(shù)據(jù)庫的數(shù)學(xué)模式上有重要的作用。5.4.4 自聯(lián)接(SELF JOIN)自連接就是一個表與它自身的不同行進(jìn)行連

43、接。因?yàn)楸砻贔ROM子句中出現(xiàn)兩次,所以需要對表指定兩個別名,使之在邏輯上成為兩張表。在SELECT子句中引用的列名也要使用表的別名進(jìn)行限定?!纠?-36】查找同名同姓的學(xué)生信息。該例是對學(xué)生基本信息表進(jìn)行行自連接,這里將學(xué)生基本信息表分別定義別名為A1、A2,將FROM子句寫成FROM 學(xué)生基本信息表 A1,學(xué)生基本信息表 A2,連接條件為WHERE A1.姓名=A2.姓名 AND A1.學(xué)號A2.學(xué)號。 在查詢分析器中運(yùn)行如下命令:USE XSCJGOSELECT A1.* FROM 學(xué)生基本信息表 A1,學(xué)生基本信息表 A2WHERE A1.姓名=A2.姓名 AND A1.學(xué)號A2.

44、學(xué)號GO運(yùn)行結(jié)果如圖5-38所示 圖5-38 使用自連接查找同名同姓的學(xué)生信息 本章小結(jié) 本章主要介紹了SELECT語句在數(shù)據(jù)查詢中的應(yīng)用技術(shù),SELECT語句在SQL語言中功能最為強(qiáng)大,應(yīng)用最為廣泛。要求同學(xué)們掌握SELECT語句結(jié)構(gòu),能夠熟練使用SELECT語句查詢數(shù)據(jù)。練習(xí)與上機(jī)一選擇題1、在SELECT語句中,下列哪種子句用于選擇列表( )。A、SELECT子句 B、INTO子句 C、FROM 子句 D、WHERE子句2、在SELECT語句中,下列哪種子句用于將查詢結(jié)果存儲在一個新表中( )。A、SELECT子句 B、INTO子句 C、FROM 子句 D、WHERE子句3、在SELEC

45、T語句中,下列哪種子句用于指出所查詢的數(shù)據(jù)表名( )。A、SELECT子句 B、INTO子句 C、FROM 子句 D、WHERE子句4、在SELECT語句中,下列哪種子句用于對數(shù)據(jù)按照某個字段分組( )。A、SELECT子句 B、INTO子句 C、FROM 子句 D、WHERE子句 5、在SELECT語句中,下列哪種子句用于對分組統(tǒng)計(jì)進(jìn)一步設(shè)置條件( )。A、HAVING子句 B、GROUP BY 子句 C、ORDER BY 子句 D、WHERE子句 6、在SELECT語句中,下列哪種子句用于對搜索的結(jié)果進(jìn)行排序( )。A、HAVING子句 B、GROUP BY 子句 C、ORDER BY 子

46、句 D、WHERE子句 7、在SELECT語句中,如果想要返回的結(jié)果集中不包含相同的行,應(yīng)該使用關(guān)鍵字( )。A、TOP B、AS C、 DISTINCT D、JOIN二填空題1、SELECT語句的子句有_、_、_、_、_、_等。2、連接查詢的類型有_、_、_等3種。3、內(nèi)連接有_、_、_等。4、外連接有_、_、_等。三簡答題1說明SELECT語句的基本語法結(jié)構(gòu)。2、使用SELECT語句時,在選擇列表中更改列標(biāo)題有哪三種格式? 四上機(jī)練習(xí)1打開XSCJ數(shù)據(jù)庫;2查看學(xué)生基本信息表中的全部信息;3顯示學(xué)生基本信息表中每位學(xué)生的學(xué)號、姓名、出生日期;4從學(xué)生基本信息表中查看政治面貌,要求取消政治面

47、貌代碼相同的行;5顯示成績表的前10行;6從成績表和課程信息表中查看所有學(xué)生的SQL Server 2000數(shù)據(jù)庫應(yīng)用課程成績;7從成績表和課程信息表中查看SQL Server 2000數(shù)據(jù)庫應(yīng)用課程的最高分、最低分、平均成績;8將成績表中課程ID=003的課程成績按降序排序;9從成績表中查看課程ID為002、003、006的學(xué)生成績;10從學(xué)生基本信息表中查看新疆的學(xué)生基本信息;11查看伊犁的學(xué)生信息;12查看所有姓馬的學(xué)生信息;13查看90分以上學(xué)生的成績、課程名稱、學(xué)生姓名;14對所有學(xué)生按學(xué)號分組并計(jì)算每人本學(xué)期平均成績;15顯示所有學(xué)生的學(xué)號、姓名、課程名稱、成績; 項(xiàng)目實(shí)訓(xùn)1查詢p

48、ubs數(shù)據(jù)庫的authors表中的作者的姓(au_lname)、名(au_fname)和電話號碼(phone)。2使用TOP關(guān)鍵字,從Northwind數(shù)據(jù)庫的customers表中搜索返回前20%的數(shù)據(jù)。3查詢Northwind數(shù)據(jù)庫的Orders表中的數(shù)據(jù),并將其中的貨物重量feight增加50%。4使用WHERE 子句從Northwind 數(shù)據(jù)庫的Products表中檢索出所有單位價格(UnitPrice)超過50美元的貨物名稱(Product Name )、貨物代號(ProductID)以及每單位重量(QuantityPerUnit)。5在Northwind 數(shù)據(jù)庫的Employees

49、表中搜索出職務(wù)(Title)為銷售代表(Sales Representative),稱呼(TitleOfCourtesy)為小姐(MS)的所有職員的名(FirstName)、姓(LastName)和生日(BirhthDate)。6查詢在Northwind數(shù)據(jù)庫的Employees表中以字母A作Firstname第一個字母的雇員的Firstname和Lastname。7查詢Northwind數(shù)據(jù)庫Employees表中所有雇員的Firstname和Lastname,并按生日BirthDate從小到大進(jìn)行排列。8在Northwind數(shù)據(jù)庫的Products表中查詢出每個供應(yīng)商(Suppliers)所提供的每一種平均價格(Unitprice)超過15美元的產(chǎn)品,并按供應(yīng)商的ID分類。5、世上最美好的事是:我已經(jīng)長大,父母還未老;我有能力報答,父母仍然健康。6、沒什么可怕的,大家都一樣,在試探中不斷前行。7、時間就像一張網(wǎ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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論