關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL_第1頁(yè)
關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL_第2頁(yè)
關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL_第3頁(yè)
關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL_第4頁(yè)
關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL_第5頁(yè)
已閱讀5頁(yè),還剩113頁(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)介

要點(diǎn)

?SQL語(yǔ)言簡(jiǎn)介

4SQL語(yǔ)言及其使用方式

■獨(dú)立式SQL

■嵌入式SQL

第2頁(yè)

2009-9-23

3.1SQL概述

?StructuredQueryLanguage,1974年被提出

?關(guān)系數(shù)據(jù)庫(kù)的國(guó)際標(biāo)準(zhǔn)語(yǔ)言:大多數(shù)數(shù)據(jù)庫(kù)

均用SQL作為共同的數(shù)據(jù)存取語(yǔ)言和標(biāo)準(zhǔn)接

口,實(shí)現(xiàn)不同數(shù)據(jù)庫(kù)系統(tǒng)之間的互操作

?目前仍被不斷擴(kuò)充//

?介于關(guān)系代數(shù)和關(guān)系演算之間,三者可相互

轉(zhuǎn)換K\7<

第3頁(yè)

2009-9-23

SQL的特點(diǎn)

?綜合統(tǒng)一:

■集DDL、DML、DCL功能于一體,可獨(dú)立完成數(shù)據(jù)庫(kù)

生命周期中的全部活動(dòng),語(yǔ)言風(fēng)格統(tǒng)一

?高度非過(guò)程化:

-用戶只需提出“做什么”,而無(wú)需指明“怎么做”

?面向集合的操作方式:

-操作對(duì)象、查詢結(jié)果、更新數(shù)據(jù)均可以是元組的集合

?提供兩種使用方式:

■自含式、嵌入式SQL功能關(guān)鍵動(dòng)詞

?語(yǔ)言簡(jiǎn)捷,易學(xué)易用數(shù)據(jù)查詢SELECT

數(shù)據(jù)定義CREATE,DROP,ALTER

數(shù)據(jù)操縱INSERT,UPDATE,

DELETE

第4頁(yè)

數(shù)據(jù)控制GRANT,REVOKE

2009-9-23

SQL語(yǔ)言的基本概念

?SQL支持關(guān)系數(shù)據(jù)庫(kù)的三級(jí)模式結(jié)構(gòu)

-存儲(chǔ)文件:組成關(guān)系數(shù)據(jù)庫(kù)的內(nèi)模式,對(duì)用戶透明

■基表(BaseTable):組成關(guān)系數(shù)據(jù)庫(kù)的模式,一個(gè)關(guān)系對(duì)應(yīng)一個(gè)基表,

――或多個(gè)基表對(duì)應(yīng)一個(gè)存儲(chǔ)文件

■視圖(View):組成關(guān)系數(shù)據(jù)庫(kù)的外模式,從一個(gè)或多個(gè)基表中導(dǎo)出,

不獨(dú)立存儲(chǔ)在數(shù)據(jù)庫(kù)中

第5頁(yè)存儲(chǔ)文件1存儲(chǔ)文件2

2009-9-23

3.2數(shù)據(jù)定義

?SQL的數(shù)據(jù)定義語(yǔ)言(DDL)

操作方式

操作對(duì)象

創(chuàng)建刪除修改

基表CREATETABLEDROPTABLEALTERTABLE

視圖CREATEVIEWDROPVIEW

索引CREATEINDEXDROPINDEX

第6頁(yè)

2009-9-23

CREATETABLEv表名〉(

v列名,v數(shù)據(jù)類型刁列級(jí)完整性約束]定義基表

[,<列名>v數(shù)據(jù)類型刁列級(jí)完整性約束]]…

[,〈表級(jí)完整性約束>]);

“數(shù)據(jù)類型:

■不同的數(shù)據(jù)庫(kù)系統(tǒng)有自己的數(shù)據(jù)類型規(guī)定,但一般都包

括INTEGER,FLOAT,CHAR(n),VARCHAR(n)等

?完整性約束條件

■列級(jí)完整性約束條件:涉及表的某一列

?如對(duì)數(shù)據(jù)類型的約束,對(duì)數(shù)據(jù)格式的約束,對(duì)取值范圍或集合的

約束,對(duì)空值NULL(空值,不知道或不能用的值)的約束,對(duì)取值

的唯一性UNIQUE約束,對(duì)列的排序說(shuō)明等

■表級(jí)完整性約束條件:涉及表的一個(gè)或多個(gè)列

?如訂貨關(guān)系中規(guī)定發(fā)貨量不得超過(guò)訂貨量,如教授工資不得低于

___1000元等>/

第7頁(yè)/———

2009-9-23

SQL支持的數(shù)據(jù)類型

?SMALLINT半字長(zhǎng)的整數(shù)

?INT全字長(zhǎng)的整數(shù)

?FLOAT浮點(diǎn)數(shù)

?CHAR(n)長(zhǎng)度為。的定長(zhǎng)字符串

?VARCHAR(n)最大長(zhǎng)度為"的變長(zhǎng)字符串

?DEC(p,q)十進(jìn)制數(shù),共p位,小數(shù)點(diǎn)后有q位,

?DATE日期型,格式Y(jié)YYY-MM-DD

?TIME時(shí)間型,格式為HH.MM.SS

?TIMESTAMP日-時(shí)戳(日期加時(shí)間)

