sql查詢語句基礎(chǔ).ppt_第1頁
sql查詢語句基礎(chǔ).ppt_第2頁
sql查詢語句基礎(chǔ).ppt_第3頁
sql查詢語句基礎(chǔ).ppt_第4頁
sql查詢語句基礎(chǔ).ppt_第5頁
已閱讀5頁,還剩80頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、SQL查詢語句基礎(chǔ),1 SELECT 條件列表 2 FROM子句 3 WHERE子句 4 統(tǒng)計 5 利用查詢結(jié)果創(chuàng)建新表 6 使用UNION運算符實現(xiàn)多查詢聯(lián)合 7 連接 8 子查詢, 本章要點:,掌握簡單的Transact-SQL查詢語句。 學(xué)會對查詢結(jié)果進行分組統(tǒng)計、合計和排序等復(fù)雜的SELECT語句操作。,1 SELECT 條件列表,一、基本結(jié)構(gòu) SELECT 記錄顯示范圍 字段列表 INTO 新表名 FROM 表名或表名列表及其連接方式 WHERE 條件表達式 GROUP BY 分組字段名列表 HAVING 分組條件表達式 ORDER BY 排序字段名列表 ASC | DESC COM

2、PUTE 集合函數(shù)(列名1) BY 列名2 n 說明: SELECT語句中各子句的順序: SELECT 記錄范圍 字段列表 INTO FROM WHERE GROUP BY HAVING ORDER BY COMPUTE lFROM用于指定數(shù)據(jù)來源: 單表查詢簡單格式:FROM 表名 多表查詢時的格式:FROM 表名列表及其連接方式 lCOMPUTE子句不能與INTO子句或GROUP BY子句同時使用。,SELECT 條件列表,(1) SELECT子句:指明目標列(字段、表達式、函數(shù)表達式、常量)?;颈碇邢嗤牧忻硎緸椋罕砻?列名 (2) FROM子句:指明數(shù)據(jù)源。表間用“,”分割。數(shù)據(jù)源

3、不在當前數(shù)據(jù)庫中,使用“數(shù)據(jù)庫名.表名”表示。一表多用,用別名標識。定義表別名:表名別名 (3) WHERE子句:元組選擇條件。 (4) GROUP BY子句:結(jié)果集分組。當目標列中有統(tǒng)計函數(shù),則統(tǒng)計為分組統(tǒng)計,否則為對整個結(jié)果集統(tǒng)計。子句后帶上HAVING子句表達組選擇條件(帶函數(shù)的表達式)。 (5) ORDER BY子句:排序。當排序要求為ASC時升序排序;排序要求為DESC時降序排列。,2. SELECT語句的操作符,(1) 算術(shù)操作符+(加號)、(減號)、*(乘號)和 /(除號)。 (2) 比較操作符=(等于)、(大于)、=(大于等于)、!=(不等于)、(小于大于)、!(不大于)和 !

4、(不小于),共9種操作符。,(3) 邏輯操作符,組合查詢操作符,查詢1組合操作符查詢2 1) UNION:并查詢,并在結(jié)果集中去掉重復(fù)行。 2) MINUS:差查詢操作。 3) INTERSECT:交查詢操作。,一些關(guān)鍵字,*:取全部字段。格式為: * 或表名.* ALL:全部。保留重復(fù)值(有統(tǒng)計函數(shù)時要求計算重復(fù)值)。 格式為: ALL字段或 ALL字段組 DISTINCT:去掉重復(fù)值。在結(jié)果集中去掉重復(fù)值,或在統(tǒng)計函數(shù)中不計重復(fù)值。 格式為: DISTINCT字段或 DISTINCT字段組,SELECT 條件列表選擇表中的若干列,查詢?nèi)苛?星號 * :按關(guān)系模式中屬性的順序排列。 顯式列

5、出屬性名:按用戶順序排列。 顯示雇員表中所有列的數(shù)據(jù)。 SELECT * from 學(xué)生 顯示雇員表中的雇員ID和姓名列的內(nèi)容 SELECT 學(xué)號, 姓名 From 學(xué)生 SELECT * from 圖書 SELECT 書號,書名 From 圖書,數(shù)據(jù)查詢實例,【例5-9】求數(shù)學(xué)系學(xué)生的學(xué)號和姓名。 SELECT 學(xué)號,姓名 FROM 學(xué)生 WHERE 所在系=數(shù)學(xué)系; 【例5-10】求選修了課程的學(xué)生學(xué)號。 SELECT DISTINCT 學(xué)號 FROM 選課;,選擇表中的若干列,更名 為結(jié)果集中的某個屬性改名 使結(jié)果集更具可讀性 其格式為; 列標題列名 或者: 列名 AS 列標題 SELE

