




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1SQL概述
SQL的全稱為structuredquerylanguage(結(jié)構(gòu)化查詢語(yǔ)言)。最早是在1974IBM的SanJose實(shí)驗(yàn)室的研究人員D.Chamberlin定義了“結(jié)構(gòu)化英語(yǔ)查詢語(yǔ)言”,簡(jiǎn)稱SEQUEL。1976Chamberlin將其改稱為SQL,正確的發(fā)音為‘s_q_l’。SQL是一種類英語(yǔ)的語(yǔ)言,用一些簡(jiǎn)單的英語(yǔ)句子構(gòu)成基本的語(yǔ)法結(jié)構(gòu),具有簡(jiǎn)單易學(xué)、功能較強(qiáng)、操作靈活的特點(diǎn)。1976IBMSystemR上,實(shí)現(xiàn)了這種用英語(yǔ)描述關(guān)系代數(shù)運(yùn)算的語(yǔ)言的研究。在20世紀(jì)70ORACLESQL商業(yè)化的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)。
1
1SQL概述
SQL是一種非過(guò)程化的語(yǔ)言,它與通常的高級(jí)語(yǔ)言不同,使用SQL時(shí),只要說(shuō)明做什么,不需要說(shuō)明怎么做,具體的操作全部由DBMS自動(dòng)完成。例如,要查詢所有女同學(xué)的姓名,只要寫出SQL語(yǔ)句:SELECT姓名FROM學(xué)生WHERE性別=‘女’
21SQL概述
SQL語(yǔ)言按用途可劃分為三個(gè)組成部分:數(shù)據(jù)定義語(yǔ)言(DDL):在數(shù)據(jù)庫(kù)系統(tǒng)中,數(shù)據(jù)庫(kù)、表、視圖、索引等都是對(duì)象,用于定義這些對(duì)象的SQL語(yǔ)句稱為DDL。數(shù)據(jù)處理語(yǔ)言(DML):用于插入、修改、刪除和查詢數(shù)據(jù)的SQL語(yǔ)句稱為DML。數(shù)據(jù)控制語(yǔ)言(DCL):用于實(shí)現(xiàn)數(shù)據(jù)完整性、安全性、一致性等控制的SQL語(yǔ)句稱為DCL。32數(shù)據(jù)定義系課程圖1一組關(guān)系模式和樣本數(shù)據(jù)(a)
系編號(hào)系名稱101數(shù)學(xué)102計(jì)算機(jī)103外語(yǔ)104經(jīng)濟(jì)課程號(hào)課程名學(xué)時(shí)系編號(hào)C1數(shù)學(xué)681C2英語(yǔ)853C3計(jì)算機(jī)682C4經(jīng)濟(jì)學(xué)5145
2數(shù)據(jù)定義
圖1一組關(guān)系模式和樣本數(shù)據(jù)(b)教工號(hào)姓
名性別職稱工
資系編號(hào)2101葛小平女教授3420.001012203李長(zhǎng)江男副教授3190.001022405姜立偉男副教授3140.001042104張麗麗女講師224001012302康立華女教授3740.001032205王偉平男講師2130.00102教工62數(shù)據(jù)定義
學(xué)
號(hào)課程編號(hào)分?jǐn)?shù)1022C1881022C2672124C1772124C2952124C3454021C4874021C2784021C3671223C1661223C2893012C2933012C384成績(jī)圖1一組關(guān)系模式和樣本數(shù)據(jù)(c)72數(shù)據(jù)定義 說(shuō)明:本書選用SQLServer2000系統(tǒng)作為上機(jī)實(shí)驗(yàn)平臺(tái),所有例題和上機(jī)操作實(shí)驗(yàn)案例都在SQLServer2000查詢分析器中運(yùn)行通過(guò),并且所選用的題目盡量符合SQL的標(biāo)準(zhǔn)格式,如果讀者選用其他數(shù)據(jù)庫(kù)管理系統(tǒng)作為實(shí)驗(yàn)環(huán)境,可能有微小的區(qū)別。
92數(shù)據(jù)定義
2.1建立數(shù)據(jù)庫(kù)
絕大多數(shù)關(guān)系DBMS,使用CREATEDATABASE命令建立數(shù)據(jù)庫(kù),其語(yǔ)法格式: CREATEDATABASE<數(shù)據(jù)庫(kù)名>
102數(shù)據(jù)定義
2.1建立數(shù)據(jù)庫(kù)
例1
根據(jù)圖1給出的實(shí)例,用SQL語(yǔ)言創(chuàng)建一個(gè)教學(xué)數(shù)據(jù)庫(kù)。CREATEDATABASE教學(xué)當(dāng)進(jìn)入SQL_Server2000系統(tǒng)的查詢分析器后,如圖2所示,在查詢窗口中輸入命令:CREATEDATABASE教學(xué),然后,點(diǎn)擊綠色的?按鈕執(zhí)行命令,在窗格中顯示運(yùn)行的結(jié)果,創(chuàng)建了教學(xué)數(shù)據(jù)庫(kù)。
112數(shù)據(jù)定義
2.2定義表結(jié)構(gòu) 在SQL語(yǔ)言中,利用CREATETABLE語(yǔ)句創(chuàng)建表,其基本語(yǔ)法格式是:CREATETABLE<表名>(<列名1><數(shù)據(jù)類型>,<列名2><數(shù)據(jù)類型>,…,<列名n><數(shù)據(jù)類型>,PRIMARYKEY(<主碼>),F(xiàn)OREIGNKEY(<外碼>)REFERENCES表名(<外碼>))注:PRIMARYKEY子句定義主碼,實(shí)現(xiàn)實(shí)體完整性定義;FOREIGNKEY子句定義外碼,實(shí)現(xiàn)參照完整性定義。
132數(shù)據(jù)定義
2.2定義表結(jié)構(gòu)
表1常見(jiàn)的數(shù)據(jù)類型
數(shù)據(jù)類型說(shuō)明范例CHAR(N)固定長(zhǎng)度的字符串CHAR(8):長(zhǎng)度是8個(gè)字節(jié)INT整數(shù)類型SMALLINT短整型數(shù)類型NUMERIC(P[,D])共P位,其中小數(shù)位占d位NUMERIC(8,2):整數(shù)6位,小數(shù)2位DATE日期型,包括年(4位)月日2001/10/13:2001年10月13日142數(shù)據(jù)定義
2.2定義表結(jié)構(gòu)
舉例說(shuō)明CREATETABLE語(yǔ)句的使用方法。例2
創(chuàng)建一個(gè)簡(jiǎn)單的表,該表的關(guān)系模式是:系(系編號(hào),系名稱)。CREATETABLE系(系編號(hào)SMALLINT, 系名稱CHAR(12))
152數(shù)據(jù)定義
2.2定義表結(jié)構(gòu)說(shuō)明:在SQL-89中,規(guī)定PRIMARYKEY子句定義主碼,NOTNULL關(guān)鍵詞定義屬性非空,所以,要用這兩個(gè)定義來(lái)實(shí)現(xiàn)實(shí)體完整性規(guī)則。在SQL-92中,規(guī)定PRIMARYKEY子句定義主碼且主碼非空,所以,用一個(gè)子句就可以定義實(shí)體完整性。172數(shù)據(jù)定義
2.2定義表結(jié)構(gòu)
例4在創(chuàng)建教工表的定義中包括實(shí)體完整性和參照完整性的定義。CREATETABLE教工(教工號(hào)SMALLINTNOTNULL,
姓名CHAR(8)NOTNULL,
性別CHAR(2),
職稱CHAR(8),
工資NUMERIC(8,2),
系編號(hào)SMALLINT, PRIMARYKEY(教工號(hào)), FOREIGNKEY(系編號(hào))REFERENCES系(系編號(hào)))182數(shù)據(jù)定義
2.2定義表結(jié)構(gòu)
例5
創(chuàng)建成績(jī)表,包括實(shí)體完整性和參照完整性的定義。CREATETABLE成績(jī)(學(xué)號(hào)CHAR(6)NOTNULL,
課程編號(hào)CHAR(8)NOTNULL,
分?jǐn)?shù)NUMERIC(4,1),PRIMARYKEY(學(xué)號(hào),課程編號(hào)),FOREIGNKEY(學(xué)號(hào))REFERENCES學(xué)生(學(xué)號(hào)),FOREIGNKEY(課程編號(hào))REFERENCES課程(課程編號(hào)))192數(shù)據(jù)定義
2.3修改表結(jié)構(gòu) 用SQL語(yǔ)言的ALTERTABLE語(yǔ)句可以修改表的結(jié)構(gòu)。下面結(jié)合實(shí)例說(shuō)明ALTERTABLE語(yǔ)句的使用方法。1.增加新的屬性,所有元組在這個(gè)新屬性上都將賦值NULL。 語(yǔ)句格式是:
ALTERTABLE<表名>ADD<新屬性名><域類型>例6在系表中添加一個(gè)電話號(hào)碼屬性。
ALTERTABLE系A(chǔ)DD電話號(hào)碼CHAR(8)
212數(shù)據(jù)定義
2.3修改表結(jié)構(gòu)2.修改屬性的性質(zhì),語(yǔ)句格式是:
ALTERTABLE<表名>MODIFY<屬性名><新的域類型>注意:在SQLSERVER2000系統(tǒng)中規(guī)定修改屬性的性質(zhì),語(yǔ)句格式為:ALTERTABLE<表名>ALTERCOLUMN<屬性名><新的域類型>例7
修改系表中電話號(hào)碼屬性的寬度。
ALTERTABLE系A(chǔ)LTERCOLUMN電話號(hào)碼CHAR(13)
222數(shù)據(jù)定義
2.3修改表結(jié)構(gòu)
刪除一個(gè)屬性,語(yǔ)句格式是:ALTERTABLE<表名>DROP<屬性名> 注意:在SQLSERVER2000系統(tǒng)中應(yīng)該寫成:ALTERTABLE<表名>DROPCOLUMN<屬性名>
例8
刪除系表中電話號(hào)碼屬性。SQL語(yǔ)句是:ALTERTABLE系DROPCOLUMN電話號(hào)碼
232數(shù)據(jù)定義
2.4刪除表例9刪除教工表。DROPTABLE教工注意:系統(tǒng)不允許刪除已由REFERENCES子句定義的被參照表。假設(shè)在教工表中定義外碼<系編號(hào)>參照系表,若要?jiǎng)h除系表,就必須先刪除教工表,否則系統(tǒng)拒絕刪除操作。
252數(shù)據(jù)定義
2.4刪除表
例10假設(shè)在教學(xué)數(shù)據(jù)庫(kù)中創(chuàng)建了系、教工、學(xué)生、課程、成績(jī)5個(gè)表,并且定義了參照完整性規(guī)則。如果要?jiǎng)h除學(xué)生表,則必須先刪除成績(jī)表。DROPTABLE成績(jī)DROPTABLE學(xué)生
262數(shù)據(jù)定義
2.5創(chuàng)建索引
例11
對(duì)教授表的教工號(hào)屬性建立一個(gè)名為SCODEX的索引。CREATEINDEXSCODEXON教授(教工號(hào))SQL語(yǔ)言允許建立唯一性索引。對(duì)侯選碼建立唯一性索引,可以防止輸入重復(fù)的數(shù)據(jù)。
292數(shù)據(jù)定義
2.5創(chuàng)建索引例12對(duì)學(xué)生表的學(xué)號(hào)屬性建立唯一性索引。CREATEUNIQUEINDEXSCODEXON學(xué)生(學(xué)號(hào))說(shuō)明:建立了唯一性索引之后,若輸入一個(gè)重復(fù)的學(xué)號(hào)時(shí),系統(tǒng)將產(chǎn)生錯(cuò)誤提示:
duplicatevalueinindex.
303數(shù)據(jù)的基本操作
本節(jié)將介紹SQL語(yǔ)言的數(shù)據(jù)操作功能,包括插入、更新和刪除數(shù)據(jù)的操作命令。313數(shù)據(jù)的基本操作
1插入數(shù)據(jù)在SQL語(yǔ)言中,數(shù)據(jù)插入語(yǔ)句有三種格式。第一種格式是在表中插入一個(gè)元組,語(yǔ)法格式是:INSERTINTO<表名>VALUES(<值1>,<值2>,.....,<值N>)323數(shù)據(jù)的基本操作
1插入數(shù)據(jù)例13在系表中插入一行數(shù)據(jù)。INSERTINTO系VALUES(102,'管理科學(xué)')顯示所插入的數(shù)據(jù)
:SELECT*FROM系顯示結(jié)果:
系編號(hào)系名稱102管理科學(xué)333數(shù)據(jù)的基本操作
1插入數(shù)據(jù)
例14向教工表中插入一行數(shù)據(jù)。INSERTINTO教工VALUES(2001,'葛小平','女','教授',3420.00,102)顯示所插入的數(shù)據(jù)
:SELECT*FROM教工顯示結(jié)果:
教工號(hào)姓名性別職稱工資系編號(hào)2001葛小平女教授3420.00102343數(shù)據(jù)的基本操作
1插入數(shù)據(jù)
說(shuō)明:這種格式適合向表中插入一整行數(shù)據(jù)。值得注意的是所列值的順序必須與屬性的順序和類型一致。
353數(shù)據(jù)的基本操作
1插入數(shù)據(jù)
第二種格式用于在表中插入部分屬性的值,語(yǔ)法格式是:INSERTINTO<表名>(<列名表>)VALUES(<值列表>)
363數(shù)據(jù)的基本操作
1插入數(shù)據(jù)
例15向教工表中插入一個(gè)教工號(hào)、姓名和工資。INSERTINTO教工(教工號(hào),姓名,工資)VALUES(2109,'田新民',2650)顯示所插入的數(shù)據(jù):SELECT*FROM教工顯示結(jié)果:
教工號(hào)姓名性別職稱工資系編號(hào)2001葛小平女教授3420.001022109田新民2650.00373數(shù)據(jù)的基本操作
1插入數(shù)據(jù)說(shuō)明:這種格式適合在表的部分屬性上插入數(shù)據(jù)。應(yīng)注意的是值的順序應(yīng)該與所列屬性的順序和類型相一致。
383數(shù)據(jù)的基本操作
1插入數(shù)據(jù)
第三種格式是將VALUES子句換成一個(gè)查詢語(yǔ)句,語(yǔ)法格式是:INSERTINTO<表名>(<列名表>)
SELECT<列名表>一個(gè)查詢語(yǔ)句
FROM<表名>393數(shù)據(jù)的基本操作
1插入數(shù)據(jù)例16將教工表的姓名和工資拷貝到一個(gè)酬金表中。
403數(shù)據(jù)的基本操作
1插入數(shù)據(jù)
(1)
創(chuàng)建一個(gè)酬金表。CREATETABLE酬金(教工姓名CHAR(8),工資NUMERIC(8,2))
413數(shù)據(jù)的基本操作
1插入數(shù)據(jù)(2)
將教工表中姓名和工資兩列數(shù)據(jù)拷貝到酬金表中。INSERTINTO酬金(教工姓名,工資)SELECT姓名,工資FROM教工
423數(shù)據(jù)的基本操作
1插入數(shù)據(jù)(3)顯示操作的結(jié)果:SELECT*FROM酬金
顯示結(jié)果:
教工姓名工資葛小平3420.00田新民2650.00433數(shù)據(jù)的基本操作
2更新數(shù)據(jù)SQL語(yǔ)言的數(shù)據(jù)更新語(yǔ)句的格式是:
UPDATE<表名>SET<列名1>=<新值1>,<列名2>=<新值2>,……WHERE<條件表達(dá)式>
443數(shù)據(jù)的基本操作
2更新數(shù)據(jù)
例17將教工表中職稱為“教授”的工資增加10%。UPDATE教工SET工資=工資*1.1WHERE職稱='教授'只修改職稱為教授的元組的工資屬性值。
453數(shù)據(jù)的基本操作
2更新數(shù)據(jù)例18將教工表中所有人的工資增加5%。UPDATE教工SET工資=工資*1.05修改所有元組的工資屬性的值。
463數(shù)據(jù)的基本操作
3刪除數(shù)據(jù)SQL語(yǔ)言中,刪除數(shù)據(jù)語(yǔ)句的格式是:DELETEFROM<表名>WHERE<條件表達(dá)式>
473數(shù)據(jù)的基本操作
3刪除數(shù)據(jù)例19從教工表中刪除教工號(hào)為2001的教工。DELETEFROM教工WHERE教工號(hào)=2001查看刪除的結(jié)果:SELECT*FROM教工顯示結(jié)果:
教工號(hào)姓名性別職稱工資系編號(hào)2109田新民2650.00483數(shù)據(jù)的基本操作
3刪除數(shù)據(jù)例20刪除酬金表的所有數(shù)據(jù)。DELETEFROM酬金查看刪除的結(jié)果:SELECT*FROM酬金顯示結(jié)果:
說(shuō)明:這個(gè)語(yǔ)句只刪除酬金表的數(shù)據(jù),不刪除表的結(jié)構(gòu),此時(shí),酬金表是一個(gè)空表。
教工姓名工資494數(shù)據(jù)的查詢操作本節(jié)將介紹SQL語(yǔ)言的數(shù)據(jù)查詢的基本功能。其中包括查詢語(yǔ)句的基本結(jié)構(gòu)、更名運(yùn)算、元組變量、字符串操作、排序操作和分組操作。
504數(shù)據(jù)的查詢操作
4.1查詢語(yǔ)句的基本結(jié)構(gòu)
SQL查詢語(yǔ)句的一般格式:SELECT<列名L>,<列名2>,…,<列名N>FROM<表1>,<表2>,…,<表M>WHERE<條件表達(dá)式>
514數(shù)據(jù)的查詢操作
4.1查詢語(yǔ)句的基本結(jié)構(gòu)查詢語(yǔ)句的三個(gè)子句分別實(shí)現(xiàn)關(guān)系代數(shù)的一種運(yùn)算:SELECT子句對(duì)應(yīng)關(guān)系代數(shù)中的投影運(yùn)算,列出查詢結(jié)果中的屬性。FROM子句對(duì)應(yīng)關(guān)系代數(shù)中的笛卡兒積,列出查詢需要搜索的關(guān)系。WHERE子句對(duì)應(yīng)關(guān)系代數(shù)中的選擇運(yùn)算,條件表達(dá)式中所涉及的屬性將屬于FROM子句所列的關(guān)系。
524數(shù)據(jù)的查詢操作
4.1查詢語(yǔ)句的基本結(jié)構(gòu)查詢語(yǔ)句等價(jià)于關(guān)系代數(shù)表達(dá)式:A1,A2,...An(σp(R1×R2×…×Rm))其中:Ai表示屬性i,Rj表示關(guān)系j,P表示選擇條件。這個(gè)表達(dá)式的含義是:首先計(jì)算R1、R2到Rm的笛卡兒乘積,然后,選擇滿足條件P的元組,最后對(duì)選擇的結(jié)果進(jìn)行投影。
534數(shù)據(jù)的查詢操作
4.1查詢語(yǔ)句的基本結(jié)構(gòu)從查詢語(yǔ)句等價(jià)的關(guān)系代數(shù)表達(dá)式,可以分析SQL查詢語(yǔ)句的執(zhí)行過(guò)程:構(gòu)造FROM子句中關(guān)系的笛卡兒積。根據(jù)WHERE子句中的條件表達(dá)式,進(jìn)行選擇操作。根據(jù)SELECT子句給出的列名進(jìn)行投影操作。
544數(shù)據(jù)的查詢操作
4.1查詢語(yǔ)句的基本結(jié)構(gòu)假設(shè)有關(guān)系R、S和一個(gè)SQL查詢語(yǔ)句,如圖3所示。分析SQL查詢語(yǔ)句與關(guān)系代數(shù)運(yùn)算的對(duì)應(yīng)關(guān)系。
RS
圖3關(guān)系R、S和一個(gè)SQL查詢語(yǔ)句
ABC
a1b1c2a2b2c2a3b1c4ADE
a1d1e2a2d2e3查詢語(yǔ)句:SELECTR.A,B,D,EFROMR,SWHERER.A=S.A554數(shù)據(jù)的查詢操作
4.1查詢語(yǔ)句的基本結(jié)構(gòu)分析這個(gè)查詢語(yǔ)句執(zhí)行的過(guò)程:1.先計(jì)算RS
ABCADEa1b1c2a1d1e2a1b1c2a2d2e3a2b2c2a1d1e2a2b2c2a2d2e3a3b1c4a1d1e2a3b1c4a2d2e3564數(shù)據(jù)的查詢操作
4.1查詢語(yǔ)句的基本結(jié)構(gòu)2.依據(jù)條件<R.A=S.A>進(jìn)行選擇操作
ABCADEa1b1c2a1d1e2A2b2c2a2d2e3574數(shù)據(jù)的查詢操作
4.1查詢語(yǔ)句的基本結(jié)構(gòu)進(jìn)行投影操作
R.ABDEa1b1d1e2a2b2d2e3584數(shù)據(jù)的查詢操作
4.1查詢語(yǔ)句的基本結(jié)構(gòu)說(shuō)明:實(shí)際上,SQL不一定完全按照這個(gè)步驟進(jìn)行操作。通常是采取某種等價(jià)的算法,例如,先選擇,再做笛卡兒乘積,最后投影,用減少笛卡兒乘積次數(shù)的方法,來(lái)提高查詢效率。
594數(shù)據(jù)的查詢操作
4.2SELECT子句SQL查詢語(yǔ)句的運(yùn)算結(jié)果仍然是一個(gè)關(guān)系,這個(gè)關(guān)系的屬性由SELECT子句的列名表給出。SELECT子句的參數(shù)有多種形式。
604數(shù)據(jù)的查詢操作
4.2SELECT子句
1.指定某個(gè)或某一些屬性。例21列出所有教授的姓名。SELECT姓名FROM教工WHERE職稱='教授'查詢結(jié)果:姓名葛小平康立華614數(shù)據(jù)的查詢操作
4.2SELECT子句例22列出所有教授的姓名和工資:SELECT姓名,工資FROM教工WHERE職稱='教授'查詢結(jié)果:姓名工資葛小平3420.00康立華3740.00624數(shù)據(jù)的查詢操作
4.2SELECT子句
2.指定FROM子句中所有關(guān)系的屬性都將出現(xiàn)在查詢結(jié)果中。例23列出教授的所有信息。SELECT*FROM教工WHERE職稱='教授'
查詢結(jié)果:
教工號(hào)姓名性別職稱工資系編號(hào)2001葛小平女教授3420.001022302康立華女教授3740.00103634數(shù)據(jù)的查詢操作
4.2SELECT子句
利用關(guān)鍵詞DISTINCT消除重復(fù)出現(xiàn)的元組。例24列出教工表中的系編號(hào)。(注意有重復(fù)的系編號(hào))
SELECT系編號(hào)
FROM教工
查詢結(jié)果:系編號(hào)101102104101103102644數(shù)據(jù)的查詢操作
4.2SELECT子句例25列出教工表中的系編號(hào)并消除重復(fù)的元組。SELECTDISTINCT系編號(hào)FROM教工查詢結(jié)果:
系編號(hào)101102104103654數(shù)據(jù)的查詢操作
4.2SELECT子句
4.在SELECT子句中還可以對(duì)輸出的屬性重命名。例26已知學(xué)分=學(xué)時(shí)/17,計(jì)算每一門課程的學(xué)分?jǐn)?shù)。SELECT課程名,學(xué)時(shí)/17AS學(xué)分FROM課程
查詢結(jié)果:
課程名學(xué)分?jǐn)?shù)學(xué)4英語(yǔ)5計(jì)算機(jī)6經(jīng)濟(jì)學(xué)3664數(shù)據(jù)的查詢操作
4.2SELECT子句
5.SELECT子句中可以包含表達(dá)式例27顯示教授的工資和提高10%的工資額。 SELECT姓名,工資,工資*1.1AS'工資*1.1' FROM教工WHERE職稱='教授'查詢結(jié)果:
姓名工資工資*1.1葛小平3420.003762.00康立華3740.002915.00674數(shù)據(jù)的查詢操作
4.2SELECT子句例28顯示田平平同學(xué)出生100天的日期。SELECT姓名,出生年月+100AS'出生年月+100'FROM學(xué)生WHERE姓名='田平平'查詢結(jié)果:
姓名出生年月出生年月+100田平平08/05/198011/13/1980684數(shù)據(jù)的查詢操作
4.2SELECT子句
在后面的章節(jié)還會(huì)介紹SELECT子句的一些用法,例如,SELECT子句的參數(shù)還可以是算術(shù)函數(shù)。
694數(shù)據(jù)的查詢操作
4.3WHERE子句
WHERE子句中將給出查詢語(yǔ)句的選擇條件,條件表達(dá)式中可使用邏輯運(yùn)算符、比較運(yùn)算符和算術(shù)運(yùn)算符。WHERE子句中使用的運(yùn)算符如下:1.比較運(yùn)算符<、<=、>、>=、=、<>,用于字符串表達(dá)式、算術(shù)表達(dá)式,以及特殊的類型(如日期類型)的比較。比較表達(dá)式運(yùn)算的結(jié)果是邏輯值真(T)或假(F),即表達(dá)式成立為真,否則為假。
704數(shù)據(jù)的查詢操作
4.3WHERE子句例29列出教工表中工資在3000元以上的名單。SELECT姓名 FROM教工 WHERE工資>=3000714數(shù)據(jù)的查詢操作
4.3WHERE子句例30列出學(xué)生表中1980年1月1日之后出生的學(xué)生名單。
SELECT姓名FROM學(xué)生WHERE出生年月>='1980-1-1'注意:進(jìn)行比較的數(shù)據(jù)類型必須一致。
724數(shù)據(jù)的查詢操作
4.3WHERE子句2.邏輯運(yùn)算符AND(邏輯與)、OR(邏輯或)、NOT(邏輯非),可將多個(gè)比較表達(dá)式連接起來(lái),構(gòu)成復(fù)雜的邏輯表達(dá)式,表示復(fù)雜的條件。邏輯表達(dá)式運(yùn)算的結(jié)果仍是邏輯值真(T)或假(F)。
734數(shù)據(jù)的查詢操作
4.3WHERE子句例31列出學(xué)生表中在1980年1月1日之后出生的男同學(xué)名單。
SELECT姓名FROM學(xué)生WHERE出生年月>='1980-1-1'AND性別='男'744數(shù)據(jù)的查詢操作
4.3WHERE子句例32列出教工表中教授或副教授中工資低于3000元的名單。
SELECT姓名FROM教工WHERE(職稱='教授'OR職稱='副教授')AND工資<3000754數(shù)據(jù)的查詢操作
4.4FROM子句
FROM子句實(shí)現(xiàn)關(guān)系的笛卡兒積運(yùn)算。WHERE子句實(shí)現(xiàn)選擇操作,SELECT子句的列名表實(shí)現(xiàn)投影。若FROM子句中所列的關(guān)系數(shù)大于1,整個(gè)查詢語(yǔ)句將實(shí)現(xiàn)關(guān)系代數(shù)的連接運(yùn)算。
764數(shù)據(jù)的查詢操作
4.4FROM子句例33顯示男學(xué)生的姓名和所在的系名稱。學(xué)生的姓名是學(xué)生關(guān)系的屬性,系名稱是系關(guān)系的屬性,很顯然,這兩個(gè)數(shù)據(jù)來(lái)自兩個(gè)表,由連接操作實(shí)現(xiàn)。關(guān)系代數(shù)表達(dá)式為:姓名,系名稱σ性別=”男”(學(xué)生?系)
774數(shù)據(jù)的查詢操作
4.4FROM子句實(shí)現(xiàn)這個(gè)查詢的SQL語(yǔ)句:
SELECT姓名,系名稱FROM學(xué)生,系WHERE學(xué)生.系編號(hào)=系.系編號(hào)AND性別='男'注意:由于系編號(hào)出現(xiàn)在多個(gè)表中,為了防止混淆,需要在屬性前面加前綴。如果一個(gè)屬性只在FROM子句所列關(guān)系中出現(xiàn)一次,可不加前綴。
784數(shù)據(jù)的查詢操作
4.4FROM子句查詢結(jié)果:姓名系名稱郭黎明計(jì)算機(jī)何漓江外語(yǔ)郭黎明經(jīng)濟(jì)王海洋經(jīng)濟(jì)794數(shù)據(jù)的查詢操作
4.4FROM子句
SQL允許在FROM子句中定義表的別名(簡(jiǎn)名),重寫例33中的SQL語(yǔ)句。SELECT姓名,系名稱FROM學(xué)生R,系SWHERER.系編號(hào)=S.系編號(hào)AND性別='男'對(duì)同一個(gè)關(guān)系中兩個(gè)元組進(jìn)行比較時(shí),使用別名非常有用。
805字符串操作通常字符串的定界符是英文的雙引號(hào)或單引號(hào),有些DBMS系統(tǒng)可能規(guī)定比較特殊,例如,SQLServer系統(tǒng)的字符串定界符只能是英文的單引號(hào),所以,本文例題采用單引號(hào)作為字符串的定界符。SQL語(yǔ)言中字符串操作符是LIKE或NOTLIKE。常用的字符串匹配符號(hào)有:百分號(hào)%表示任意子字符串。下劃線
_
表示任何一個(gè)字符。
815字符串操作字符串匹配符號(hào)的用法舉例:'Be%'表示任何以”Be”開(kāi)頭的字符串。'%idge%'表示任何包含”idge”的字符串。'______'表示只含有六個(gè)字符的字符串。'______%'表示至少含有六個(gè)字符的字符串。
825字符串操作
1.字符串操作符LIKE的應(yīng)用方法例35列出學(xué)生表中姓”王”的學(xué)生名單。
SELECT姓名FROM學(xué)生WHERE姓名LIKE’王%’
輸出結(jié)果是:
姓名王海洋王立平835字符串操作例36假設(shè)不確切知道某人姓名中的某個(gè)字,可用下列命令查詢:SELECT姓名FROM教工WHERE姓名LIKE'王_平'輸出結(jié)果是:
姓名王偉平845字符串操作
2.字符串操作符NOTLIKE的應(yīng)用方法例37查出所有不是教授的教工姓名。SELECT姓名FROM教工WHERE職稱NOTLIKE‘教授’輸出結(jié)果:
姓名李長(zhǎng)江姜立偉張麗麗王偉平855字符串操作
有些系統(tǒng)的SQL語(yǔ)言中,還提供了很多專門用于字符串操作的函數(shù)。例如,連接(“||”)、提取子字符串、計(jì)算字符串長(zhǎng)度、大小寫轉(zhuǎn)換等函數(shù)。
865字符串操作
4.幾個(gè)特殊的運(yùn)算符BETWEENAND查詢條件是在某個(gè)范圍之間NOTBETWEENAND不在某個(gè)范圍之間
875字符串操作例38檢索工資在1000元到2000元范圍內(nèi)的職工信息。SELECT*FROM職工
WHERE工資BETWEEN1000AND2000等價(jià)于SELECT*FROM職工
WHERE工資>=1000AND工資<=2000886排列元組的顯示順序在SQL的查詢語(yǔ)句中,可以利用ORDERBY子句,對(duì)查詢結(jié)果進(jìn)行排序。ORDERBY子句是查詢語(yǔ)句的可選項(xiàng),語(yǔ)法格式是:SELECT<列名l>,<列名2>,…,<列名n>FROM<表1>,<表2>,…,<表m>WHERE<條件表達(dá)式>ORDERBY<列名表>[DESC][ASC]其中:DESC表示降序,ASC表示升序,若缺省默認(rèn)為升序。
896排列元組的顯示順序例39按學(xué)號(hào)的升序,顯示系編號(hào)等于101的學(xué)生信息:SELECT*FROM學(xué)生WHERE系編號(hào)=101ORDERBY學(xué)號(hào)
查詢結(jié)果:
學(xué)號(hào)姓名性別出生年月系編號(hào)1022田平平女08/05/801011134包立琪女03/14/811011223姜明明男12/05/801011354王立平女12/05/81101907集合查詢
在第2章介紹了關(guān)系代數(shù)并、交和差運(yùn)算的概念。本節(jié)將用SQL語(yǔ)言實(shí)現(xiàn)這些關(guān)系代數(shù)的運(yùn)算。SQL-92在關(guān)系上的UNION、INTERSECT和EXCEPT操作對(duì)應(yīng)于關(guān)系代數(shù)中并(∪)、交(∩)、差(-)運(yùn)算。
917集合查詢?cè)O(shè)有關(guān)系R和S如圖4所示。RS圖4關(guān)系R和S
下面舉例說(shuō)明在SQL語(yǔ)言中,實(shí)現(xiàn)并、交、差運(yùn)算的方法。
ABCDa1b1c1d1a2b2c2d2a3b2c3d1a4b4c4d3ABCa1b1c1a5b1c2a6b3c3a4b4c4927集合查詢
7.1并操作
例40求R和S在屬性A、B、C上投影的并集,其關(guān)系代數(shù)表達(dá)式是:A,B,C(R)
∪
A,B,C(S)
SQL語(yǔ)句是:(SELECTA,B,CFROMR)UNION(SELECTA,B,CFROMS)937集合查詢
7.1并操作運(yùn)行結(jié)果:
說(shuō)明:與SELECT語(yǔ)句不同,UNION操作自動(dòng)消除重復(fù)的元組。如果想保留所有重復(fù),可以用UNIONALL代替UNION。
ABCa1b1c1a2b2c2a3b2c3a4b4c4a5b1c2a6b3c3947集合查詢
7.1并操作例41求關(guān)系R和S在屬性B上投影的并操作,要保留重復(fù)元組。關(guān)系代數(shù)表達(dá)式是:
B(R)∪B(S)SQL語(yǔ)句是:(SELECTBFROMR)UNIONALL(SELECTBFROMS)957集合查詢
7.1并操作運(yùn)行結(jié)果:
說(shuō)明:UNIONALL操作可以保留重復(fù)的元組。
Bb1b2b2b4b1b1b3b4967集合查詢
7.2交操作例42求關(guān)系R和S在屬性A、B、C上投影的交集。關(guān)系代數(shù)表達(dá)式是:
A,B,C(R)∩A,B,C(S)SQL語(yǔ)句:(SELECTA,B,CFROMR)INTERSECT(SELECTA,B,CFROMS)977集合查詢
7.2交操作運(yùn)行結(jié)果:
說(shuō)明:INTERSECT操作自動(dòng)消除重復(fù)。如果想保留所有重復(fù),可以用INTERSECTALL代替INTERSECT。
ABCa1b1c1a4b4c4987集合查詢
7.2交操作
例43
求屬于R且也屬于S的B值,要求保留重復(fù)值。關(guān)系代數(shù)表達(dá)式是:
B(R)∩B(S))SQL語(yǔ)句是:
(SELECTBFROMR)INTERSECTALL(SELECTBFROMS)997集合查詢
7.2交操作
運(yùn)行結(jié)果:
說(shuō)明:INTERSECTALL操作可以保留重復(fù)的元組。注:SQLSERVER2000的T-SQL語(yǔ)言并不直接支持INTERSECT操作符,可用EXISTS可以模擬INTERSECT操作。
Bb1b4b1b1b41007集合查詢
7.3差操作例44求關(guān)系R和S在屬性A、B、C上投影的差集。關(guān)系代數(shù)表達(dá)式是:
A,B,C(R)-A,B,C(S)SQL語(yǔ)句是:(SELECTA,B,CFROMR)EXCEPT(SELECTA,B,CFROMS)1017集合查詢
7.3差操作運(yùn)行結(jié)果是:
說(shuō)明:EXCEPT操作能夠自動(dòng)消除重復(fù)。如果想保留所有重復(fù),可以用EXCEPTALL代替EXCEPT。
ABCa2b2c2a3b2c31027集合查詢
7.3差操作例45找出屬于R,且不屬于S的B值,要求保留重復(fù)值。關(guān)系代數(shù)表達(dá)式:B(R)-B(S)SQL語(yǔ)句:(SELECTBFROMR)EXCEPTALL(SELECTBFROMS)1037集合查詢
7.3差操作運(yùn)行結(jié)果:
說(shuō)明:EXCEPTALL將保留重復(fù)。在SQLSERVER2000的TRANSACTION_SQL語(yǔ)言并不直接支持EXCEPT操作符,可以用NOTEXISTS模擬EXCEPT操作。
Bb2b21048聚集函數(shù)聚集函數(shù)是對(duì)一組值進(jìn)行計(jì)算,并返回單個(gè)值的函數(shù)。聚集函數(shù)經(jīng)常與查詢語(yǔ)句的GROUPBY子句一同使用,在查詢結(jié)果中生成匯總值。表2中列舉SQL的聚集函數(shù)。
1058聚集函數(shù)
表2SQL的聚集函數(shù)
函數(shù)名功能參數(shù)類型AVG求平均值數(shù)值SUM求總和數(shù)值MAX求最大值數(shù)值、其他類型MIN求最小值數(shù)值、其他類型COUNT計(jì)數(shù)數(shù)值、其他類型1068聚集函數(shù)
其中AVG和SUM函數(shù)的參數(shù)必須是數(shù)值型,其他函數(shù)的參數(shù)還可以是非數(shù)值型,如字符串。聚集函數(shù)只能作為SELECT和HAVING子句的參數(shù)。除了COUNT函數(shù)之外,其他聚集函數(shù)忽略空值。
1078聚集函數(shù)1.求平均值函數(shù)聚集函數(shù)AVG用于計(jì)算列中數(shù)值的平均值,所以函數(shù)AVG的參數(shù)必須是數(shù)值型。
1088聚集函數(shù)例46求教工表中教授工資的平均值。
SELECTAVG(工資)AS平均工資FROM教工WHERE職稱=‘教授’查詢結(jié)果:
平均工資35801098聚集函數(shù)2.求總和函數(shù)聚集函數(shù)SUM用于計(jì)算列中數(shù)值的總和,函數(shù)SUM的參數(shù)必須是數(shù)值型。
1108聚集函數(shù)例47求所有教工的工資總和。
SELECTSUM(工資)AS工資總和
FROM教工
查詢結(jié)果:工資總和1786001118聚集函數(shù)求最大值和最小值函數(shù)聚集函數(shù)MAX用于求列中的最大值,MIN求列中的最小值,這兩個(gè)的參數(shù)允許是數(shù)值型的,也可以是其他數(shù)據(jù)類型(如字符型和時(shí)間型的數(shù)據(jù))。
1128聚集函數(shù)例48
找出教工中最高工資和最低工資。
SELECTMAX(工資),MIN(工資)FROM教工查詢結(jié)果:
MAX(工資)MIN(工資)3740.002130.001138聚集函數(shù)
例49顯示學(xué)生中最早和最晚的出生日期。
SELECTMIN(出生日期),MAX(出生日期)FROM學(xué)生查詢結(jié)果:
注意:出生日期是日期型數(shù)據(jù),日期型數(shù)據(jù)的特點(diǎn),最大數(shù)據(jù)恰好是最小年齡。
MIN(出生日期)MAX(出生日期)10/05/197904/13/19821148聚集函數(shù)4.計(jì)數(shù)器函數(shù)聚集函數(shù)COUNT統(tǒng)計(jì)表中的行數(shù)。COUNT函數(shù)有3種格式:
COUNT(*)統(tǒng)計(jì)所有行數(shù),包括含有空值的行。COUNT(表達(dá)式)計(jì)算每一行中表達(dá)式的值,并返回非空值的行數(shù)。COUNT(DISTINCT(表達(dá)式))計(jì)算每一行表達(dá)式的值,并返回唯一值且非空值的行數(shù)。
1158聚集函數(shù)例50查詢學(xué)生的總?cè)藬?shù)。
SELECTCOUNT(*)AS人數(shù)FROM學(xué)生查詢結(jié)果:
人數(shù)101168聚集函數(shù)
例51假設(shè)在學(xué)生表中增加一名新生,只插入該生的學(xué)號(hào)和姓名。執(zhí)行下列插入語(yǔ)句:
INSERTINTOSTUDENT(SNO,SNAME)VALUES('991033','葛小燕')
分別利用COUNT()函數(shù)的三種格式,觀察COUNT()函數(shù)的使用方法。
1178聚集函數(shù)(1)
如果要統(tǒng)計(jì)學(xué)生表的行數(shù),即包括系編號(hào)為空值的行在內(nèi),則使用第一種格式。
SELECTCOUNT(*)FROM學(xué)生
查詢結(jié)果:
COUNT(*)111188聚集函數(shù)(2)如果要統(tǒng)計(jì)學(xué)生表中系編號(hào)非空值的行數(shù),即不包括系編號(hào)為空值的行,則使用第二種格式。SELECTCOUNT(系編號(hào))FROM學(xué)生
查詢結(jié)果:
COUNT(系編號(hào))101198聚集函數(shù)(3)如果要統(tǒng)計(jì)成績(jī)表中所有選課的學(xué)生人數(shù),即不管一名學(xué)生選了幾門課程,都只計(jì)算一次,則使用第三種格式。SELECTCOUNT(DISTINCT(學(xué)號(hào)))AS人數(shù)FROM成績(jī)查詢結(jié)果:
人數(shù)51209GROUPBY和HAVING子句在SQL語(yǔ)言的查詢語(yǔ)句中,可以用GROUPBY子句實(shí)現(xiàn)對(duì)元組的分組功能。還可以利用HAVING子句對(duì)GROUPBY分組的結(jié)果進(jìn)行篩選,保留滿足條件的分組。GROUPBY子句HAVING子句是查詢語(yǔ)句的可選項(xiàng),語(yǔ)法格式是:SELECT<列名l>,<列名2>,…,<列名n>FROM<表1>,<表2>,…,<表m>WHERE<條件表達(dá)式>[GROUPBY<分組表達(dá)式>] [HAVING<篩選條件表達(dá)式>]
1219GROUPBY和HAVING子句
9.1GROUPBY子句在GROUPBY子句中的分組表達(dá)式可以是一個(gè)屬性或者多個(gè)屬性,其功能是將在分組表達(dá)式上具有相同值的元組放在一個(gè)組內(nèi)。
1229GROUPBY和HAVING子句
9.1GROUPBY子句例52
統(tǒng)計(jì)學(xué)生表中男生和女生的人數(shù)。SELECT性別,COUNT(*)FROM學(xué)生 GROUPBY性別
查詢結(jié)果:
性別COUNT(*)男5女51239GROUPBY和HAVING子句
9.1GROUPBY子句
例52統(tǒng)計(jì)成績(jī)表中,每一門課程的平均成績(jī)。SELECT課程編號(hào),AVG(分?jǐn)?shù))FROM成績(jī)GROUPBY課程編號(hào)查詢結(jié)果:
注意:帶有GROUPBY子句的查詢語(yǔ)句中,SELECT子句的列名中必須包括分組表達(dá)式,還可以包括集聚函數(shù),除此而外不能有其他列名。
課程編號(hào)AVG(分?jǐn)?shù))C170C284C365C4871249GROUPBY和HAVING子句
9.1GROUPBY子句例53查詢教工表中每一種職稱的最高工資和最低工資。SELECT職稱,MAX(工資),MIN(工資)
FROM教工GROUPBY職稱
查詢結(jié)果:
職稱MAX(工資)MIN(工資)教授3740.003420.00副教授3190.003140.00講師224002130.001259GROUPBY和HAVING子句
9.2HAVING子句使用GROUPBY子句時(shí),可以利用HAVING子句對(duì)GROUPBY分組的結(jié)果進(jìn)行篩選,保留滿足條件的分組。HAVING子句的格式:HAVING<條件表達(dá)式>1269GROUPBY和HAVING子句
9.2HAVING子句HAVING與WHERE子句都有<條件表達(dá)式>,注意兩者之間的區(qū)別。WHERE子句中的<條件表達(dá)式>是在GROUPBY分組之前起作用,而HAVING子句的<條件表達(dá)式>是在形成分組后起作用,所以,在HAVING的條件表達(dá)式中可以使用聚集函數(shù)(這一點(diǎn)與WHERE不同)。
1279GROUPBY和HAVING子句
9.2HAVING子句例54
對(duì)于成績(jī)表中分?jǐn)?shù)在60以上的行按照學(xué)號(hào)分組,其中只包含選課數(shù)大于2且平均分超過(guò)70的學(xué)號(hào)、選課數(shù)和平均分。SELECT學(xué)號(hào),COUNT(課程編號(hào)),AVG(分?jǐn)?shù))FROM成績(jī) WHERE分?jǐn)?shù)>=60GROUPBY學(xué)號(hào)HAVINGCOUNT(課程編號(hào))>2ANDAVG(分?jǐn)?shù))>70分析這個(gè)語(yǔ)句的WHERE、GROUPBY和HAVING子句執(zhí)行的順序。已知成績(jī)表如圖4所示。
1289GROUPBY和HAVING子句
9.2HAVING子句成績(jī)
圖4成績(jī)表
學(xué)號(hào)課程號(hào)分?jǐn)?shù)1022C101881022C102672124C101562124C102952124C103454021C104874021C102784021C103671223C101661223C102893012C102933012C103841299GROUPBY和HAVING子句
9.2HAVING子句(1)這個(gè)語(yǔ)句首先執(zhí)行WHERE子句,選擇滿足條件的10行(去除不及格的2行)。
學(xué)號(hào)課程號(hào)分?jǐn)?shù)1022C101881022C102672124C102954021C104874021C102784021C103671223C101661223C102893012C102933012C103841309GROUPBY和HAVING子句
9.2HAVING子句(2)然后執(zhí)行GROUPBY子句,將10行按照學(xué)號(hào)分成5組。
學(xué)號(hào)課程號(hào)分?jǐn)?shù)1022C101881022C102672124C102954021C104874021C102784021C103671223C101661223C102893012C102933012C103841319GROUPBY和HAVING子句
9.2HAVING子句(3)最后執(zhí)行HAVING子句,以“選課數(shù)大于2且平均分超過(guò)70”為條件篩選分組的結(jié)果,最后滿足條件的組只有1組。
運(yùn)行結(jié)果
:
學(xué)號(hào)課程號(hào)分?jǐn)?shù)4021C104874021C102784021C10367學(xué)號(hào)COUNT(課程號(hào))
AVG(分?jǐn)?shù))
4021377.331329GROUPBY和HAVING子句
9.2HAVING子句例55
統(tǒng)計(jì)成績(jī)表中選修人數(shù)超過(guò)2以上的課程編號(hào)和人數(shù)。
SELECT課程編號(hào),COUNT(*)FROM成績(jī)GROUPBY課程編號(hào)HAVINGCOUNT(*)>2
首先,按照課程編號(hào)分成4組,再過(guò)濾掉選修人數(shù)小于或等于2的組。
13310空值在SQL語(yǔ)言中,允許使用NULL值表示某個(gè)屬性的值為空(即沒(méi)有值)。對(duì)于空值的處理方法和原則是一個(gè)容易混淆的問(wèn)題。
13410空值
10.1ISNULL和ISNOTNULL運(yùn)算符在SQL語(yǔ)言中,允許在條件表達(dá)式中使用特殊的運(yùn)算符號(hào)ISNULL測(cè)試屬性值是否為空值,或者用ISNOTNULL測(cè)試是否為非空值。下面舉例說(shuō)明這兩個(gè)運(yùn)算符的使用方法。假設(shè)有貸款表如圖5所示。
圖5貸款關(guān)系
帳號(hào)姓名金額G10020關(guān)平之200300T20078李連玉K65743姜海洋30092.00H89765田平平30200.60H76890方一華19080.4013510空值
10.1ISNULL和ISNOTNULL運(yùn)算符例56找出貸款表中金額為空值的帳號(hào)和姓名。
SELECT帳號(hào),姓名FROM貸款WHERE金額ISNULL
查詢結(jié)果:
帳號(hào)姓名T20078李連玉13610空值
10.1ISNULL和ISNOTNULL運(yùn)算符例57找出貸款表中貸款金額非空的帳號(hào)和姓名。
SELECT帳號(hào),姓名FROM貸款WHERE金額ISNOTNULL
查詢結(jié)果:
帳號(hào)姓名G10020關(guān)平之K65743姜海洋H89765田平平H76890方一華13710空值
10.2空值的處理原則
1.在算術(shù)運(yùn)算和比較運(yùn)算中對(duì)NULL的處理方法:若算術(shù)運(yùn)算(+、-、*或/)的參數(shù)中含有NULL,則該算術(shù)表達(dá)式的運(yùn)算結(jié)果是NULL。若比較運(yùn)算中有NULL作為比較對(duì)象,則比較的結(jié)果視為假(false)。SQL92規(guī)定,比較運(yùn)算中有NULL作為比較對(duì)象,則比較的結(jié)果是“不知道(unknown)”,而不用假(false)來(lái)表示。幾乎其他所有情況下,將unknown作為false。13810空值
10.2空值的處理原則2.聚集函數(shù)對(duì)NULL的處理原則:SUM、AVG、MIN、MAX函數(shù)對(duì)參數(shù)中的空值(NULL)忽略不計(jì)。若所有參數(shù)值都是空值(NULL),則函數(shù)的返回值是NULL。COUNT函數(shù)對(duì)參數(shù)中的空值(NULL)也計(jì)數(shù)。若所有參數(shù)值都是空值(NULL),則函數(shù)的返回值是0。
13911關(guān)系的連接操作利用連接操作,可以根據(jù)表與表之間的邏輯聯(lián)系從兩個(gè)或多個(gè)表中查詢數(shù)據(jù)。早期的SQL版本,實(shí)現(xiàn)連接方法是在FROM子句中給出連接操作的表名,在WHERE子句中給出連接和選擇的條件。
14011關(guān)系的連接操作例58從學(xué)生、課程和成績(jī)表中,產(chǎn)生數(shù)據(jù)庫(kù)課程的成績(jī)單。SELECT姓名,課程名,分?jǐn)?shù)FROM學(xué)生S,課程C,成績(jī)GWHERES.學(xué)號(hào)=G.學(xué)號(hào)ANDG.課程編號(hào)=C.課程號(hào)ANDC.課程名='數(shù)據(jù)庫(kù)'14111關(guān)系的連接操作SQL-92提供更豐富的連接操作,包括:內(nèi)連接、條件連接、自然連接、左外連接、右外連接、全連接,同時(shí)增加了在FROM子句定義連接條件的方法。FROM子句的語(yǔ)法格式:FROM<表1><連接類型><表2>[ON(<連接條件>)]14211關(guān)系的連接操作例58題的SQL語(yǔ)句也可以等價(jià)為:SELECT姓名,課程名,分?jǐn)?shù)FROM學(xué)生SJOIN成績(jī)GON(S.學(xué)號(hào)=G.學(xué)號(hào))JOIN課程CON(G.課程號(hào)=C.課程號(hào))WHEREC.課程名稱=’數(shù)據(jù)庫(kù)’14311關(guān)系的連接操作
說(shuō)明:利用FROM子句定義連接條件,不僅可以簡(jiǎn)化連接條件的表達(dá)方法,而且能夠提高查詢效率。因?yàn)椋赟QL系統(tǒng)中FROM、WHERE和HAVING子句執(zhí)行的邏輯順序是:FROM子句中的連接條件。WHERE子句中的連接條件與選擇條件。HAVING子句中的篩選條件。在使用支持SQL-92標(biāo)準(zhǔn)的系統(tǒng)時(shí),建議用FROM子句定義連接條件。表3中列出各種連接操作的類型。
14411關(guān)系的連接操作表3連接操作一覽表
連接名稱SQL-92關(guān)鍵字內(nèi)連接INNERJOIN自然連接NATURALJOIN交叉連接CROSSJOIN左外連接LEFTOUTERJOIN右外連接RIGHTOUTERJOIN全連接FULLOUTERJOIN自連接SELFJOIN14511關(guān)系的連接操作
11.1內(nèi)連接關(guān)系R和S進(jìn)行連接操作,且連接條件為P。若連接操作的結(jié)果中只包含R與S在P上相匹配的行,這種連接屬于內(nèi)連接(INNERJOIN)。用FROM子句表示內(nèi)連接的子句:FROMR[INNER]JOINS[ON(<連接條件>)]其中,INNER可省略。
14611關(guān)系的連接操作
11.1內(nèi)連接假設(shè)有導(dǎo)師與研究生2個(gè)表,如圖6所示。
導(dǎo)師研究生圖6導(dǎo)師與研究生表
教工號(hào)姓名性別T001江海男T002代寧女T005潘濤男T008田立女學(xué)號(hào)姓名導(dǎo)師號(hào)99001李南T00199002劉星T00299003王海T00299004張力T00199006郭天14711關(guān)系的連接操作
11.1內(nèi)連接例59查詢研究生與其導(dǎo)師的情況。此查詢涉及教師和研究生2個(gè)表,連接條件是:<研究生.導(dǎo)師號(hào)=教師.教工號(hào)>。關(guān)系代數(shù)表達(dá)式是:
教師
?研究生
SELECT*FROM研究生AINNERJOIN教師BONA.導(dǎo)師號(hào)=B.教工號(hào)也可以寫成等價(jià)的SQL語(yǔ)句:SELECT*FROM研究生A,導(dǎo)師BWHEREA.導(dǎo)師號(hào)=B.教工號(hào)14811關(guān)系的連接操作
11.1內(nèi)連接查詢結(jié)果是:
這是一個(gè)內(nèi)連接的例子,查詢結(jié)果中只包含滿足連接條件的4行。
學(xué)號(hào)
姓名
導(dǎo)師號(hào)
教工號(hào)姓名
性別
99001李南T001T001江海男99002劉星T002T002代寧女99003王海T002T002代寧女99004張力T001T001江海男14911關(guān)系的連接操作
11.2自然連接設(shè)關(guān)系R和S進(jìn)行連接操作,其連接條件為P。如果P是R與S中連接屬性的等值比較,稱為等值連接。若R與S進(jìn)行等值連接,且R與S的連接屬性名相同,稱為自然連接。自然連接是等值連接的特例。自然連接的實(shí)現(xiàn)方法是在內(nèi)連接的基礎(chǔ)上,用SELECT子句消除重復(fù)列。
15011關(guān)系的連接操作
11.2自然連接例60根據(jù)學(xué)生、課程和成績(jī)表,輸出“計(jì)算機(jī)”課程的成績(jī)單,包括姓名和分?jǐn)?shù)。這個(gè)查詢是三個(gè)表的自然連接,其關(guān)系代數(shù)表達(dá)式是:
∏姓名,分?jǐn)?shù)(σ課程名=’數(shù)據(jù)庫(kù)’(學(xué)生?成績(jī)?課程))
SELECT姓名,分?jǐn)?shù)
FROM學(xué)生AJOIN成績(jī)BON(A.學(xué)號(hào)=B.學(xué)號(hào))JOIN課程CON(B.課程號(hào)=C.課程號(hào))WHEREC.課程名=’計(jì)算機(jī)’15111關(guān)系的連接操作
11.2自然連接等價(jià)的SQL語(yǔ)句:SELECT姓名,分?jǐn)?shù)FROM學(xué)生A,成績(jī)B,課程CWHEREA.學(xué)號(hào)=B.學(xué)號(hào)ANDB.課程編號(hào)=C.課程號(hào)ANDC.課程名='計(jì)算機(jī)'
查詢結(jié)果:
這是一個(gè)自然連接的實(shí)例,查詢結(jié)果中包含滿足連接條件元組,且沒(méi)有重復(fù)列。
姓名分?jǐn)?shù)
郭黎明45何明慧67何漓江8415211關(guān)系的連接操作
11.3交叉連接
設(shè)有關(guān)系R和S,R與S的笛卡兒乘積稱為交叉連接。在SQL中,實(shí)現(xiàn)R與S交叉連接的方法是在FROM子句中定義交叉連接類型:FROMRCROSSJOINS15311關(guān)系的連接操作
11.3交叉連接例61根據(jù)圖6中導(dǎo)師與研究生表,計(jì)算導(dǎo)師與研究生關(guān)系的笛卡兒乘積。SELECT*FROM導(dǎo)師
CROSSJOIN研究生等價(jià)的SQL語(yǔ)句:SELECT*FROM導(dǎo)師,研究生
15411關(guān)系的連接操作
11.3交叉連接運(yùn)行結(jié)果:這是一個(gè)交叉連接的實(shí)例,查詢結(jié)果中包含20行。
15511關(guān)系的連接操作
11.4左外連接關(guān)系R與S進(jìn)行連接操作,連接條件為P。若連接操作的結(jié)果中除了R與S在P上內(nèi)連接結(jié)果之外,還包括左邊關(guān)系R在內(nèi)連接操作中不相匹配的元組,而其對(duì)應(yīng)于S的屬性賦予空值,這種連接稱為左外連接(LEFTOUTERJOIN)。實(shí)現(xiàn)左外連接的SQL子句:FROMRLEFTOUTERJOINSON(<連接條件>)
15611關(guān)系的連接操作
11.4左外連接例62查詢教師指導(dǎo)研究生的情況,包括不指導(dǎo)研究生的教師。
SELECT*FROM導(dǎo)師ALEFTOUTERJOIN研究生BON(A.教工號(hào)=B.導(dǎo)師號(hào))15711關(guān)系的連接操作
11.4左外連接
查詢結(jié)果:可見(jiàn)左外連接操作的結(jié)果中除了滿足連接條件元組的之外,還包含左邊關(guān)系不滿足連接條件的元組,而其對(duì)應(yīng)的右邊屬性全部填充NULL。
教工號(hào)姓名性別學(xué)號(hào)姓名導(dǎo)師號(hào)T001江海男99001李南T001T002代寧女99002劉星T002T002代寧女99003王海T002T001江海男99004張力T001T005潘濤男NULLNULLNULLT008田立女NULLNULLNULL15811關(guān)系的連接操作
11.5右外連接關(guān)系R與S進(jìn)行連接操作,連接條件為P。若連接操作的結(jié)果中除了R與S在P上內(nèi)連接結(jié)果之外,還包括右邊關(guān)系S在內(nèi)連接操作中不相匹配的元組,而其對(duì)應(yīng)于R的屬性賦予空值,這種連接稱為右外連接(RIGHTOUTERJOIN)。實(shí)現(xiàn)右外連接的SQL子句:FROMRRIGHTOUTERJOINSON(<連接條件>)
15911關(guān)系的連接操作
11.5右外連接例63查詢所開(kāi)課程的選修情況,包括沒(méi)有任何學(xué)生選修的課程。SELECT學(xué)號(hào),課程名,分?jǐn)?shù)FROM成績(jī)ARIGHTOUTERJOIN
課程B
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國(guó)檢驗(yàn)管理軟件項(xiàng)目創(chuàng)業(yè)計(jì)劃書
- 中國(guó)家居O2O項(xiàng)目創(chuàng)業(yè)計(jì)劃書
- 中國(guó)激光診斷儀項(xiàng)目創(chuàng)業(yè)計(jì)劃書
- 中國(guó)苦瓜種植項(xiàng)目創(chuàng)業(yè)計(jì)劃書
- 中國(guó)三網(wǎng)融合光通信器件項(xiàng)目創(chuàng)業(yè)計(jì)劃書
- 中國(guó)融合通信(UC)項(xiàng)目創(chuàng)業(yè)計(jì)劃書
- 中國(guó)光網(wǎng)絡(luò)項(xiàng)目創(chuàng)業(yè)計(jì)劃書
- 中國(guó)電子信息項(xiàng)目創(chuàng)業(yè)計(jì)劃書
- 深部開(kāi)采工程優(yōu)化設(shè)計(jì)方法-洞察闡釋
- 樂(lè)理面試試題及答案
- 貸款后管理與客戶滿意度提升
- 五下音樂(lè)測(cè)試題及答案
- 考評(píng)員考試題及答案
- 中醫(yī)骨科試題及答案
- 杭州市上城區(qū)2025年下半年下半年招考50名專職社區(qū)工作者易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2024年湖南省普通高中學(xué)業(yè)水平合格性考試地理試題(原卷版)
- T/CECS 10400-2024固廢基膠凝材料
- 2025春季學(xué)期國(guó)開(kāi)電大本科《理工英語(yǔ)3》一平臺(tái)在線形考綜合測(cè)試(形考任務(wù))試題及答案
- 資質(zhì)買賣居間協(xié)議書
- 數(shù)據(jù)可視化與Python試題及答案
- 2025時(shí)政試題及答案(100題)
評(píng)論
0/150
提交評(píng)論