第8頁(yè)/Z-——

2009-9-23

完整性約束

?CREATETABLE的完整性約束

■NOTNULL屬性值禁止為空

■UNIQUE取值唯一

■PRIMARYKEY(4,…,AJ主碼--若干屬性列

■CHECK(P)尸為條件表達(dá)式

?SQL-92以后版本中,一個(gè)屬性若有PRIMARYKEY聲明則隱含

有NOTNULL約束\/

第9頁(yè)/Z--------/\

2009-9-23

例:建立學(xué)生管理的相關(guān)基表

CREATETABLEStudent

(SnoCHAR(5)NOTNULLUNIQUE,

SnameCHAR(20)UNIQUE,

SsexCHAR(1),

SageINTEGER,CREATETABLECourse

SdeptCHAR(15));

(CnoCHAR(8)NOTNULLUNIQUE,

CnameCHAR(20),

CpnoINTEGER,

CcreditINTEGER);

CREATETABLESC---------------------

(SnoCHAR(5)NOTNULLUNIQUE,

CnoCHAR(8)NOTNULLUNIQUE,

第10頁(yè)GradeINTEGER);

2009-9-23

例:建立圖書管理的相關(guān)基表

CREATETABLEBorrows

(CardNoINTEGERNOTNULLUNIQUE,

NameCHAR(IO),

DeptCHAR(20));

CREATETABLEBooks

(BookNoINTEGERNOTNULLUNIQUE,

SortNoCHAR(IO),

TitleCHAR(30),

AuthorCHAR(12),CREATETABLELoans

(CardNoINTEGERNOTNULLUNIQUE,

PriceFLOAT,

BookNoINTEGERNOTNULLUNIQUE,

LoanNoINTEGER);TitleCHAR(30),

DateCHAR(10));

第11頁(yè)

2009-9-23

例:完整性約束

CREATETABLEbranch

(branch-namechar(15)notnull,

branch-citychar(30),

assetsinteger);

CREATETABLEbranch

(branch-namechar(15),

branch-citychar(30),

assetsInteger,

PRIMARYKEY(branch-name),

CHECK(assets>=0));

第12頁(yè)

2009-9-23

ALTERTABLEv表名)

[ADDv列名,〈數(shù)據(jù)類型〉修改基表

[列級(jí)完整性約束]]

[DROPv完整性約束名刁

[MODIFYv列名>〈數(shù)據(jù)類型>];

例ALTERTABLELoans

ADDXXINT;

ALTERTABLELoans

MODIFYCardnoSMALLINT;

ALTERTABLELoans

DROPUNIQUE(BookNo);

第13頁(yè)

2009-9-23

刪除基本表

DROPTABLEv表名);

DROPTABLELoans;

第14頁(yè)

2009-9-23

CREATE[UNIQUE][CLUSTER]

INDEXv余弓[名,ONv表名)建立索弓

(v列后〉[<ASC|DESC>]

[,v歹!J名>[<ASC|DESC>]]...);

?加快檢索速度

?UNIQUE表示索引的每一個(gè)索引值只對(duì)應(yīng)唯一的數(shù)據(jù)記錄

?CLUSTER:建聚簇索引,即索引項(xiàng)順序與表中記錄的物

理順序一致,一個(gè)基表只能建一個(gè)聚簇索引

?ASC(升序,缺省)、DESC(降序)

?索引建立后由系統(tǒng)使用和維護(hù),不需用戶干預(yù)

例1CREATEUNIQUEINDEXIBONBorrows(CardNo);

CREATEUNIQUEINDEXISONStudent(Sno);

第15頁(yè)CREATEUNIQUEINDEXSCnoONSC(SnoASC,CnoDESC);

2009-9-23

DROPINDEXv索引名〉;刪除索弓

?例

DROPINDEXIB;

DROPINDEXSCno;

第16頁(yè)

2009-9-23

3.3查詢

?數(shù)據(jù)庫(kù)查詢是數(shù)據(jù)庫(kù)的核心操作,SQL提供了

基于集合和關(guān)系的查詢操作,具有豐富的功能

和靈活的使用方式

?一個(gè)SQL查詢的結(jié)果是一個(gè)關(guān)系

?查詢可分為/

■單表查詢:查詢只涉及一個(gè)表

■連接查詢:查詢同時(shí)涉及兩個(gè)以上的表

■嵌套查詢:一個(gè)查詢塊嵌套在另一個(gè)查詢塊中

■視圖查詢:在視圖基礎(chǔ)上的查詢

第17頁(yè)//Z-——X—

2009-9-23

SQL查詢語(yǔ)句的格式

