




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第 5_2 章 SQL查詢語句根底 5.1 SELECT 條件列表5.2 FROM子句5.3 WHERE子句5.4 統(tǒng)計(jì)5.5 利用查詢結(jié)果創(chuàng)立新表5.6 使用UNION運(yùn)算符實(shí)現(xiàn)多查詢聯(lián)合5.7 連接5.8 子查詢 本章要點(diǎn):掌握簡(jiǎn)單的Transact-SQL查詢語句。學(xué)會(huì)對(duì)查詢結(jié)果進(jìn)行分組統(tǒng)計(jì)、合計(jì)和排序等復(fù)雜的SELECT語句操作。5.1 SELECT 條件列表一、根本結(jié)構(gòu)SELECT 記錄顯示范圍 字段列表 INTO 新表名 FROM 表名或表名列表及其連接方式 WHERE 條件表達(dá)式 GROUP BY 分組字段名列表 HAVING 分組條件表達(dá)式 ORDER BY 排序字段名列表 A
2、SC | DESC COMPUTE 集合函數(shù)(列名1) BY 列名2 n 說明:SELECT語句中各子句的順序: SELECT 記錄范圍 字段列表 INTO FROM WHERE GROUP BY HAVING ORDER BY COMPUTE lFROM用于指定數(shù)據(jù)來源: 單表查詢簡(jiǎn)單格式:FROM 表名 多表查詢時(shí)的格式:FROM 表名列表及其連接方式lCOMPUTE子句不能與INTO子句或GROUP BY子句同時(shí)使用。SELECT 條件列表(1) SELECT子句:指明目標(biāo)列字段、表達(dá)式、函數(shù)表達(dá)式、常量。根本表中相同的列名表示為:表名.列名(2) FROM子句:指明數(shù)據(jù)源。表間用“,分
3、割。數(shù)據(jù)源不在當(dāng)前數(shù)據(jù)庫(kù)中,使用“數(shù)據(jù)庫(kù)名.表名表示。一表多用,用別名標(biāo)識(shí)。定義表別名:表名別名(3) WHERE子句:元組選擇條件。(4) GROUP BY子句:結(jié)果集分組。當(dāng)目標(biāo)列中有統(tǒng)計(jì)函數(shù),那么統(tǒng)計(jì)為分組統(tǒng)計(jì),否那么為對(duì)整個(gè)結(jié)果集統(tǒng)計(jì)。子句后帶上HAVING子句表達(dá)組選擇條件帶函數(shù)的表達(dá)式。(5) ORDER BY子句:排序。當(dāng)排序要求為ASC時(shí)升序排序;排序要求為DESC時(shí)降序排列。2. SELECT語句的操作符(1) 算術(shù)操作符+加號(hào)、減號(hào)、*乘號(hào)和 /除號(hào)。(2) 比較操作符=等于、大于、小于、=大于等于、!=不等于、小于大于、!不大于和 !、=、90;自連接自內(nèi)連接簡(jiǎn)稱自連接,
4、是一張表自己對(duì)自己的內(nèi)連接,即在一張表的兩個(gè)副本之間進(jìn)行內(nèi)連接。用自連接可以將同一個(gè)表的不同行連接起來。 使用自連接時(shí),必須為兩個(gè)副本指定別名,使之在邏輯上成為兩個(gè)表。 語法格式: SELECT 列名列表 FROM 表名 AS 別名1 join 表名.別名2 ON 別名1.列名=別名2.列名查詢每一門課的間接先行課。例如,課程表中的先行課是在上學(xué)期應(yīng)開設(shè)的,先行課的先行課,即間接先行課應(yīng)提前一學(xué)年開設(shè)。如果求查詢某門課的間接先行課或全部課程的間接先行課,就需要對(duì)課程表進(jìn)行自身連接。SELECT A.課程號(hào),A.課程名,B.先行課 FROM 課程例子課程號(hào)課程名先行課C1計(jì)算機(jī)引論C2PASCA
5、L語言C1C3數(shù)據(jù)結(jié)構(gòu)C2C4數(shù)據(jù)庫(kù)C3C5軟件工程C4課程的先行關(guān)系鏈為:C5C4C3C2C1,課程的間接關(guān)系鏈為:C5C3C1。 課程號(hào)課程名先行課課程號(hào)課程名先行課C1計(jì)算機(jī)引論C1計(jì)算機(jī)引論C2Pascal語言C1C2Pascal語言C1C3數(shù)據(jù)結(jié)構(gòu)C2C3數(shù)據(jù)結(jié)構(gòu)C2C4數(shù)據(jù)庫(kù)C3C4數(shù)據(jù)庫(kù)C3C5軟件工程C4C5軟件工程C4A.課程號(hào)A.課程名B.先行課C2Pascal語言C3數(shù)據(jù)結(jié)構(gòu)C1C4數(shù)據(jù)庫(kù)C2C5軟件工程C3AB結(jié)果【例5-18】自連接雖然使用一個(gè)表但有兩個(gè)拷貝,在邏輯上是兩個(gè)表而且字段完全相同,因此字段列表中字段名必須加上其中一個(gè)表的別名做前綴。使用自連接會(huì)產(chǎn)生許多重復(fù)
6、行,一般加關(guān)鍵字DISTINCT過濾掉重復(fù)行。自連接默認(rèn)按ON使用的連接字段排序供貨商ID,貨號(hào),為了按廠家順序再按進(jìn)貨日期排序,本例使用了ORDER BY指定排序。由于使用了DISTINCT,所以不允許使用字段列表沒有指定的“g1.進(jìn)貨日期排序,也不允許使用別名“供貨日期進(jìn)行排序,本例使用了字段列表中的表達(dá)式。(3) 外部連接左外部連接操作是在結(jié)果集中保存連接表達(dá)式左表中的非匹配記錄;右外部連接操作是在結(jié)果集中保存連接表達(dá)式右表中的非匹配記錄。外部連接符號(hào)為“*=,右外部連接符號(hào)為“=*。外部連接中不匹配的分量用NULL表示。職工號(hào)姓名性別年齡所在部門部門號(hào)部門名稱電話1010李勇男2011
7、11生產(chǎn)科5661011劉晨女1912計(jì)劃科5781012王敏女221213一車間4671014張立男211314科研所職工表 部門表 連接的結(jié)果集 職工號(hào)姓名性別年齡所在部門部門名稱電話1010李勇男2011生產(chǎn)科5661012王敏女2212計(jì)劃科5781014張立男2113一車間467職工號(hào)姓名性別年齡所在部門部門名稱電話1010李勇男2011生產(chǎn)科5661011劉晨女191012王敏女2212計(jì)劃科5781014張立男2113一車間467內(nèi)連接的結(jié)果集 左外部連接的結(jié)果集 【例5-19】?jī)?nèi)連接: SELECT 職工.*,部門名稱, FROM 職工,部門 WHERE 職工.所在部門= 部門
8、.部門號(hào);左外部連接: SELECT 職工.*,部門名稱, FROM 職工,部門 WHERE 職工.所在部門*= 部門.部門號(hào);右外部連接: SELECT 職工.*,部門名稱, FROM 職工,部門 WHERE 職工.所在部門 =*部門.部門號(hào); 用SQL表達(dá)職工和部門之間的內(nèi)連接、左外部連接和右外部連接的語句5.8 子查詢(嵌套查詢)子查詢是嵌套在另一查詢中的 Select-From-Where 表達(dá)式Where/HavingSQL允許多層嵌套,由內(nèi)而外地進(jìn)行分析,子查詢的結(jié)果作為父查詢的查找條件可以用多個(gè)簡(jiǎn)單查詢來構(gòu)成復(fù)雜查詢,以增強(qiáng)SQL的查詢能力子查詢中不使用 Order By 子句,
9、Order By子句只能對(duì)最終查詢結(jié)果進(jìn)行排序子查詢(嵌套查詢)我們可能會(huì)提出這樣的問題,在雇員中誰的工資最高,或者誰的工資比趙軍的高。通過把一個(gè)查詢的結(jié)果作為另一個(gè)查詢的一局部,可以實(shí)現(xiàn)這樣的查詢功能。具體的講:要查詢工資高于趙軍的雇員的名字和工資,必須通過2個(gè)步驟來完成,第一步查詢雇員趙軍的工資,第二步查詢工資高于趙軍的雇員。第一個(gè)查詢可以作為第二個(gè)查詢的一局部出現(xiàn)在第二個(gè)查詢的條件中,這就是子查詢。出現(xiàn)在其他查詢中的查詢稱為子查詢,包含其他查詢的查詢稱為主查詢。子查詢(嵌套查詢)子查詢一般出現(xiàn)在SELECT語句的WHERE子句中。子查詢比主查詢先執(zhí)行,結(jié)果作為主查詢的條件。在書寫上要用圓
10、括號(hào)擴(kuò)起來,并放在比較運(yùn)算符的右側(cè)。子查詢可以嵌套使用,最里層的查詢最先執(zhí)行。子查詢可以在SELECT、INSERT、UPDATE、DELETE等語句中使用。查找年齡比李明大的同學(xué)SELECT 姓名,年齡 FROM 學(xué)生WHERE 年齡(SELECT 年齡 FROM 學(xué)生 WHERE 姓名=李明);執(zhí)行過程分兩步:1、 SELECT 年齡 FROM 學(xué)生 WHERE 姓名=李明); 得出年齡=212、SELECT 姓名,年齡 FROM 學(xué)生 WHERE 年齡21使用IN操作符的嵌套查詢【例5-20】求選修了高等數(shù)學(xué)的學(xué)生學(xué)號(hào)和姓名。 SELECT 學(xué)號(hào),姓名 FROM 學(xué)生 WHERE 學(xué)號(hào)
11、IN ( SELECT 學(xué)號(hào) FROM 選課 WHERE 課程號(hào) IN ( SELECT 課程號(hào) FROM 課程 WHERE 課程名=高等數(shù)學(xué));該題也可以使用下面的連接查詢表達(dá)。 SELECT 學(xué)生.學(xué)號(hào),姓名 FROM 學(xué)生,課程,選課 WHERE 學(xué)生.學(xué)號(hào)=課程.學(xué)號(hào) AND 課程.課程號(hào)=選課.課程號(hào) AND 課程.課程名=高等數(shù)學(xué);(2) 使用比較符的嵌套查詢【例5-21】求C1課程的成績(jī)高于張三的學(xué)生學(xué)號(hào)和成績(jī)。SELECT 學(xué)號(hào),成績(jī) FROM 選課 WHERE 課程號(hào)=C1 AND 成績(jī) ( SELECt 成績(jī) FROM 選課 WHERE 課程號(hào)=C1 AND 學(xué)號(hào)= (SE
12、LECT 學(xué)號(hào) FROM 學(xué)生 WHERE 姓名=張三);(3) 使用ANY或ALL操作符的嵌套查詢格式為:字段比較符ANY|ALL子查詢操作符語意ANY大于子查詢結(jié)果中的某個(gè)值,即表示大于查詢結(jié)果中最小值A(chǔ)LL大于子查詢結(jié)果中的所有值,即表示大于查詢結(jié)果中最大值A(chǔ)NY小于子查詢結(jié)果中的某個(gè)值,即表示小于查詢結(jié)果中最大值=ANY大于等于子查詢結(jié)果中的某個(gè)值,即表示大于等于結(jié)果集中最小值=ALL大于等于子查詢結(jié)果中的所有值,即表示大于等于結(jié)果集中最大值=ANY小于等于子查詢結(jié)果中的某個(gè)值,即表示小于等于結(jié)果集中最大值=ALL小于等于子查詢結(jié)果中的所有值,即表示小于等于結(jié)果集中最小值=ANY等于子
13、查詢結(jié)果中的某個(gè)值,即相當(dāng)于IN=ALL等于子查詢結(jié)果中的所有值(通常沒有實(shí)際意義)!=(或)ANY不等于子查詢結(jié)果中的某個(gè)值,!=(或)ALL不等于子查詢結(jié)果中的任何一個(gè)值,即相當(dāng)于NOT IN例子【例5-22】求其他系中比計(jì)算機(jī)系某一學(xué)生年齡小的學(xué)生。 SELECT * FROM 學(xué)生 WHERE 年齡 ANY (SELECT 年齡 FROM 學(xué)生 WHERE 所在系=計(jì)算機(jī)系) AND 所在系計(jì)算機(jī)系;【例5-23】求其他系中比計(jì)算機(jī)系學(xué)生年齡都小的學(xué)生SELECT * FROM 學(xué)生 WHERE 年齡 ALL (SELECT 年齡 FROM 學(xué)生 WHERE 所在系=計(jì)算機(jī)) AND
14、所在系 計(jì)算機(jī);嵌套查詢分類不相關(guān)子查詢子查詢的查詢條件不依賴于父查詢相關(guān)子查詢子查詢的查詢條件依賴于父查詢嵌套查詢求解方法不相關(guān)子查詢是由里向外逐層處理。即每個(gè)子查詢?cè)谏弦患?jí)查詢處理之前求解,子查詢的結(jié)果用于建立其父查詢的查找條件。相關(guān)子查詢首先取外層查詢中表的第一個(gè)元組,根據(jù)它與內(nèi)層查詢相關(guān)的屬性值處理內(nèi)層查詢,假設(shè)WHERE子句返回值為真,那么取此元組放入結(jié)果表;然后再取外層表的下一個(gè)元組;重復(fù)這一過程,直至外層表全部檢查完為止引出子查詢的謂詞帶有IN謂詞的子查詢帶有比較運(yùn)算符的子查詢帶有ANY或ALL謂詞的子查詢帶有EXISTS謂詞的子查詢一、帶有IN謂詞的子查詢【例5-20】求選修了
15、高等數(shù)學(xué)的學(xué)生學(xué)號(hào)和姓名。 SELECT 學(xué)號(hào),姓名 FROM 學(xué)生 WHERE 學(xué)號(hào) IN ( SELECT 學(xué)號(hào) FROM 選課 WHERE 課程號(hào) IN ( SELECT 課程號(hào) FROM 課程 WHERE 課程名=高等數(shù)學(xué));不相關(guān)子查詢四、帶有EXISTS謂詞的子查詢1. EXISTS謂詞存在量詞 帶有EXISTS謂詞的子查詢不返回任何數(shù)據(jù),只產(chǎn)生邏輯真值“true或邏輯假值“false。假設(shè)內(nèi)層查詢結(jié)果非空,那么返回真值假設(shè)內(nèi)層查詢結(jié)果為空,那么返回假值由EXISTS引出的子查詢,其目標(biāo)列表達(dá)式通常都用* ,因?yàn)閹XISTS的子查詢只返回真值或假值,給出列名無實(shí)際意義2. NOT
16、 EXISTS謂詞(4) 使用EXISTS操作符的嵌套查詢【例5-24】求選修了C2課程的學(xué)生姓名。 SELECT 姓名 FROM 學(xué)生 WHERE EXISTS (SELECT * FROM 選課 WHERE 學(xué)生.學(xué)號(hào)=學(xué)號(hào) AND 課程號(hào)=C2)思路分析: 本查詢涉及學(xué)生和選課關(guān)系。 在學(xué)生中依次取每個(gè)元組的學(xué)號(hào)的值,用此值去檢查選課關(guān)系。 假設(shè)選課中存在這樣的元組,其學(xué)號(hào)的值等于此學(xué)生.學(xué)號(hào)值,并且其課程號(hào)= C2,那么取此學(xué)生.姓名送入結(jié)果關(guān)系。【例5-25】求沒有選修C2課程的學(xué)生姓名。 SELECT 姓名 FROM 學(xué)生 WHERE NOT EXISTS ( SELECT * F
17、ROM 選課 WHERE =學(xué)號(hào) AND 課程號(hào)=C2);用等值連接實(shí)現(xiàn)SELECT 姓名 FROM 學(xué)生 WHERE EXISTS (SELECT * FROM 選課 WHERE 學(xué)生.學(xué)號(hào)=學(xué)號(hào) AND 課程號(hào)=C2);3. 不同形式的查詢間的替換一些帶EXISTS或NOT EXISTS謂詞的子查詢不能被其他形式的子查詢等價(jià)替換所有帶IN謂詞、比較運(yùn)算符、ANY和ALL謂詞的子查詢都能用帶EXISTS謂詞的子查詢等價(jià)替換。例:例37查詢與“李明在同一個(gè)系學(xué)習(xí)的學(xué)生??梢杂脦XISTS謂詞的子查詢替換:SELECT 學(xué)號(hào),姓名,所在系 FROM 學(xué)生 s1 WHERE exists (SE
18、LECT * FROM 學(xué)生 s2 WHERE s2.所在系 = s1.所在系 AND s2.姓名=李明)SELECT s1.學(xué)號(hào),s1.姓名,s1.所在系 FROM 學(xué)生 s1, 學(xué)生 s2 WHERE s2.所在系 = s1.所在系 AND s2.姓名=李明例子【例5-26】查詢選修了全部課程的學(xué)生的姓名。 SELECT 姓名 FROM 學(xué)生 WHERE NOT EXISTS (SELECT * FROM 課程 WHERE NOT EXISTS (SELECT * FROM 選課 WHERE 學(xué)生.學(xué)號(hào)=學(xué)號(hào) AND 課程.課程號(hào)=課程號(hào));第一個(gè)not exists表示不在這些課程記錄,
19、第二個(gè)not exists表示不存在這樣的選課記錄演變成:查詢這樣的學(xué)生姓名,沒有一門課是他不選的.SELECT * FROM 選課 xk ,學(xué)生 xs,課程 kc WHERE xs.學(xué)號(hào)=xk.學(xué)號(hào) AND kc.課程號(hào)=xk.課程號(hào)例子【例5-27】求選修了學(xué)號(hào)為“S2的學(xué)生所選修的全部課程的學(xué)生學(xué)號(hào)和姓名。 SELECT 學(xué)號(hào),姓名 FROM 學(xué)生 WHERE NOT EXISTS (SELECT * FROM 選課 選課1 WHERE 選課1.學(xué)號(hào)=S2 AND NOT EXISTS (SELECT * FROM 選課 選課2 WHERE 學(xué)生.學(xué)號(hào)=選課2.學(xué)號(hào) AND 選課2 .課
20、程號(hào)=選課1.課程號(hào));查詢學(xué)生X選修的課程Z和S2學(xué)生選修的課程Y,并要求Z中包括全部的Y.不存在這樣的課程y,學(xué)生S2選修了y,而學(xué)生x沒有選。5.4 統(tǒng)計(jì) 把一列中的值進(jìn)行聚合運(yùn)算,返回單值的函數(shù)五個(gè)預(yù)定義的聚合函數(shù)平均值:AvgALL|DISTINCT總和: SumALL|DISTINCT最小值:MinALL|DISTINCT最大值:MaxALL|DISTINCT計(jì)數(shù): CountALL|DISTINCTCount(*)、Count(Distinct)在SELECT語句中,可以使用聚合函數(shù)、行聚合函數(shù)、GROUP BY子句和COMPUTE子句對(duì)查詢結(jié)果進(jìn)行統(tǒng)計(jì)。GROUP BY子句可與
21、行聚合函數(shù)或聚合函數(shù)一起使用。COMPUTE子句只能與行聚合函數(shù)一起使用。GROUP BY子句ROUP BY子句將一列或多列定義為一組,使得組內(nèi)所有的行在某些列中的數(shù)值都相同。查詢有些什么系?SELECT 所在系 FROM 學(xué)生 group by 所在系例如在SELECT語句中,也可以單純使用聚合函數(shù)而不使用GROUP BY子句和COMPUTE子句進(jìn)行統(tǒng)計(jì),這時(shí),它將所有符合條件的數(shù)據(jù)統(tǒng)計(jì)在一起,形成一行統(tǒng)計(jì)數(shù)據(jù),這種統(tǒng)計(jì)方法叫做標(biāo)量統(tǒng)計(jì)。【例5-31】求學(xué)生的總?cè)藬?shù)。 SELECT COUNT (*) FROM 學(xué)生;【例5-32】求選修了課程的學(xué)生人數(shù)。 SELECT COUNT(DIST
22、INCT 學(xué)號(hào)) FROM 選課;例:李明同學(xué)的成績(jī)最高分,最低分,總分和平均分。SELECT max(成績(jī)),min(成績(jī)),avg(成績(jī)) FROM 學(xué)生 st ,選課 kc where st.學(xué)號(hào)=kc.學(xué)號(hào) and 姓名=李明組函數(shù)分組函數(shù)中SUM和AVG只應(yīng)用于數(shù)值型的列;MAX、MIN和COUNT可以應(yīng)用于字符、數(shù)值和日期類型的列。組函數(shù)忽略列的空值。統(tǒng)計(jì)函數(shù)使用GROUP BY 從句可以對(duì)數(shù)據(jù)進(jìn)行分組。所謂分組就是按照列的相同內(nèi)容,將記錄劃分成組,對(duì)組可以應(yīng)用組函數(shù)。在組函數(shù)中可使用DISTINCT或ALL關(guān)鍵字。ALL表示對(duì)所有非NULL值可重復(fù)進(jìn)行運(yùn)算COUNT除外。DIST
23、INCT 表示對(duì)每一個(gè)非NULL值,如果存在重復(fù)值組函數(shù)只運(yùn)算一次。如果不指明上述關(guān)鍵字,默認(rèn)為ALL。 分組統(tǒng)計(jì)結(jié)果限定 在使用GROUP BY子句時(shí),還可以用HAVING子句為分組統(tǒng)計(jì)進(jìn)一步設(shè)置統(tǒng)計(jì)條件,HAVING子句與GROUP BY子句的關(guān)系和WHERE子句與SELECT子句的關(guān)系類似。HAVING子句可以參照選擇列表中的任一項(xiàng),在HAVING子句中還可以使用邏輯運(yùn)算符連接多個(gè)條件。最多為128個(gè)。HAVING從句過濾分組后的結(jié)果,HAVING從句只能出現(xiàn)在GROUP BY從句之后。而WHERE從句要出現(xiàn)在GROUP BY從句之前。WHERE 是在對(duì)記錄分組之前過濾不滿條件的記錄HA
24、VING是過濾掉整個(gè)分組,不滿足條件的組不要分組統(tǒng)計(jì)【例5-33】求課程和選修該課程的人數(shù)。 SELECT 課程號(hào),COUNT(學(xué)號(hào)) as 選修課程人數(shù) FROM 選課 GROUP BY 課程號(hào);【例5-34】求選修課超過3門課的學(xué)生學(xué)號(hào)。 SELECT 學(xué)號(hào) FROM 選課 GROUP BY 學(xué)號(hào) HAVING COUNT(*)2;訓(xùn)練查找圖書類別,要求類別中最高圖書定價(jià)不低于全部按類別分組的平均定價(jià)的2倍。 SELECT A.* FROM 圖書 AGROUP BY A.類別 HAVING MAX(A.定價(jià))=ALL(SELECT 2*AVG(B.定價(jià)) FROM 圖書 B GROUP B
25、Y B.類別)訓(xùn)練SELECT count (*) , 類別 FROM 圖書 GROUP BY 類別 SELECT AVG(定價(jià)) FROM 圖書 GROUP BY 類別SELECT count (*) , avg(定價(jià)),類別 FROM 圖書 GROUP BY 類別 SELECT count (*) , avg(定價(jià)), 類別 FROM 圖書 GROUP BY 類別 having avg(定價(jià))202求機(jī)械工業(yè)出版社出版的各類圖書的平均定價(jià),用GROUP BY表示。SELECT 類別,AVG(定價(jià))平均價(jià) FROM 圖書WHERE 出版社=機(jī)械工業(yè)出版社GROUP BY 類別 ORDER B
26、Y 類別 ASC使用compute格式:compute 集合函數(shù)(列名1), By 列名2 ,.功能:先按列名2分類顯示參加匯總記錄的詳細(xì)信息,再在附加行中顯示對(duì)列名1的匯總值(單用集合函數(shù)或GROUP BY僅顯示統(tǒng)計(jì)匯總值)。COMPUTE子句可以指定多個(gè)集合函數(shù),但不允許指定列別名。SELECT 指定的字段列表是顯示詳細(xì)信息使用的字段,必須包含COMPUTE子句集合函數(shù)使用的列名1,與BY分組字段列名2無關(guān),也可以使用*表示全部字段。COMPUTE子句不帶BY表示對(duì)全部記錄統(tǒng)計(jì),相當(dāng)于在SELECT查詢結(jié)果后面帶一個(gè)統(tǒng)計(jì)值的后綴。本卷須知COMPUTE子句帶BY子句時(shí)表示分組統(tǒng)計(jì),必須配合
27、ORDER BY排序子句使用,且緊跟ORDER BY之后。BY后的列名2是要分組的字段相當(dāng)于GROUP BY,可以不在SELECT指定的字段中,但必須包含在ORDER BY子句中,而且必須是第一順序。BY指定多個(gè)字段分組時(shí),也必須與ORDER BY的第一順序一致。COMPUTE子句不能與INTO子句或GROUP BY子句同時(shí)使用。一個(gè)SELECT語句中可使用多個(gè)COMPUTE子句,一個(gè)子句顯示一個(gè)附加行,多個(gè)子句時(shí)BY分組字段必須一致,且與ORDER BY一致,子句之間不能使用逗號(hào)。select sum(定價(jià)) from 圖書 group by 類別select * from 圖書 compu
28、te sum(定價(jià)) select * from 圖書 order by 類別 compute sum(定價(jià)) select * from 圖書 order by 類別 compute sum(定價(jià)) by 類別3列出計(jì)算機(jī)類圖書的書號(hào)、名稱及價(jià)格,最后求出冊(cè)數(shù)和總價(jià)格SELECT 書號(hào),書名,定價(jià) FROM 圖書WHERE 類別=計(jì)算機(jī) ORDER BY 書號(hào) ASCCOMPUTE count (書號(hào)),SUM(定價(jià))列出計(jì)算機(jī)類圖書的書號(hào)、名稱及價(jià)格,并求出各出版社這類書的總價(jià)格,最后求出全部?jī)?cè)數(shù)和總價(jià)格。SELECT書號(hào),書名,定價(jià) FROM 圖書WHERE 類別=計(jì)算機(jī)類ORDER B
29、Y出版社CONPUTE COUNT*,SUM定價(jià)BY 出版社COMPUTE COUNT*,SUM定價(jià)6.6 使用UNION運(yùn)算符實(shí)現(xiàn)多查詢聯(lián)合UNION運(yùn)算符可以將兩個(gè)或兩個(gè)以上的查詢結(jié)果合并成一個(gè)結(jié)果集合顯示。UNION運(yùn)算符的語法格式為: 查詢1 UNION ALL 查詢n ORDER BY 子句COMPUTE 子句其中查詢的格式為: SELECT select_listINTO子句FROM子句WHERE子句 GROUP BY 子句HAVING 子句操作描述UNION并集,合并兩個(gè)操作的結(jié)果,去掉重復(fù)的部分。UNION ALL并集,合并兩個(gè)操作的結(jié)果,保留重復(fù)部分。(所有的)MINUS差集
30、,從前面的操作結(jié)果中去掉與后面操作結(jié)果相同的部分。INTERSECT交集,取兩個(gè)操作結(jié)果中的相同的部分。UNION 運(yùn)算符使用準(zhǔn)那么在使用 UNION 運(yùn)算符組合的語句中,所有選擇列表的表達(dá)式數(shù)目必須相同列名、算術(shù)表達(dá)式、聚合函數(shù)等。在使用 UNION 組合的結(jié)果集中的相應(yīng)列、或個(gè)別查詢中使用的任意列的子集必須具有相同數(shù)據(jù)類型,并且兩種數(shù)據(jù)類型之間必須存在可能的隱性數(shù)據(jù)轉(zhuǎn)換,或提供了顯式轉(zhuǎn)換。例如,在 datetime 數(shù)據(jù)類型的列和 binary 數(shù)據(jù)類型的列之間不可能存在 UNION 運(yùn)算符,除非提供了顯式轉(zhuǎn)換,而在 money 數(shù)據(jù)類型的列和 int 數(shù)據(jù)類型的列之間可以存在 UNION
31、 運(yùn)算符,因?yàn)樗鼈兛梢赃M(jìn)行隱性轉(zhuǎn)換。用 UNION 運(yùn)算符組合的各語句中對(duì)應(yīng)的結(jié)果集列出現(xiàn)的順序必須相同,因?yàn)?UNION 運(yùn)算符是按照各個(gè)查詢給定的順序逐個(gè)比較各列。4. 組合查詢【例5-28】求選修了C1課程或選修了C2課程的學(xué)生學(xué)號(hào)。SELECT 學(xué)號(hào) FROM 選課 WHERE 課程號(hào)=C1 UNION SELECT 學(xué)號(hào) FROM 選課 WHERE 課程號(hào)=C2【例5-29】求選修C1課程,并且也選修C2課程的學(xué)生學(xué)號(hào)。 SELECT 學(xué)號(hào) FROM 選課 WHERE 課程號(hào)=C1 INTERSECT SELECT 學(xué)號(hào) FROM 選課 WHERE 課程號(hào)=C2;查詢計(jì)算機(jī)類和機(jī)械工
32、業(yè)出版社出版的圖書。SELECT * FROM 圖書WHERE 類別=計(jì)算機(jī)類UNION ALLSELECT * FROM 圖書WHERE 出版社=機(jī)械工業(yè)出版社【例5-30】求選修了C1課程但沒有選修C2課程的學(xué)生學(xué)號(hào)。SELECT 學(xué)號(hào) FROM 選課 WHERE 課程號(hào)=C1 MINUSSELECT 學(xué)號(hào) FROM 選課 WHERE 課程號(hào)=C2;本例也可以用下面的EXISTS嵌套查詢表示。 SELECT 學(xué)號(hào) FROM 選課 選課1 WHERE 課程號(hào)=C1 AND NOT EXISTS (SELECT 學(xué)號(hào) FROM 選課 選課2 WHERE 選課1.學(xué)號(hào)=選課2.學(xué)號(hào) AND 選課
33、2.課程號(hào)=C2);5.4 數(shù)據(jù)更新語句5.4.1 數(shù)據(jù)插入語句1. 使用常量插入單個(gè)元組格式為: INSERT INTO表名(屬性列1,屬性列2) VALUES (常量1,常量2);例子【例5-35】將一個(gè)新學(xué)生記錄(學(xué)號(hào):98010,姓名:張三,年齡:20,所在系:計(jì)算機(jī)系 )插入到學(xué)生表中。INSERTINTO 學(xué)生VALUES (98010,張三,20,計(jì)算機(jī)系);【例5-36】插入一條選課記錄(學(xué)號(hào):98011,課程號(hào):C10,成績(jī)不詳)。 INSERT INTO 選課 (學(xué)號(hào),課程號(hào)) VALUES (98011,C10);2. 在表中插入子查詢的結(jié)果集INSERT INTO表名(
34、屬性列1,屬性列2) 子查詢;【例5-37】求每個(gè)系學(xué)生的平均年齡,把結(jié)果存入數(shù)據(jù)庫(kù)中。 CREATE TABLE 系平均年齡 (系名稱 CHAR(20), 平均年齡 SMALLINT); INSERT INTO 系平均年齡 SELECT 所在系,AVG(年齡) FROM 學(xué)生 GROUP BY 所在系;select * from 系平均年齡5.4.2 數(shù)據(jù)修改語句UPDATE表名SET列名=表達(dá)式,列名=表達(dá)式,nWHERE條件;【例5-38】將學(xué)生表中全部學(xué)生的年齡加上2歲。 UPDATE 學(xué)生 SET 年齡=年齡+2;【例5-39】將選課表中的數(shù)據(jù)庫(kù)課程的成績(jī)乘以。 UPDATE 選課 SET 成績(jī)= 成績(jī)*1.2 WHERE 課程號(hào)= (SELECT 課程號(hào) FROM 課程 WHERE 課程
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 35137-2025柴油潤(rùn)滑性評(píng)定用高頻往復(fù)試驗(yàn)機(jī)
- 第1課神奇的小畫冊(cè)(說課稿)
- 《社會(huì)學(xué)概論》授課教案
- 座椅發(fā)泡設(shè)計(jì)指南
- 兒童心理障礙的早期干預(yù)和家庭支持
- 浙江省臺(tái)州市六校聯(lián)盟2024-2025學(xué)年高一下學(xué)期4月期中語文試卷(含答案)
- 湖北省武漢市部分重點(diǎn)中學(xué)2024-2025學(xué)年高一下學(xué)期期末聯(lián)考語文試卷(含答案)
- 河南省安陽(yáng)市滑縣2024-2025學(xué)年七年級(jí)下學(xué)期5月月考生物試卷(含答案)
- 工廠體驗(yàn)體察活動(dòng)方案
- 工行信用卡品牌活動(dòng)方案
- 模擬談判報(bào)告
- 小學(xué)班主任班級(jí)管理 四年級(jí)家長(zhǎng)會(huì) 課件
- 公司食堂飯菜不足應(yīng)急預(yù)案
- (滬教牛津版)深圳市小學(xué)1-6年級(jí)英語單詞默寫表(英文+中文+默寫)
- 醫(yī)療器械規(guī)下的醫(yī)療器械專業(yè)知識(shí)培訓(xùn)
- 2023江西制造職業(yè)技術(shù)學(xué)院教師招聘考試真題題庫(kù)
- 電力建設(shè)安全工作規(guī)程完整
- 廉潔教育班會(huì)(共37張PPT)
- 通信電子線路創(chuàng)新訓(xùn)練教程部分習(xí)題答案
- 2023北京西城區(qū)初二期末(下)物理試卷及答案
- 山東省煙臺(tái)招遠(yuǎn)市(五四制)2022-2023學(xué)年八年級(jí)下學(xué)期期末語文試題(解析版)
評(píng)論
0/150
提交評(píng)論