6、CT 類別書目分類 ,作者 AS 姓名 From 圖書,消除取值重復(fù)的行,Select 子句的缺省情況是保留重復(fù)元組 ( ALL ),可用 Distinct 去除重復(fù)元組 SELECT 出版社 From 圖書 SELECT DISTINCT 出版社 From 圖書,指定當前數(shù)據(jù)庫,在缺省情況下,F(xiàn)ROM子句不指定數(shù)據(jù)庫名稱,查詢的數(shù)據(jù)庫為當前數(shù)據(jù)庫。使用USE語句可以將其他數(shù)據(jù)庫設(shè)置為當前數(shù)據(jù)庫,USE語句的格式為: USE 數(shù)據(jù)庫名,3 WHERE子句,SELECT 語句中的WHERE子句用來指定查詢條件。 【例5-11】求選修C1課程的學(xué)生學(xué)號和成績,并要求對查詢結(jié)果按成績的降序排列,如果

7、成績相同則按學(xué)號的升序排列。 SELECT 學(xué)號,成績 FROM 選課 WHERE 課程號=C1 ORDER BY 成績 DESC,學(xué)號 ASC; dessent,Where 子句確定范圍,BETWEEN關(guān)鍵字指定WHERE子句的搜索范圍,其格式為: BETWEEN X AND Y 查詢時,它要求表達式的值大于等于X小于等于Y。 【例5-12】求選修課程C1且成績在8090之間的學(xué)生學(xué)號和成績,并將成績乘以系數(shù)0.8輸出。 SELECT 學(xué)號,成績*0.8 FROM 選課 WHERE 課程號 = C1 AND 成績 BETWEEN 80 AND 90;,Where 子句確定集合,謂詞IN可以用

8、來查找屬性值屬于指定集合的元組。 NOT IN用來查找屬性值不屬于指定集合的元組。 【例5-13】求數(shù)學(xué)系或計算機系姓張的學(xué)生的信息。 SELECT * FROM 學(xué)生 WHERE 所在系 IN ( 數(shù)學(xué),計算機) AND 姓名 LIKE 張%;,關(guān)于空值,空值意味著用戶沒有輸入值,它既不代表空格也不為0,空值與任何數(shù)據(jù)運算或比較時,其結(jié)果仍為空,空值之間也不能匹配。所以在WHERE子句不能使用比較運算符對空值進行比較判斷,而只能使用空值判斷符ISNOTNULL來判斷表達式的值是否為空。 【例5-14】求缺少了成績的學(xué)生的學(xué)號和課程號。 update 選課 set 成績=null where

9、學(xué)號=s2 and 課程號=c2 update 選課 set 成績=null where 學(xué)號=s3 and 課程號=c1 SELECT 學(xué)號,課程號 FROM 選課 WHERE 成績 IS NULL;,Where 子句模式匹配符 Like,模式匹配符NOT LIKE 常用于模糊查詢,它判斷列值是否與指定的字符串格式匹配。在SQL Server中可使用的匹配符有以下幾種: 百分號(%):可匹配任意類型和長度的字符。 下劃線(_):匹配單個任意字符。 方括號 :指定一個字符、字符串或范圍,要求所匹配對象為它們中的任何一個。 :與取值相同,但要求所匹配的對象為指定范圍以外的任何一個字符。,示例,例

10、6.15 :利用通配符%來查找雇員表中姓“張”的雇員的所有列信息。 SELECT * FROM 學(xué)生 WHERE 姓名 LIKE 張% SELECT * FROM 學(xué)生 WHERE 所在系 IN ( 數(shù)學(xué),計算機) AND 姓名 LIKE 張%; 利用通配符”%”和”_”來查找學(xué)生表中姓名的第二個字為“雪”的學(xué)生的所有列信息。 SELECT * FROM 學(xué)生 WHERE 姓名 LIKE _明%,示例,利用通配符”%”和,來查找學(xué)生表中姓名的第一個字為“張”或者“王”或者“趙”或者“孫”的學(xué)生的所有列信息。 SELECT * FROM 學(xué)生 WHERE 姓名 LIKE 張,王,趙,孫% 利用通