SELECT[ALL|DISTINCT]<目標(biāo)列表達(dá)式》[,v目標(biāo)列表達(dá)式習(xí)…

FROMv表名或視圖名>[,〈表名或視圖名刁…

[WHEREv條件表達(dá)式刁

[GROUPBYV列名1>[HAVING〈條件表達(dá)式>]]

[ORDERBYv歹!j名2>[ASC|DESC]];

?查詢語(yǔ)句的典型格式

select4,A2,An

fromr2,rm

whereP

在做每個(gè)SQL查詢時(shí)都試著寫出其關(guān)系代數(shù)表達(dá)式

口41,A2,M(O尸HXr2X…X啕)

第18頁(yè)

2009-9-23

3.3,1單表查詢

,、選擇表中若干列

■查詢指定列:在V目標(biāo)列表達(dá)式>中指定預(yù)查屬性

■查詢?nèi)苛校涸凇茨繕?biāo)列表達(dá)式〉中使用*

■查詢經(jīng)計(jì)算的值:在V目標(biāo)列表達(dá)式〉中可使用常

量、表達(dá)式、函數(shù)等

SELECTSno,SnameSELECT*

FROMStudent;FROMStudent;

SELECTSname5'YearofBirthis',2002-Sage

FROMStudent;

第19頁(yè)

2009-9-23

查詢實(shí)例

SELECTSname,'YearofBirthis',2002-Sage,ISLOWER(Sdept)

FROMStudent;

結(jié)果為:

SnameyearofBirth:52002-SageISLOWER(Sdept)

李勇YearofBirht:1982cs

劉晨YearofBirht:1983is

王敏YearofBirht:1984ma

張立YearofBirht:1983is

第20頁(yè)

2009-9-23

定義別名

用戶可以通過(guò)指定別名來(lái)改變查詢結(jié)果的列標(biāo)題,這對(duì)

于含算術(shù)表達(dá)式、常量、函數(shù)名的目標(biāo)列表達(dá)式尤為有

用。例如對(duì)于上例,可以定義如下列別名:

SELECTSnameNAME,'YearofBirth:9BIRTH,

1996-SageYEAR,ISLOWER(Sdept)DEPARTMENT

FROMStudent;

結(jié)果為:

NAMEBIRTHYEARDEPARTMENT

李勇YearofBirth:1982cs

劉晨YearofBirth:1983if

王敏YearofBirth:1984ma

第21頁(yè)_張立YearofBirth:1983if

2009-9-23

ACCESS數(shù)據(jù)庫(kù)中SQL例

別名表示:字段as別名

注:ISLOWER()函數(shù)在access中無(wú)法識(shí)別

SELECTSnameasNAME,YearofBirth;asBIRTH,

1996-SageasYEAR,SdeptasDEPARTMENT

FROMStudent;

第22頁(yè)

2009-9-23

二、選擇表中若干元z

取消取值重復(fù)的列:指定DISTINCT短語(yǔ)

查詢滿足條件的元組:在WHERE子句中指

定條件、-------

對(duì)查詢結(jié)果排序:使用ORDERBY

使用集函數(shù):COUNT,SUM,AVG,MAX,

MIN/Y

對(duì)查詢結(jié)果分組:使用GROUPBY,

HAVING\/

第23頁(yè)

2009-9-23

DISTINCT短語(yǔ)

?SQL允許重復(fù)的元組/行存在,如果需要去掉重復(fù)的元

組/行,必須指定DISTINCT短語(yǔ),缺省為ALL

?例:查詢選修了課程的學(xué)生學(xué)號(hào)

SELECTSnoFROMSC;

SELECTDISTINCTSno

FROMSC;

SELECTALLSnoFROMSC;

結(jié)果為:結(jié)果為:

SnoSno

9500195001

9500195002

95001

第24頁(yè)95002

2009-9-2395002

WHERE子句

?查詢滿足條件的元組:在WHERE子句中指定條件

?WHERE子句常用的查詢條件:

查詢條件謂詞

比較=>,<>=<=,!=,<>,!>,!<;NOT+上述比較運(yùn)算符

確定范圍BETWEENAND,NOTBETWEENAND

確定集合IN,NOTIN

字符匹配LIKE,NOTLIKE

空值ISNULL,ISNOTNULL

多重條件AND,OR

2009-9-23

Where子句一比較大小

例查詢計(jì)算機(jī)系全體學(xué)生的名單

SELECTSnameFROMStudentWHERESdept='CS9;

例查詢考試成績(jī)有不及格的學(xué)生的學(xué)號(hào)

SELECTDISTINCTSnoFROMSCWHEREGrade<60;

例查詢所有年齡在20歲以下的學(xué)生姓名及其年齡

SELECTSname,SageSELECTSname,Sage

FROMStudentFROMStudent

WHERESage<20;WHERENOTSage>=20;

第26頁(yè)

2009-9-23

Where子句一確定范圍

例查詢年齡在20?40歲之間的學(xué)生姓名、系別和年齡

SELECTSname,Sdept,Sage

FROMStudent

WHERESageBETWEEN20AND40;

例查詢年齡不在20?23歲之間的學(xué)生姓名、系別和年齡/

SELECTSname,Sdept,Sage

FROMStudent\

WHERESageNOTBETWEEN20AND23;

第27頁(yè)/Z-——NX

2009-9-23

Where子句一確定集合

例查詢信息系(IS)、數(shù)學(xué)系(MA)和計(jì)算機(jī)系(CS)學(xué)生的姓名和性別

SELECTSname,Ssex

FROMStudent

WHERESdeptIN('IS'JMA'JCS');

例查詢除信息系(IS)、數(shù)學(xué)系(MA)和計(jì)算機(jī)系(CS)以外其它

系學(xué)生的姓名和性別

SELECTSname,Ssex

FROMStudent

WHERESdeptNOTIN('IS';MA';CS')

第28頁(yè)------------------------------------------------------------------------

2009-9-23

Where子句一字符串匹配

■謂詞LIKE可以用來(lái)進(jìn)行字符串的匹配

■格式:[NOT]LIKE'〈匹配串〉'[ESCAPED換碼字符>']

■匹配串中%代表任意長(zhǎng)度的字符串,如a%b:acb,addgb,ab

■匹配串中—代表任意單個(gè)字符,如a_b:acbafb

例查詢學(xué)號(hào)為SELECT*

95001的學(xué)生FROMStudent

的詳細(xì)情況:WHERESnoLIKE'95001';

SELECT*

相當(dāng)于FROMStudent

WHERESno='95001';

第29頁(yè)

2009-9-23

通配符例子

例查詢所有姓劉的學(xué)生的詳細(xì)信息

SELECT*

FROMStudent

WHERESnameLIKE'劉%’;

例查詢所有全名為三個(gè)字且中間漢字為“明”的學(xué)生的詳細(xì)信

SELECT*\/

FROMStudent\/

WHERESnameLIKE]明―<-----inn

第30頁(yè)

2009-9-23

換碼字符

例查詢DB_Design課程的課程號(hào)和學(xué)分

SELECTCno,Credit

FROMCourse

WHERECnameLIKE€DB\_Design,ESCAPET;

注:ESCAPE'表示'為轉(zhuǎn)義換碼字符,緊跟其后的—轉(zhuǎn)義為普通—字符.

例查詢以“DB_”開頭,且倒數(shù)第3個(gè)字符為i的課程的詳細(xì)情況

SELECT*

FROMCourse

WHERECnameLIKE'DB\%i'ESCAPE;

第31頁(yè)Z—//'

2009-9-23

Where子句一涉及空值的查詢

例:某些學(xué)生選修課程后沒(méi)有參加考試,所以有選修課記錄,

但沒(méi)有考試成績(jī)。查詢?nèi)鄙俪煽?jī)的學(xué)生的學(xué)號(hào)和相應(yīng)的課程號(hào):

SELECTSno,Cno

FROMSC注意這里的“IS”不能用等號(hào)代

WHEREGradeISNULL;

例查詢所有有成績(jī)的學(xué)生學(xué)號(hào)和課程號(hào)

SELECTSno,Cno

FROMSC

WHEREGradeISNOTNULL;

第32頁(yè)

2009-9-23

Where子句一多重條件查詢

例查詢計(jì)算機(jī)系年齡在20歲以下的學(xué)生姓名

SELECTSname

FROMStudent

WHERESdept=CS'ANDSage<20;

例查詢信息系(IS)、數(shù)學(xué)系(MA)和計(jì)算機(jī)系(CS)學(xué)生的姓名

和性別/

SELECTSname,Ssex

FROMStudent

WHERESdept='IS'ORSdept='MA'ORSdept='CS’;

第33頁(yè)7―//V-

2009-9-23

練習(xí)

?關(guān)系:圖書(書號(hào),書名,作者,出版社,單價(jià))

BOOK(Bno,Bname,Author,Press,Price)

■查詢“數(shù)據(jù)庫(kù)”一書的書號(hào)和單價(jià)

■查詢單價(jià)在20至50元之間的圖書信息

-查詢北京某出版社出版的圖書信息

■查詢作者是張一,王二,劉三的書的信息

-查詢所有圖書的書號(hào),書名和半價(jià)信息

-查詢?nèi)鄙俪霭嫔缧畔⒌膱D書的書號(hào)和書名

第34頁(yè)

2009-9-23

三、對(duì)查詢結(jié)果排序

?ORDERBY子句可對(duì)查詢結(jié)果按照一個(gè)或多個(gè)屬性列的升

序(ASC)或降序(DESC)排列,缺省值為升序

例查詢選修了3號(hào)課程的學(xué)生的學(xué)號(hào)及其成績(jī),查詢結(jié)果按

分?jǐn)?shù)的降序排列

SELECTSno,GradeFROMSC

WHERECno=3ORDERBYGradeDESC;

例查詢?nèi)w學(xué)生情況,查詢結(jié)果按所在系的系號(hào)升序排列,

同一系中的學(xué)生按年齡降序排列(見(jiàn)mdb示例)

SELECT*FROMStudent

ORDERBYSdept,SageDESC;

第35頁(yè)______________________________________________

2009-9-23

四、使用集函數(shù)

COUNT([DISTINCT|ALL]*)統(tǒng)計(jì)元組個(gè)數(shù)

COUNT([DISTINCT|ALL]v列名〉)統(tǒng)一列中值的個(gè)數(shù)

SUM([DISTINCT|ALL卜列名,)計(jì)算一列值的總和

AVG([DISTINCT|ALL]v列名,)計(jì)算一列值的平均值

MAX([DISTINCT|ALL卜列名,)求一列值中的最大值

MIN([DISTINCT|ALL卜列名,)求一列值中的最小值

第36頁(yè)

2009-9-23

例查詢學(xué)生總?cè)藬?shù)實(shí)例

SELECTCOUNT(*)例查詢選修了課程的學(xué)生人數(shù)

FROMStudent;SELECTCOUNT(DISTINCTSno)

FROMSC;

例計(jì)算選修了1號(hào)課程的學(xué)生平均兩―

SELECTAVG(Grade)/

FROMSC/yXl/

WHERECno=T;

例查詢選修1號(hào)課程的學(xué)生最高分?jǐn)?shù)

SELECTMAX(Grade)

FROMSC

iWHERECno-'T;

2009-9-23

五、對(duì)查詢結(jié)果分z

?GROUPBY子句將查詢結(jié)果按某一列或多