11、配符”%”和”_”來查找學(xué)生表中姓名的第二個字不是“雪”的學(xué)生的所有列信息。 SELECT * FROM 學(xué)生 WHERE 姓名 not LIKE _明%,Order By子句(對查詢結(jié)果排序),指定結(jié)果集中元組的排列次序 耗時 ASC(缺?。?、DESC 對于空值,若升序,含空值的元組最先顯示;若降序,則反之。 按成績高低來排序?按姓名排序: SELECT * FROM 學(xué)生 order by 姓名,2. 連接查詢,若一個查詢同時涉及兩個以上的表,則稱之為連接查詢,包括: 內(nèi)連接 自連接 外連接 復(fù)合條件連接,2. 連接查詢,連接查詢中的連接條件通過WHERE子句表達,連接條件和元組選擇條件之

12、間用AND(與)操作符銜接。 (1) 等值連接和非等值連接 表名1.列名1比較運算符表名2.列名2 比較運算符:=、=、= 、!=; 列名稱為連接字段。 【例5-15】查詢每個學(xué)生的情況以及他(她)所選修的課程。 SELECT 學(xué)生.*,選課.* FROM 學(xué)生,選課 WHERE 學(xué)生.學(xué)號=選課.學(xué)號;,內(nèi)連接(自然連接),自然連接,只將兩個表中滿足指定條件的記錄連接成一條新記錄,舍棄所有不滿足條件沒有進行連接的記錄。 格式一: SELECT 列名列表 FROM 表名1 inner Join 表名2 ON 表名1.列名=表名2 .列名 n 格式二: SELECT 列名列表 FROM 表名1

13、, 表名2 , WHERE 表名1.列名=表名2 .列名 and ,例子,【例5-16】求學(xué)生的學(xué)號、姓名、選修的課程名及成績。 SELECT 學(xué)生.學(xué)號,姓名,課程名,成績 FROM 學(xué)生,課程,選課 WHERE 學(xué)生.學(xué)號=選課.學(xué)號 AND 課程.課程號=選課.課程號 【例5-17】求選修C1課程且成績?yōu)?0分以上的學(xué)生學(xué)號、姓名及成績。 SELECT 學(xué)生.學(xué)號,姓名,成績 FROM 學(xué)生,選課 WHERE 學(xué)生.學(xué)號=選課.學(xué)號 AND 課程號=C1 AND 成績90;,自連接,自內(nèi)連接簡稱自連接,是一張表自己對自己的內(nèi)連接,即在一張表的兩個副本之間進行內(nèi)連接。用自連接可以將同一個表

14、的不同行連接起來。 使用自連接時,必須為兩個副本指定別名,使之在邏輯上成為兩個表。 語法格式: SELECT 列名列表 FROM 表名 AS 別名1 join 表名.別名2 ON 別名1.列名=別名2.列名,查詢每一門課的間接先行課。,例如,課程表中的先行課是在上學(xué)期應(yīng)開設(shè)的,先行課的先行課,即間接先行課應(yīng)提前一學(xué)年開設(shè)。如果求查詢某門課的間接先行課或全部課程的間接先行課,就需要對課程表進行自身連接。 SELECT A.課程號,A.課程名,B.先行課 FROM 課程 A,課程 B WHERE A.先行課=B.課程號,例子,課程的先行關(guān)系鏈為:C5C4C3C2C1, 課程的間接關(guān)系鏈為:C5C3

15、C1。,A,B,結(jié)果,【例5-18】,自連接雖然使用一個表但有兩個拷貝,在邏輯上是兩個表而且字段完全相同,因此字段列表中字段名必須加上其中一個表的別名做前綴。 使用自連接會產(chǎn)生許多重復(fù)行,一般加關(guān)鍵字DISTINCT過濾掉重復(fù)行。 自連接默認按ON使用的連接字段排序(供貨商ID,貨號),為了按廠家順序再按進貨日期排序,本例使用了ORDER BY指定排序。 由于使用了DISTINCT,所以不允許使用字段列表沒有指定的“g1.進貨日期”排序,也不允許使用別名“供貨日期”進行排序,本例使用了字段列表中的表達式。,(3) 外部連接,左外部連接操作是在結(jié)果集中保留連接表達式左表中的非匹配記錄; 右外部連