列分組,值相等的為一組。

?對(duì)查詢結(jié)果分組的目的是為了細(xì)化集函數(shù)

的作用對(duì)象,分組后每個(gè)組都有一個(gè)函數(shù)

值/XT/

?如果分組后還要求按一定的條件對(duì)這些組

進(jìn)行篩選,最終只輸出滿足指定條件的組,

則可以是使用HAVING短語(yǔ)指定篩選條件

第38頁(yè)

2009-9-23

分組實(shí)例

例求各個(gè)課程號(hào)及相應(yīng)的選課人數(shù)

SELECTCno,COUNT(Sno)

FROMSC

GROUPBYCno;

例查詢選修了3門以上課程的學(xué)生學(xué)號(hào)

SELECTSno

FROMSC

GROUPBYSno

HAVINGCOUNT(*)>3;

第39頁(yè)------------------------------------

2009-9-23

練習(xí)

數(shù)據(jù)庫(kù)模式如下:

?倉(cāng)庫(kù)(倉(cāng)庫(kù)號(hào),負(fù)責(zé)人)

?貨物(貨物號(hào),貨物名,貨物描述)

?入庫(kù)記錄(貨物號(hào),倉(cāng)庫(kù)號(hào),數(shù)量,入庫(kù)日期,經(jīng)辦人號(hào))

用SQL實(shí)現(xiàn)以下查詢要求:

?查詢倉(cāng)庫(kù)中有多少種不同的貨物

?查詢每天入庫(kù)數(shù)量的最大值

?統(tǒng)計(jì)2003年3月20日以后每天入庫(kù)的貨物總數(shù)量

?按貨物號(hào)統(tǒng)計(jì)每一種貨物在倉(cāng)庫(kù)中的總數(shù)量

?查詢“A-00代號(hào)經(jīng)辦人當(dāng)日經(jīng)辦的入庫(kù)記錄數(shù)

第40頁(yè)/Z-X—

2009-9-23

SELECTCOUNT(*)

FROM貨物;

SELECTCOUNT(DISTINCT貨物號(hào))

FROM入庫(kù)記錄;

SELECT入庫(kù)日期,MAX(數(shù)量)

FROM入庫(kù)記錄

GROUPBY入庫(kù)日期;

SELECT入庫(kù)日期,SUM(數(shù)量)

FROM入庫(kù)記錄

GROUPBY入庫(kù)日期

HAVING入庫(kù)日期》“2003/03/20”;

第41頁(yè)

2009-9-23

SELECT貨物號(hào),SUM(數(shù)量)

FROM入庫(kù)記錄

GROUPBY貨物號(hào);

SELECTCOUNT(*)

FROM入庫(kù)記錄

WHERE入庫(kù)日期二Today。

GROUPBY經(jīng)辦人號(hào)

HAVING經(jīng)辦人號(hào)="A-001”;

第42頁(yè)

2009-9-23

3.3.2連接查詢

6連接(Join)查詢

■查詢涉及兩個(gè)以上的表(在FROM子句中體現(xiàn))

■From子句對(duì)應(yīng)于關(guān)系代數(shù)中笛卡兒乘積運(yùn)算,它

給出待掃描的關(guān)系/表(指定多個(gè)表),給出連接條件

?連接查詢的類型

■等值連接查詢/XI

■非等值連接查詢

■自然連接查詢N\/

■自身連接查詢\

■外連接查詢

■符合條件連接查詢〉Z\/

第43頁(yè)

2009-9-23

一、等值與非等值連接查詢

?連接條件的形式

■卜表名1>.]<列名1><比較運(yùn)算符〉卜表名2>.卜列名2>

?比較運(yùn)算符:=(等值連接)、>、<、>=、<=>!=

?連接字段必須是可比的

■代表名1>卜列名1>BETWEEN卜表名2>.卜歹U名2>AND

[v表名2>.卜列名3>V

?連接查詢的執(zhí)行過(guò)程

■首先在表1中找到第一個(gè)元組,然后從頭開始掃描表2,

逐一查找滿足連接條件的元組,找到后就將表1中的第

一個(gè)元組與該元組拼接起來(lái),形成結(jié)果表中的一個(gè)元組。

表2全部查找完后,再找表1中第二個(gè)元組,然后再?gòu)念^

開始掃描表2。重復(fù)上述操作,直至表1中的全部元組都

處理完畢為止?!?/p>

第44頁(yè)

2009-9-23

例子

0例32查詢每個(gè)學(xué)生及其選修課程的情況

學(xué)生情況存放Student表中,學(xué)生選課情況存放在SC

表中,所以本查詢實(shí)際上涉及Student與SC兩個(gè)表。通

過(guò)公共屬性Sno實(shí)現(xiàn)聯(lián)系

使用表名前綴

為避免混淆,

__________________若屬性名在各

SELECTStudent.*,SC*I翻獷,則

FROMStudent,SC

WHEREStudent.Sno=SC.Sno;

第45頁(yè)U等值連燧

2009-9-23

自然連接和廣義笛卡爾積連接

?自然連接

■等值連接的特例

■在等值連接的基礎(chǔ)上將目標(biāo)列中重復(fù)的屬性去掉

?廣義笛卡爾積連接y

■不帶連接條件的連接

■結(jié)果是兩表中元組的交叉乘積

第46頁(yè)

2009-9-23

例查詢每個(gè)學(xué)生及其選修課程的情況

SELECTStudent.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade

FROMStudent,SC

WHEREStudent.Sno=SC.Sno;

自然連接

SELECTStudent.*,SC.*

FROMStudent,SC;

廣義笛卡爾積連接

第47頁(yè)

2009-9-23

二、自身連接

叭個(gè)表與其自己進(jìn)行連接

例查詢每一門課的間接先修課

SELECTFIRST.Cno,SECOND.Cpno

FROMCourseFIRST,CourseSECOND

WHEREFIRST.Cpno=SECOND.Cno;

第48頁(yè)見(jiàn)P104表

2009-9-23

實(shí)例

例查詢與“劉晨”在同一個(gè)系學(xué)習(xí)的學(xué)生

SELECTSl.Sname

FROMStudentS1,StudentS2

WHERESl.Sdept=S2.SdeptANDS2.Sname='文U

晨';

第49頁(yè)

2009-9-23

三、外連接

?是連接運(yùn)算的擴(kuò)充

?除了滿足連接條件的元組正常輸出外,所有不滿

足連接條件的元組也進(jìn)行連接,并用空值NULL來(lái)

填充并輸出

?外連接符:*(或+),表示增加一個(gè)萬(wàn)能行

?外連接分類:右外連接、左外連接、全外連接

例查詢每個(gè)學(xué)生及其選修課程削網(wǎng)I.

SELECTStudent.Sno,Sname,Ssex,Sage,Sdept,Cno9Grade

FROMStudent,SC

WHEREStudent.Sno=SC.Sno(*);

第50頁(yè)7~//二

2009-9-23

實(shí)例

例查詢學(xué)校設(shè)置的所有課程及其選修情況

SELECTCno,Cname5Credit,Sno5Grade

FROMCourse,SC

WHERECourse.Cno=SC.Cno(*);

第51頁(yè)

2009-9-23

四、復(fù)合條件連接

?WHERE子句中有多個(gè)連接條件

例查詢選修了2號(hào)課程且成績(jī)?cè)?0分以上的學(xué)生學(xué)號(hào)和姓名

SELECTStudent.Sno,Sname

FROMStudent,SC

WHEREStudent.Sno=SC.Sno

ANDSC.Cno=2

ANDSC.Grade>90;

第52頁(yè)

2009-9-23

多表連接

?兩個(gè)以上的表的連接

例查詢每個(gè)學(xué)生的學(xué)號(hào)、姓名、選修的課程各及成績(jī)

SELECTStudent.Sno,Sname,Cname

FROMStudent,Course,SC

WHEREStudent.Sno=SC.Sno

ANDSC.Cno=Course.Cno;

第53頁(yè)//Z-——NX

2009-9-23

3.3.3嵌套查詢

?在SQL語(yǔ)言中,一個(gè)SELECT-FROM-WHERE語(yǔ)

Q句稱為一個(gè)杳詢塊。

?一個(gè)查詢塊嵌套在另一個(gè)查詢塊的WHERE子句或

HAVING短語(yǔ)的條件中的查詢。

SELECTSname

FROMStudent

WHERESnoIN其等效不嵌套的查詢語(yǔ)句?

(SELECTSno

FROMSC

WHERECno=2);

第54頁(yè)

2009-9-23

?允許多層嵌套,體現(xiàn)了SQL的結(jié)構(gòu)化特色

?術(shù)語(yǔ)

■父查詢&子查詢

■不相關(guān)子查詢:子查詢的查詢條件不依賴于父查詢

■相關(guān)子查詢:子查詢的查詢條件依賴于父查詢的某個(gè)屬性值

SELECTSnameSELECTSname

FROMStudentFROMStudent

WHERESnoINWHEREEXISTS

(SELECTSno(SELECT*FROMSC

FROMSCWHERESno=Student.Sno

WHERECno=2);ANDCno=T);

(相關(guān)子查詢)

(不相關(guān)子查詢)

2009-9-23

嵌套查詢

?不相關(guān)子杳詢的求解方法

■由里向外。子查詢只執(zhí)行一次,其結(jié)果用于父查詢。

?相關(guān)子查詢的求解方法

■內(nèi)層查詢與外層查詢反復(fù)求值。首先取外層查詢中表

的第一條元組,根據(jù)它與內(nèi)層查詢相關(guān)的屬性值處理

內(nèi)層查詢,如果where子句返[II值為真,則取此元組

放入結(jié)果表中;然后再取外層查詢中表的第二條元組;

重復(fù)這一過(guò)程,直至外層查詢中表的全部元組都被檢

查完為止。K\|7Z

★子查詢中通常不含ORDERBY子句和DISTINCT

短語(yǔ),因?yàn)樗鼈冎粚?duì)最終結(jié)果有意義。

第56頁(yè)

2009-9-23

一、帶有IN謂詞的子查詢

,嵌套杳詢中,子杳詢的結(jié)果往往是?個(gè)

集合,所以經(jīng)常使用謂詞IN

例查詢與“劉晨”在同一個(gè)系學(xué)習(xí)的學(xué)生

(1)SELECTSdeptSELECTSno,Sname,Sdept

FROMstudentFROMStudent

WHERESnamei劉晨,WHERESdeptIN

結(jié)果為

'IS,(SELECTSdept

(2)SELECTSno,Sname,Sdept

FROMStudent

FROMStudent

咧晨');