16、接操作是在結(jié)果集中保留連接表達式右表中的非匹配記錄。 外部連接符號為“*=”,右外部連接符號為“=*”。外部連接中不匹配的分量用NULL表示。,職工表 部門表,連接的結(jié)果集,內(nèi)連接的結(jié)果集,左外部連接的結(jié)果集,【例5-19】,內(nèi)連接: SELECT 職工.*,部門名稱,電話 FROM 職工,部門 WHERE 職工.所在部門= 部門.部門號; 左外部連接: SELECT 職工.*,部門名稱,電話 FROM 職工,部門 WHERE 職工.所在部門*= 部門.部門號; 右外部連接: SELECT 職工.*,部門名稱,電話 FROM 職工,部門 WHERE 職工.所在部門 =*部門.部門號;,用SQL

17、表達職工和部門之間的內(nèi)連接、左外部連接和右外部連接的語句,8 子查詢(嵌套查詢),子查詢是嵌套在另一查詢中的 Select-From-Where 表達式(Where/Having) SQL允許多層嵌套,由內(nèi)而外地進行分析,子查詢的結(jié)果作為父查詢的查找條件 可以用多個簡單查詢來構(gòu)成復(fù)雜查詢,以增強SQL的查詢能力 子查詢中不使用 Order By 子句,Order By子句只能對最終查詢結(jié)果進行排序,子查詢(嵌套查詢),我們可能會提出這樣的問題,在雇員中誰的工資最高,或者誰的工資比趙軍的高。 通過把一個查詢的結(jié)果作為另一個查詢的一部分,可以實現(xiàn)這樣的查詢功能。 具體的講:要查詢工資高于趙軍的雇員

18、的名字和工資,必須通過2個步驟來完成, 第一步查詢雇員趙軍的工資, 第二步查詢工資高于趙軍的雇員。 第一個查詢可以作為第二個查詢的一部分出現(xiàn)在第二個查詢的條件中,這就是子查詢。出現(xiàn)在其他查詢中的查詢稱為子查詢,包含其他查詢的查詢稱為主查詢。,子查詢(嵌套查詢),子查詢一般出現(xiàn)在SELECT語句的WHERE子句中。 子查詢比主查詢先執(zhí)行,結(jié)果作為主查詢的條件。在書寫上要用圓括號擴起來,并放在比較運算符的右側(cè)。子查詢可以嵌套使用,最里層的查詢最先執(zhí)行。 子查詢可以在SELECT、INSERT、UPDATE、DELETE等語句中使用。,查找年齡比李明大的同學(xué),SELECT 姓名,年齡 FROM 學(xué)生