WHERESdept='IS';WHERESname=

第57頁(yè)(不相關(guān)子查詢)

2009-9-23

例查詢選修了課程名為“信息系統(tǒng)”的學(xué)例子

生學(xué)號(hào)和姓名

SELECTSno,Sname⑶

FROMStudent

■使用嵌套查詢實(shí)現(xiàn)

WHERESnoIN

(SELECTSno⑵

FROMSC

(不相關(guān)子查詢)WHERECnoIN

(SELECTCno(1)

FROMCourse

WHERECname-信息系統(tǒng)’));

■使用連接查詢實(shí)現(xiàn)

SELECTSno,Sname

多種實(shí)現(xiàn)方式,F(xiàn)ROMStudent,SC,Course

嵌套查詢具有結(jié)構(gòu)化WHEREStudent.Sno=SC.SnoAND

程序設(shè)計(jì)特點(diǎn)SC.Cno=Course.CnoAND

第58頁(yè)Course.Cname'信息系統(tǒng)';

2009-9-23

二、帶有比較運(yùn)算符的子查詢

?當(dāng)用戶能確切知道內(nèi)層查詢返回的是單值時(shí),

可以使用比較運(yùn)算符(>,<,>=,<二,!二等)

4V注意:子查詢一定要跟在比較運(yùn)算符之后

例查詢與“劉晨”在同一個(gè)系學(xué)習(xí)的陳

SELECTSno,Sname,Sdept

FROMStudent

WHERESdept=

(SELECTSdept/\

FROMStudent/、

WHERESname=,劉晨');

第59頁(yè)(不相關(guān)子查詢)

2009-9-23

▲、帶有ANY或ALL謂詞的子查詢

?與比較運(yùn)算符等)配合使用

■>ANY(ALL)大于子查詢結(jié)果中的某個(gè)(所有)值

■〈ANY(ALL)小于子查詢結(jié)果中的某個(gè)(所有)值

■>=ANY(ALL)大于等于子查詢結(jié)果中的某個(gè)(所有)值

■v=ANY(ALL)小于等于子查詢結(jié)果中的某個(gè)(所有)值

■=ANY(ALL)等于子查詢結(jié)果中的某個(gè)(所有)值

■!=ANY(ALL)不等于子查詢結(jié)果中的某個(gè)(任何)值

第60頁(yè)

2009-9-23

例1

例查詢其他系中比信息系某一學(xué)生年齡小的學(xué)

生姓名和年齡

也可以用集函數(shù)來(lái)實(shí)現(xiàn)

SELECTSname,SageSELECTSname,Sage

FROMStudentFROMStudent

WHERESage<ANYWHERESage<

(SELECTSage(SELECTMAX(Sage)

FROMStudentFROMStudent

WHERESdept='S)WHERESdept="S')

ANDSdept<>'IS';ANDSdepto"S';

第61頁(yè)

2009-9-23

例2

例查詢其他系中比信息系所有學(xué)生年齡都小的

學(xué)生姓名和年齡

也可以用集函數(shù)來(lái)實(shí)現(xiàn)

SELECTSname,SageSELECTSname,Sage

FROMStudentFROMStudent

WHERESage<ALLWHERESage<

(SELECTSage(SELECTMIN(Sage)

FROMStudentFROMStudent

WHERESdept='IS')WHERESdept="S')

ANDSd印tv>'IS';ANDSdeptv>"S’;

第62頁(yè)

2009-9-23

轉(zhuǎn)換關(guān)系

,事實(shí)上,用集函數(shù)實(shí)現(xiàn)子查詢通常比直接

用ANY或ALL查詢效率要高

?ANY、ALL與集函數(shù)及IN的等價(jià)轉(zhuǎn)換關(guān)系

!=<<=>>=

ANYIN<MAX<=MAX>MIN>=MIN

ALLNOTIN<MIN<=MIN>MAX>=MAX

第63頁(yè)

2009-9-23

四、帶有EXISTS謂詞的子查詢

?不需要返回具體數(shù)據(jù),而只關(guān)心是否有返回

值,即返回邏輯真或假

例查詢所有選修了一號(hào)課程的學(xué)生姓名

SELECTSname

SELECTSnameFROMStudent,SC

FROMStudentWHERESC.Sno=Student.Sno

WHEREEXISTSANDCno="');

(SELECT*FROMSC

WHERESno=Stiident.Sno(可以用連接查詢來(lái)實(shí)現(xiàn))

ANDCno='1');

第64頁(yè)(相關(guān)子查詢)

2009-9-23

例子

例查詢沒(méi)有選修一號(hào)課程的學(xué)生姓名

SELECTSname

SELECTSnameFROMStudent,SC

FROMStudentWHERESC.Sno=Student.Sno

WHERENOTEXISTSANDCno!="');

(SELECT*/,f7

FROMSC(無(wú)理用簡(jiǎn)單的連

WHERESno=Student.Sno接查詢來(lái)實(shí)現(xiàn))

_________ANDCno=l);\/\

(相關(guān)子查詢)\ZK/

第65頁(yè)/Z-——NX

2009-9-23

替換關(guān)系

?一些帶EXISTS或NOTEXISTS謂詞的子查詢不能

被其他形式的子查詢替換,但所有帶IN謂詞、比

較運(yùn)算符、ANY和ALL謂詞的子查詢都能用

EXISTS謂詞等價(jià)替換

例查詢與“劉晨”在同一個(gè)系學(xué)習(xí)的學(xué)生.

SELECTSnoSname,Sdept

SELECTSnoSnameSdept?

55FROMStudent

FROMStudent

WHEREEXISTS

WHERESdeptIN

(SELECT*

(SELECTSdept

FROMStudent

FROMStudent

見(jiàn)WHERES2.Sdept=SI.Sdept

WHERESname=,劉晨');

-----ANDS2.Sname=

第66頁(yè)'(不相關(guān)子查詢)

2009-9-23(相關(guān)子查詢)

全稱量詞

?SQL語(yǔ)言中沒(méi)有全稱量詞用(forall),但可使用存在量詞

進(jìn)行轉(zhuǎn)換后實(shí)現(xiàn):(Vx)P三-i(3x(^P))

X表示課程,

例、查詢選修了全部課程的學(xué)生姓名P表示謂詞“選

(可理解為:查詢沒(méi)有一門課程不選修的學(xué)生

SELECTSname

FROMStudent

WHERENOTEXISTS

(SELECT*FROMCourse

WHERENOTEXISTS

(SELECT*FROMSC

WHERESno=Student.Sno

ANDCno=Course.Cno));

第67頁(yè)

(相關(guān)子查詢)

2009-9-23

邏輯蘊(yùn)函

?SQL語(yǔ)言中的邏輯運(yùn)算包括非(NOT)、與(AND)、或(OR)

?而常用的邏輯運(yùn)算還包括異或、等價(jià)、蘊(yùn)涵等,SQL語(yǔ)言

中沒(méi)有邏輯蘊(yùn)函(Implication)運(yùn)算,但可利用謂詞演算轉(zhuǎn)換

J一個(gè)邏輯蘊(yùn)函:____________________

PfQ三TPyQ

■在蘊(yùn)涵運(yùn)算P->Q中,只有當(dāng)前提為True并且結(jié)果為

False的情況下邏輯蘊(yùn)涵的結(jié)果為False,其余的情況下

邏輯蘊(yùn)涵的結(jié)果均為True。邏輯蘊(yùn)涵運(yùn)算的條件和結(jié)果:

結(jié)果|

PQ

True[

TrueTrue

TrueFalseFalse

True[

FalseTrue-

FalseFalseTrue

2009-9-23

例子

查詢至少選修了學(xué)生95002號(hào)選修的全部課程的學(xué)生學(xué)號(hào)

該查詢的邏輯蘊(yùn)涵:查詢學(xué)號(hào)為x的學(xué)生,對(duì)所有的課程

7、只要學(xué)生95Q02號(hào)選修了v,則學(xué)生x也選修了V。

該謂詞用該查詢有如下等價(jià)形式:該謂詞

用q表示

(X/y)夕->q

一1(夕一夕))

~'(3^(—1(—vq)))

~^y(pAF)

其語(yǔ)義為:不存在這樣的課程y,學(xué)生95002號(hào)選修了,

而學(xué)生x沒(méi)選

第69頁(yè)

2009-9-23

例查詢至少選修了學(xué)生95002號(hào)選修的全部課

程的學(xué)生學(xué)號(hào)

根據(jù)上述謂詞演算表達(dá)式“不存在這樣的課程y,學(xué)生

95002號(hào)選修了,而學(xué)生x沒(méi)選",易得如下SQL語(yǔ)句:

SELECTDISTINCTSno

FROMSCSCX

WHERENOTEXISTS

(SELECT*FROMSC

WHERESCY.Sno='95002,

ANDNOTEXISTS

(SELECT*FROMSCSCZ"

WHERESCZ.Sno=SCX.Sno-

ANDSCZ.Cno=.Cno));

(相關(guān)子查詢)

第70頁(yè)—002選修的課」一X—

2009-9-23

3.3.4集合查詢

?SELECT語(yǔ)句的查詢結(jié)果是元組的集合,所以多

個(gè)SELECT語(yǔ)句的查詢結(jié)果可進(jìn)行集合操作

?集合操作運(yùn)算符

■并UNION,交INTERSECT,^MINUS(EXCEPf)

例查詢計(jì)算機(jī)科學(xué)系的學(xué)生及年齡不大于19歲的學(xué)生

SELECT*FROMStudent

WHERESdept='CS'

UNION

SELECT*FROMStudent

WHERESagev=19;

第71頁(yè)

2009-9-23

例子

?/查詢有貸款帳戶或有存款帳戶的客戶:

(selectcustomer-namefromdepositor)

union

(selectcustomer-namefromborrower);

?查詢同時(shí)有貸款帳戶和存款帳戶的客弋.

(selectcustomer-namefromdepositor)

intersect

(selectcustomer-namefromborrower);

?查詢有存款帳戶但沒(méi)有貸款帳戶的客戶,<?

(selectcustomer-namefromdepositor)

except

(selectcustomer-namefromborrower);

第72頁(yè)//

2009-9-23

說(shuō)明

?UNION將多個(gè)查詢結(jié)果合并,并自動(dòng)去掉重復(fù)元

組。但系統(tǒng)要求參加UNION操作的各結(jié)果表的列

數(shù)和對(duì)應(yīng)數(shù)據(jù)類型必須相同

?標(biāo)準(zhǔn)SQL中沒(méi)有直接提供INTERSECT和

EXCEPT操作,但可以用其他

溫馨提示

  • 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)論