19、 WHERE 年齡 (SELECT 年齡 FROM 學(xué)生 WHERE 姓名=李明); 執(zhí)行過程分兩步: 1、 SELECT 年齡 FROM 學(xué)生 WHERE 姓名=李明); 得出年齡=21 2、SELECT 姓名,年齡 FROM 學(xué)生 WHERE 年齡21,使用IN操作符的嵌套查詢,【例5-20】求選修了高等數(shù)學(xué)的學(xué)生學(xué)號和姓名。 SELECT 學(xué)號,姓名 FROM 學(xué)生 WHERE 學(xué)號 IN ( SELECT 學(xué)號 FROM 選課 WHERE 課程號 IN ( SELECT 課程號 FROM 課程 WHERE 課程名=高等數(shù)學(xué)); 該題也可以使用下面的連接查詢表達。 SELECT 學(xué)生.學(xué)

20、號,姓名 FROM 學(xué)生,課程,選課 WHERE 學(xué)生.學(xué)號=課程.學(xué)號 AND 課程.課程號=選課.課程號 AND 課程.課程名=高等數(shù)學(xué);,(2) 使用比較符的嵌套查詢,【例5-21】求C1課程的成績高于張三的學(xué)生學(xué)號和成績。 SELECT 學(xué)號,成績 FROM 選課 WHERE 課程號=C1 AND 成績 ( SELECt 成績 FROM 選課 WHERE 課程號=C1 AND 學(xué)號= (SELECT 學(xué)號 FROM 學(xué)生 WHERE 姓名=張三);,(3) 使用ANY或ALL操作符的嵌套查詢,格式為:字段比較符ANY|ALL子查詢,例子,【例5-22】求其他系中比計算機系某一學(xué)生年齡小

21、的學(xué)生。 SELECT * FROM 學(xué)生 WHERE 年齡 計算機系; 【例5-23】求其他系中比計算機系學(xué)生年齡都小的學(xué)生SELECT * FROM 學(xué)生 WHERE 年齡 計算機;,嵌套查詢分類,不相關(guān)子查詢 子查詢的查詢條件不依賴于父查詢 相關(guān)子查詢 子查詢的查詢條件依賴于父查詢,嵌套查詢求解方法,不相關(guān)子查詢 是由里向外逐層處理。即每個子查詢在上一級查詢處理之前求解,子查詢的結(jié)果用于建立其父查詢的查找條件。 相關(guān)子查詢 首先取外層查詢中表的第一個元組,根據(jù)它與內(nèi)層查詢相關(guān)的屬性值處理內(nèi)層查詢,若WHERE子句返回值為真,則取此元組放入結(jié)果表; 然后再取外層表的下一個元組; 重復(fù)這一過

22、程,直至外層表全部檢查完為止,引出子查詢的謂詞,帶有IN謂詞的子查詢 帶有比較運算符的子查詢 帶有ANY或ALL謂詞的子查詢 帶有EXISTS謂詞的子查詢,一、帶有IN謂詞的子查詢,【例5-20】求選修了高等數(shù)學(xué)的學(xué)生學(xué)號和姓名。 SELECT 學(xué)號,姓名 FROM 學(xué)生 WHERE 學(xué)號 IN ( SELECT 學(xué)號 FROM 選課 WHERE 課程號 IN ( SELECT 課程號 FROM 課程 WHERE 課程名=高等數(shù)學(xué)); 不相關(guān)子查詢,四、帶有EXISTS謂詞的子查詢,1. EXISTS謂詞 存在量詞 帶有EXISTS謂詞的子查詢不返回任何數(shù)據(jù),只產(chǎn)生邏輯真值“true”或邏輯假

23、值“false”。 若內(nèi)層查詢結(jié)果非空,則返回真值 若內(nèi)層查詢結(jié)果為空,則返回假值 由EXISTS引出的子查詢,其目標列表達式通常都用* ,因為帶EXISTS的子查詢只返回真值或假值,給出列名無實際意義 2. NOT EXISTS謂詞,(4) 使用EXISTS操作符的嵌套查詢,【例5-24】求選修了C2課程的學(xué)生姓名。 SELECT 姓名 FROM 學(xué)生 WHERE EXISTS (SELECT * FROM 選課 WHERE 學(xué)生.學(xué)號=學(xué)號 AND 課程號=C2) 思路分析: 本查詢涉及學(xué)生和選課關(guān)系。 在學(xué)生中依次取每個元組的學(xué)號的值,用此值去檢查選課關(guān)系。 若選課中存在這樣的元組,其學(xué)

24、號的值等于此學(xué)生.學(xué)號值,并且其課程號= C2,則取此學(xué)生.姓名送入結(jié)果關(guān)系。,【例5-25】求沒有選修C2課程的學(xué)生姓名。 SELECT 姓名 FROM 學(xué)生 WHERE NOT EXISTS ( SELECT * FROM 選課 WHERE 學(xué)生.學(xué)號=學(xué)號 AND 課程號=C2);,用等值連接實現(xiàn),SELECT 姓名 FROM 學(xué)生 WHERE EXISTS (SELECT * FROM 選課 WHERE 學(xué)生.學(xué)號=學(xué)號 AND 課程號=C2);,3. 不同形式的查詢間的替換,一些帶EXISTS或NOT EXISTS謂詞的子查詢不能被其他形式的子查詢等價替換 所有帶IN謂詞、比較運算符

25、、ANY和ALL謂詞的子查詢都能用帶EXISTS謂詞的子查詢等價替換。,例:例37查詢與“李明”在同一個系學(xué)習(xí)的學(xué)生??梢杂脦XISTS謂詞的子查詢替換: SELECT 學(xué)號,姓名,所在系 FROM 學(xué)生 s1 WHERE exists (SELECT * FROM 學(xué)生 s2 WHERE s2.所在系 = s1.所在系 AND s2.姓名=李明) SELECT s1.學(xué)號,s1.姓名,s1.所在系 FROM 學(xué)生 s1, 學(xué)生 s2 WHERE s2.所在系 = s1.所在系 AND s2.姓名=李明,例子,【例5-26】查詢選修了全部課程的學(xué)生的姓名。 SELECT 姓名 FROM 學(xué)生

26、 WHERE NOT EXISTS (SELECT * FROM 課程 WHERE NOT EXISTS (SELECT * FROM 選課 WHERE 學(xué)生.學(xué)號=學(xué)號 AND 課程.課程號=課程號); 第一個not exists表示不在這些課程記錄, 第二個not exists表示不存在這樣的選課記錄 演變成:查詢這樣的學(xué)生姓名,沒有一門課是他不選的.,SELECT * FROM 選課 xk ,學(xué)生 xs,課程 kc WHERE xs.學(xué)號=xk.學(xué)號 AND kc.課程號=xk.課程號,例子,【例5-27】求選修了學(xué)號為“S2”的學(xué)生所選修的全部課程的學(xué)生學(xué)號和姓名。 SELECT 學(xué)號

27、,姓名 FROM 學(xué)生 WHERE NOT EXISTS (SELECT * FROM 選課 選課1 WHERE 選課1.學(xué)號=S2 AND NOT EXISTS (SELECT * FROM 選課 選課2 WHERE 學(xué)生.學(xué)號=選課2.學(xué)號 AND 選課2 .課程號=選課1.課程號); 查詢學(xué)生X選修的課程Z和S2學(xué)生選修的課程Y,并要求Z中包括全部的Y. 不存在這樣的課程y,學(xué)生S2選修了y,而學(xué)生x沒有選。,4 統(tǒng)計,把一列中的值進行聚合運算,返回單值的函數(shù) 五個預(yù)定義的聚合函數(shù) 平均值:Avg(ALL|DISTINCT) 總和: Sum(ALL|DISTINCT) 最小值:Min(A

28、LL|DISTINCT) 最大值:Max(ALL|DISTINCT) 計數(shù): Count(ALL|DISTINCT) Count(*)、Count(Distinct) 在SELECT語句中,可以使用聚合函數(shù)、行聚合函數(shù)、GROUP BY子句和COMPUTE子句對查詢結(jié)果進行統(tǒng)計。 GROUP BY子句可與行聚合函數(shù)或聚合函數(shù)一起使用。COMPUTE子句只能與行聚合函數(shù)一起使用。,GROUP BY子句,ROUP BY子句將一列或多列定義為一組,使得組內(nèi)所有的行在某些列中的數(shù)值都相同。 查詢有些什么系? SELECT 所在系 FROM 學(xué)生 group by 所在系,示例,在SELECT語句中,也

29、可以單純使用聚合函數(shù)而不使用GROUP BY子句和COMPUTE子句進行統(tǒng)計,這時,它將所有符合條件的數(shù)據(jù)統(tǒng)計在一起,形成一行統(tǒng)計數(shù)據(jù),這種統(tǒng)計方法叫做標量統(tǒng)計。 【例5-31】求學(xué)生的總?cè)藬?shù)。 SELECT COUNT (*) FROM 學(xué)生; 【例5-32】求選修了課程的學(xué)生人數(shù)。 SELECT COUNT(DISTINCT 學(xué)號) FROM 選課; 例:李明同學(xué)的成績最高分,最低分,總分和平均分。 SELECT max(成績),min(成績),avg(成績) FROM 學(xué)生 st ,選課 kc where st.學(xué)號=kc.學(xué)號 and 姓名=李明,組函數(shù),分組函數(shù)中SUM和AVG只應(yīng)用

30、于數(shù)值型的列; MAX、MIN和COUNT可以應(yīng)用于字符、數(shù)值和日期類型的列。組函數(shù)忽略列的空值。,統(tǒng)計函數(shù),使用GROUP BY 從句可以對數(shù)據(jù)進行分組。所謂分組就是按照列的相同內(nèi)容,將記錄劃分成組,對組可以應(yīng)用組函數(shù)。 在組函數(shù)中可使用DISTINCT或ALL關(guān)鍵字。 ALL表示對所有非NULL值(可重復(fù))進行運算(COUNT除外)。 DISTINCT 表示對每一個非NULL值,如果存在重復(fù)值組函數(shù)只運算一次。如果不指明上述關(guān)鍵字,默認為ALL。,分組統(tǒng)計結(jié)果限定,在使用GROUP BY子句時,還可以用HAVING子句為分組統(tǒng)計進一步設(shè)置統(tǒng)計條件,HAVING子句與GROUP BY子句的關(guān)

31、系和WHERE子句與SELECT子句的關(guān)系類似。 HAVING子句可以參照選擇列表中的任一項,在HAVING子句中還可以使用邏輯運算符連接多個條件。最多為128個。 HAVING從句過濾分組后的結(jié)果,HAVING從句只能出現(xiàn)在GROUP BY從句之后。而WHERE從句要出現(xiàn)在GROUP BY從句之前。 WHERE 是在對記錄分組之前過濾不滿條件的記錄 HAVING是過濾掉整個分組,不滿足條件的組不要,分組統(tǒng)計,【例5-33】求課程和選修該課程的人數(shù)。 SELECT 課程號,COUNT(學(xué)號) as 選修課程人數(shù) FROM 選課 GROUP BY 課程號; 【例5-34】求選修課超過3門課的學(xué)生

32、學(xué)號。 SELECT 學(xué)號 FROM 選課 GROUP BY 學(xué)號 HAVING COUNT(*)2;,訓(xùn)練,查找圖書類別,要求類別中最高圖書定價不低于全部按類別分組的平均定價的2倍。 SELECT A.* FROM 圖書 A GROUP BY A.類別 HAVING MAX(A.定價)=ALL (SELECT 2*AVG(B.定價) FROM 圖書 B GROUP BY B.類別),訓(xùn)練,SELECT count (*) , 類別 FROM 圖書 GROUP BY 類別 SELECT AVG(定價) FROM 圖書 GROUP BY 類別 SELECT count (*) , avg(定價)

33、,類別 FROM 圖書 GROUP BY 類別 SELECT count (*) , avg(定價), 類別 FROM 圖書 GROUP BY 類別 having avg(定價)20,2)求機械工業(yè)出版社出版的各類圖書的平均定價,用GROUP BY表示。 SELECT 類別,AVG(定價)平均價 FROM 圖書 WHERE 出版社=機械工業(yè)出版社 GROUP BY 類別 ORDER BY 類別 ASC,使用compute,格式:compute 集合函數(shù)(列名1), By 列名2 ,. 功能:先按列名2分類顯示參加匯總記錄的詳細信息,再在附加行中顯示對列名1的匯總值(單用集合函數(shù)或GROUP B

34、Y僅顯示統(tǒng)計匯總值)。 COMPUTE子句可以指定多個集合函數(shù),但不允許指定列別名。 SELECT 指定的字段列表是顯示詳細信息使用的字段,必須包含COMPUTE子句集合函數(shù)使用的列名1,與BY分組字段列名2無關(guān),也可以使用*表示全部字段。 COMPUTE子句不帶BY表示對全部記錄統(tǒng)計,相當于在SELECT查詢結(jié)果后面帶一個統(tǒng)計值的后綴。,注意事項,COMPUTE子句帶BY子句時表示分組統(tǒng)計,必須配合ORDER BY排序子句使用,且緊跟ORDER BY之后。 BY后的列名2是要分組的字段(相當于GROUP BY),可以不在SELECT指定的字段中,但必須包含在ORDER BY子句中,而且必須是

35、第一順序。BY指定多個字段分組時,也必須與ORDER BY的第一順序一致。 COMPUTE子句不能與INTO子句或GROUP BY子句同時使用。 一個SELECT語句中可使用多個COMPUTE子句,一個子句顯示一個附加行,多個子句時BY分組字段必須一致,且與ORDER BY一致,子句之間不能使用逗號。,select sum(定價) from 圖書 group by 類別 select * from 圖書 compute sum(定價) select * from 圖書 order by 類別 compute sum(定價) select * from 圖書 order by 類別 comput

36、e sum(定價) by 類別 3)列出計算機類圖書的書號、名稱及價格,最后求出冊數(shù)和總價格 SELECT 書號,書名,定價 FROM 圖書 WHERE 類別=計算機 ORDER BY 書號 ASC COMPUTE count (書號),SUM(定價),列出計算機類圖書的書號、名稱及價格,并求出各出版社這類書的總價格,最后求出全部冊數(shù)和總價格。 SELECT書號,書名,定價 FROM 圖書 WHERE 類別=計算機類 ORDER BY出版社 CONPUTE COUNT(*),SUM(定價)BY 出版社 COMPUTE COUNT(*),SUM(定價),6.6 使用UNION運算符實現(xiàn)多查詢聯(lián)合

37、,UNION運算符可以將兩個或兩個以上的查詢結(jié)果合并成一個結(jié)果集合顯示。UNION運算符的語法格式為: 查詢1 UNION ALL 查詢n ORDER BY 子句COMPUTE 子句 其中查詢的格式為: SELECT select_listINTO子句FROM子句WHERE子句 GROUP BY 子句HAVING 子句,UNION 運算符使用準則,在使用 UNION 運算符組合的語句中,所有選擇列表的表達式數(shù)目必須相同(列名、算術(shù)表達式、聚合函數(shù)等)。 在使用 UNION 組合的結(jié)果集中的相應(yīng)列、或個別查詢中使用的任意列的子集必須具有相同數(shù)據(jù)類型,并且兩種數(shù)據(jù)類型之間必須存在可能的隱性數(shù)據(jù)轉(zhuǎn)換

38、,或提供了顯式轉(zhuǎn)換。例如,在 datetime 數(shù)據(jù)類型的列和 binary 數(shù)據(jù)類型的列之間不可能存在 UNION 運算符,除非提供了顯式轉(zhuǎn)換,而在 money 數(shù)據(jù)類型的列和 int 數(shù)據(jù)類型的列之間可以存在 UNION 運算符,因為它們可以進行隱性轉(zhuǎn)換。 用 UNION 運算符組合的各語句中對應(yīng)的結(jié)果集列出現(xiàn)的順序必須相同,因為 UNION 運算符是按照各個查詢給定的順序逐個比較各列。,4. 組合查詢,【例5-28】求選修了C1課程或選修了C2課程的學(xué)生學(xué)號。 SELECT 學(xué)號 FROM 選課 WHERE 課程號=C1 UNION SELECT 學(xué)號 FROM 選課 WHERE 課程號

39、=C2 【例5-29】求選修C1課程,并且也選修C2課程的學(xué)生學(xué)號。 SELECT 學(xué)號 FROM 選課 WHERE 課程號=C1 INTERSECT SELECT 學(xué)號 FROM 選課 WHERE 課程號=C2;,查詢計算機類和機械工業(yè)出版社出版的圖書。,SELECT * FROM 圖書 WHERE 類別=計算機類 UNION ALL SELECT * FROM 圖書 WHERE 出版社=機械工業(yè)出版社,【例5-30】求選修了C1課程但沒有選修C2課程的學(xué)生學(xué)號。,SELECT 學(xué)號 FROM 選課 WHERE 課程號=C1 MINUS SELECT 學(xué)號 FROM 選課 WHERE 課程號

40、=C2; 本例也可以用下面的EXISTS嵌套查詢表示。 SELECT 學(xué)號 FROM 選課 選課1 WHERE 課程號=C1 AND NOT EXISTS (SELECT 學(xué)號 FROM 選課 選課2 WHERE 選課1.學(xué)號=選課2.學(xué)號 AND 選課2.課程號=C2);,4 數(shù)據(jù)更新語句,4.1 數(shù)據(jù)插入語句1. 使用常量插入單個元組格式為: INSERT INTO表名(屬性列1,屬性列2) VALUES (常量1,常量2);,例子,【例5-35】將一個新學(xué)生記錄(學(xué)號:98010,姓名:張三,年齡:20,所在系:計算機系 )插入到學(xué)生表中。INSERTINTO 學(xué)生VALUES (98010,張三,20,計算機系); 【例5-36】插入一條選課記錄(學(xué)號:98011,課程號:C10,成績不詳)。 INSERT INTO 選課 (學(xué)號,課程號) VALUES (98011,C10);,2. 在表中插入子查詢的結(jié)果集,INSERT INTO表名(屬性列1,屬性列2) 子查詢; 【例5-37】求每個系學(xué)生的平均年齡,把結(jié)果存入數(shù)據(jù)庫中。 CREATE TABLE 系平均年齡 (系名稱 CHAR(20), 平均年齡 SMALLINT); INSERT INTO 系平均年齡 SELECT 所在系,AVG(年齡) FROM 學(xué)生 GROUP BY 所在系; select * f

溫馨提示

  • 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

提交評論