《數(shù)據(jù)庫系統(tǒng)概論》實(shí)習(xí)指導(dǎo)書_第1頁
《數(shù)據(jù)庫系統(tǒng)概論》實(shí)習(xí)指導(dǎo)書_第2頁
《數(shù)據(jù)庫系統(tǒng)概論》實(shí)習(xí)指導(dǎo)書_第3頁
《數(shù)據(jù)庫系統(tǒng)概論》實(shí)習(xí)指導(dǎo)書_第4頁
《數(shù)據(jù)庫系統(tǒng)概論》實(shí)習(xí)指導(dǎo)書_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

PAGEPAGE23 中國地質(zhì)大學(xué)計(jì)算機(jī)學(xué)院《數(shù)據(jù)庫系統(tǒng)概論》實(shí)習(xí)指導(dǎo)書《數(shù)據(jù)庫系統(tǒng)概論》實(shí)習(xí)一、實(shí)習(xí)目的與任務(wù)通過實(shí)習(xí)教學(xué),使學(xué)生進(jìn)一步加深理解數(shù)據(jù)庫系統(tǒng)的基本理論,學(xué)會(huì)數(shù)據(jù)庫設(shè)計(jì)方法、DBMS的使用,數(shù)據(jù)庫系統(tǒng)的管理和維護(hù),熟悉數(shù)據(jù)庫技術(shù)的應(yīng)用。二、實(shí)習(xí)室要求裝有WIN2000及SQLSERVER2000的計(jì)算機(jī)。三、主要教材及參考書教材:《數(shù)據(jù)庫系統(tǒng)概論》(第四版)王珊,薩師煊高等教育出版社參考書目:《SQLServer圖解教程》北京希望電子出版社;《SQLServer2000簡明教程》,清華大學(xué)出版社。四、考核形式1、平時(shí)實(shí)習(xí)完成情況(實(shí)習(xí)報(bào)告質(zhì)量)20%2、每人獨(dú)立開發(fā)一套數(shù)據(jù)庫應(yīng)用系統(tǒng)80%五、實(shí)習(xí)項(xiàng)目與要求序號(hào)實(shí)習(xí)項(xiàng)目名稱時(shí)數(shù)目的及要求實(shí)習(xí)類型1SQLServer2000基本操作4了解SQLServer2000安裝過程,掌握軟件的組成,啟動(dòng),運(yùn)行。在圖形界面下建立數(shù)據(jù)庫及基本數(shù)據(jù)表,及其表的定義、刪除與修改操作。認(rèn)識(shí)2SQL語言綜合實(shí)習(xí)4掌握使用SQL語言創(chuàng)建刪除數(shù)據(jù)庫,建立基本數(shù)據(jù)表,建立索引,更新數(shù)據(jù);掌握SQL的數(shù)據(jù)各種查詢;掌握連接、嵌套和集合查詢綜合3數(shù)據(jù)庫應(yīng)用系統(tǒng)4提高學(xué)生數(shù)據(jù)庫系統(tǒng)的綜合設(shè)計(jì)和開發(fā)應(yīng)用能力,解決實(shí)際問題設(shè)計(jì)實(shí)習(xí)一實(shí)習(xí)名稱:SQLServer2000基本操作實(shí)習(xí)主要內(nèi)容及方法:數(shù)據(jù)表的定義、刪除及修改實(shí)習(xí)要求:了解并掌握SQL企業(yè)管理器的使用;掌握在圖形界面方式下的數(shù)據(jù)創(chuàng)建,基本表的定義、刪除與修改。掌握SQLServer的基本功能和使用。實(shí)習(xí)目的:了解SQLServer2000安裝過程,掌握軟件的組成,啟動(dòng),運(yùn)行。在圖形界面下建立數(shù)據(jù)庫及基本數(shù)據(jù)表,及其表的定義、刪除與修改操作。為后繼學(xué)習(xí)作準(zhǔn)備。實(shí)習(xí)設(shè)備:裝有SQLSERVER2000的電腦實(shí)習(xí)步驟:(1)啟動(dòng)SQLServer企業(yè)管理器;(2)新建數(shù)據(jù)庫StudyDB;新建數(shù)據(jù)表,修改,刪除;數(shù)據(jù)錄入:建議的數(shù)據(jù)表樣式表3.3關(guān)系StudentsSno表3.3關(guān)系StudentsSnoSnameSsexSageSdeptS01S02S03S04S05S06王建平劉華范林軍李偉黃河長江男女女男男男211918191820自動(dòng)化自動(dòng)化計(jì)算機(jī)數(shù)學(xué)數(shù)學(xué)數(shù)學(xué)表3.4關(guān)系CoursesCnoCnamePre_CnoCreditsC01C02C03C04C05C06C07英語數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)庫DB_設(shè)計(jì)C++網(wǎng)絡(luò)原理操作系統(tǒng)C05C02C03C07C054223333表3.5關(guān)系ReportsSnoCnoGradeS01S01S02S02S02S03S03S04C01C03C01C02C03C01C02C039284909482729075操作參考資料:SQLServer2000看圖教程(PDF)中SQL01,03SQLServer2000簡明教程_03,04實(shí)習(xí)二實(shí)習(xí)名稱:SQL綜合應(yīng)用實(shí)習(xí)主要內(nèi)容及方法:SQL語言的綜合應(yīng)用首先驗(yàn)證性試驗(yàn)教材中所有SQL語句的實(shí)例,然后選擇性試驗(yàn)本指導(dǎo)書中的示例。實(shí)習(xí)要求:了解并掌握SQL查詢分析器及企業(yè)管理器的使用。掌握用SQL語言對基本表的定義、刪除與修改。教材82頁數(shù)據(jù)表的定義。掌握sql數(shù)據(jù)插入、修改和刪除語句的一般格式及使用方法。教材82頁數(shù)據(jù)表數(shù)據(jù)的插入。掌握建立索引的二種方法,即在基本表創(chuàng)建過程中建立和用命令方式建立。掌握SQL查詢語句的一般格式;掌握無條件、有條件查詢及查詢結(jié)果排序與分組。掌握連接、嵌套和集合查詢語句的一般格式及使用方法。掌握sql視圖建立、修改和刪除。邊實(shí)習(xí)邊寫實(shí)習(xí)報(bào)告,將實(shí)習(xí)過程和實(shí)習(xí)中采用的語句,運(yùn)行結(jié)果,出現(xiàn)的問題及解決辦法都寫到實(shí)習(xí)報(bào)告中。實(shí)習(xí)目的:熟練掌握SQL語句的使用方法,為后繼學(xué)習(xí)作準(zhǔn)備。實(shí)習(xí)設(shè)備:裝有SQLSERVER2000的電腦實(shí)習(xí)步驟:啟動(dòng)SQL查詢分析器;編寫SQL語句完成實(shí)習(xí)要求的各項(xiàng)內(nèi)容;編寫實(shí)習(xí)報(bào)告。建議的基本表樣式表3.3關(guān)系StudentsSno表3.3關(guān)系StudentsSnoSnameSsexSageSdeptS01S02S03S04S05S06王建平劉華范林軍李偉黃河長江男女女男男男211918191820自動(dòng)化自動(dòng)化計(jì)算機(jī)數(shù)學(xué)數(shù)學(xué)數(shù)學(xué)表3.4關(guān)系CoursesCnoCnamePre_CnoCreditsC01C02C03C04C05C06C07英語數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)庫DB_設(shè)計(jì)C++網(wǎng)絡(luò)原理操作系統(tǒng)C05C02C03C07C054223333表3.5關(guān)系ReportsSnoCnoGradeS01S01S02S02S02S03S03S04C01C03C01C02C03C01C02C039284909482729075用SQL語言對基本表的定義、刪除與修改。1定義基本表例3.1建立表3.3所示的學(xué)生表Students,每個(gè)屬性名的意義為Sno-學(xué)號(hào)、Sname-姓名、Ssex-性別、Sage-年齡、Sdept-所在系。這里要求Sno和Sname不能為空值,且取值唯一。CREATETABLEStudents/*列級(jí)完整性約束條件*/(SnoCHAR(5)NOTNULL,/*Sno不能為空值*/SnameCHAR(20)NOTNULL,/*Sname不能為空值*/SsexCHAR(2),SageINT,SdeptCHAR(15),CONSTRAINTun_SnoUNIQUE(Sno),/*Sno取值唯一的約束*/CONSTRAINTun_SnameUNIQUE(Sname));/*Sname取值唯一的約束*/說明:在MicrosoftSQLServer2000的查詢分析器(QueryAnalyzer)中使用單條SQL語句,其末尾不需要分號(hào)“;”作為命令結(jié)尾標(biāo)記。通常,SQLServer2000對大多數(shù)末尾帶有分號(hào)的SQL命令都能順利執(zhí)行,但對少數(shù)的SQL命令,末尾若帶分號(hào),則SQLServer2000會(huì)給出錯(cuò)誤信息提示。比如,若在例3.59的SQL命令末尾加上一個(gè)分號(hào)“;”,SQLServer2000就會(huì)出現(xiàn)“Incorrectsyntaxnear';'”的提示,雖然SQLServer2000實(shí)際上已經(jīng)執(zhí)行了該命令。例3.1-1建立表3.4所示的課程表Courses,其屬性名意義分別為Cno-課程號(hào),Cname-課程名,Pre_Cno-先修課程號(hào),Credits-學(xué)分。CREATETABLECourses(CnoCHAR(5)NOTNULL,/*Cno不能為空值*/CnameCHAR(20)NOTNULL,/*Cname不能為空值*/Pre_CnoCHAR(5),CreditsINT,CONSTRAINTun_CnoUNIQUE(Cno));/*Cno取值唯一的約束*/例3.1-2建立表3.5所示的成績表Reports。其中的屬性名意義分別為Sno-學(xué)號(hào),Cno-課程號(hào)和Grade-考試成績。CREATETABLEReports(SnoCHAR(5)NOTNULL,/*Sno不能為空值*/CnoCHAR(5)NOTNULL,/*Cno不能為空值*/GradeINT,CONSTRAINTSno_CnoUNIQUE(Sno,Cno));/*Sno+Cno取值唯一的約束*/2修改基本表例3.2向基本表Students中增加“入學(xué)時(shí)間”屬性列,其屬性名為Sentrancedate,數(shù)據(jù)類型為DATETIME型。ALTERTABLEStudentsADDSentrancedateDATETIME;

例3.3將Sage(年齡)的數(shù)據(jù)類型改為SMALLINT型。ALTERTABLEStudentsALTERCOLUMNSageSMALLINT;例3.4刪除Sname(姓名)必須取唯一值的約束。ALTERTABLEStudentsDROPCONSTRAINTun_Sname;注意:SQLServer2000增加了刪除屬性的命令。比如,刪除屬性列Sentrancedate的命令為:ALTERTABLEStudentsDROPCOLUMNSentrancedate;說明:=1\*GB2⑴為了保證后面例子能夠順利運(yùn)行,請大家一定將屬性列Sentrancedate從Students表中刪除。=2\*GB2⑵為了調(diào)試SQL語句方便,這里沒有在表Reports中增加參照完整性約束,甚至沒有定義主鍵。等本章學(xué)完后,第7章的實(shí)習(xí)系統(tǒng)就是把這些約束全部加上了。3刪除基本表例3.5刪除Students表。DROPTABLEStudents;說明:此表刪除后,請立即用例3.1將其建立起來,以便后面的例子使用。4向表中添加元組例3.6將一個(gè)學(xué)生元組(S01,王建平,男,21,計(jì)算機(jī))添加到基本表Students中。INSERTINTOStudentsVALUES('S01','王建平','男',21,'自動(dòng)化');說明:=1\*GB2⑴請讀者用這個(gè)命令將其余5個(gè)學(xué)生的元組也添加到基本表Students中。=2\*GB2⑵向Courses表插入元組(‘C01’,’英語’,’’,4)的命令為:INSERTINTOCoursesVALUES('C01','英語','',4);請大家將其余6門課程的信息插入Courses表中。例3.7將學(xué)習(xí)成績的元組(‘S01’,’C01’)添加到基本表Reports中。INSERTINTOReports(Sno,Cno)VALUES(‘S01’,’C01’);說明:請大家用這個(gè)命令將其余7個(gè)選課元組也添加到基本表Reports中.建立索引1建立索引例3.8為學(xué)生選課數(shù)據(jù)庫中的Students,Courses,Reports三個(gè)表建立索引。其中Students表按Sno(學(xué)號(hào))升序建唯一索引,Courses表按Cno(課程號(hào))升序建唯一索引,Reports表按Sno(學(xué)號(hào))升序和Cno(課程號(hào))號(hào)降序建唯一索引。其語句為:CREATEUNIQUEINDEXStu_SnoONStudents(Sno);CREATEUNIQUEINDEXCou_CnoONCourses(Cno);CREATEUNIQUEINDEXRep_ScnoONReports(SnoASC,CnoDESC);例3.9在基本表Students的Sname(姓名)和Sno(學(xué)號(hào))列上建立一個(gè)聚簇索引,而且Students中的物理記錄將按照Sname值和Sno值的升序存放。其語句為:CREATECLUSTEREDINDEXStu_Sname_SnoONStudents(Sname,Sno);2刪除索引例3.10刪除基本表Reports上的Rep_SCno索引。DROPINDEXReports.Rep_Scno;SQL查詢1無條件查詢例3.11查詢?nèi)w學(xué)生的詳細(xì)記錄。這是一個(gè)無條件的選擇查詢,其命令為:SELECT*/*這里的“*”等價(jià)于ALL*/FROMStudents;其結(jié)果為表3.3中的全部數(shù)據(jù)。例3.12查詢?nèi)w學(xué)生的姓名(Sname)、學(xué)號(hào)(Sno)、所在系(Sdept)。這是一個(gè)無條件的投影查詢,其命令為:SELECTSname,Sno,SdeptFROMStudents;例3.13查詢?nèi)w學(xué)生的姓名(Sname)、出生年份及學(xué)號(hào)(Sno)。由于SELECT子句的<目標(biāo)列表達(dá)式>不僅可以是表中的屬性列,也可以是表達(dá)式,故可以查詢經(jīng)過計(jì)算的值。其命令為:SELECTSno,Sname,2001-SageFROMStudents;例3.14查詢?nèi)w學(xué)生的姓名、出生年份和學(xué)號(hào),要求用小寫字母表示學(xué)號(hào)中的字母。其命令為:SELECTSname,’Birth:’Title,1996-SageBirthYear,LOWER(Sno)LsnoFROMStudents;例3.15查詢選修了課程的學(xué)生學(xué)號(hào)。其命令為:SELECTDISTINCTSnoFROMReports;2條件查詢例3.16查詢數(shù)學(xué)系全體學(xué)生的學(xué)號(hào)(Sno)和姓名(Sname)。其命令為:SELECTSno,SnameFROMStudentsWHERESdept='數(shù)學(xué)';例3.17查詢所有年齡在18~22歲(包括18歲和22歲)之間的學(xué)生姓名(Sname)及年齡(Sage)。其命令為:SELECTSname,SageFROMStudentsWHERESage=18ANDSage<=22;例3.18查詢年齡在18~22歲(包括18歲和22歲)之間的學(xué)生姓名(Sname)及年齡(Sage)。其命令為:SELECTSname,SageFROMStudentsWHERESageBETWEEN18AND22;例3.19查詢年齡不在18-22歲之間的學(xué)生姓名(Sname)及年齡(Sage)。其命令為:SELECTSname,SageFROMStudentsWHERESageNOTBETWEEN18AND22;例3.20查詢自動(dòng)化系、數(shù)學(xué)和計(jì)算機(jī)系學(xué)生的學(xué)號(hào)(Sno)、姓名(Sname)和性別(Ssex)。其命令為:SELECTSno,Sname,Ssex

FROMStudentsWHERESdeptIN('自動(dòng)化','數(shù)學(xué)','計(jì)算機(jī)');等價(jià)于:SELECTSname,SsexFROMStudentsWHERESdept='自動(dòng)化'ORSdept='數(shù)學(xué)'ORSdept='計(jì)算機(jī)';例3.21查詢既不是信息系、數(shù)學(xué)系、也不是計(jì)算機(jī)系的學(xué)生的姓名(Sname)和性別(Ssex)。其命令為:SELECTSname,SsexFROMStudentsWHERESdeptNOTIN('自動(dòng)化','數(shù)學(xué)','計(jì)算機(jī)');例3.22查詢所有姓劉的學(xué)生的姓名(Sname)、學(xué)號(hào)(Sno)和性別(Ssex)。其命令為:SELECTSname,Sno,SsexFROMStudentsWHERESnameLIKE'劉%';例3.23查詢姓“劉”且全名為4個(gè)漢字的學(xué)生的姓名(Sname)和所在系(Sdept)。其命令為:SELECTSname,Sdept

FROMStudents

WHERESnameLIKE'劉____';

例3.24查詢所有不姓劉的學(xué)生姓名(Sname)和年齡(Sage)。SELECTSname,SageFROMStudentsWHERESnameNOTLIKE'劉%';例3.25查詢課程名為“DB_設(shè)計(jì)”的課程號(hào)(Cno)和學(xué)分(Credits)。其命令為:SELECTCno,CreditsFROMCoursesWHERECnameLIKE'DB\_設(shè)計(jì)'ESCAPE'\';例3.26查詢以"DB_"開頭,且倒數(shù)第2個(gè)漢字字符為“設(shè)”的課程的詳細(xì)情況。其命令為:SELECT*FROMCoursesWHERECnameLIKE'DB\_%設(shè)__'ESCAPE'\';例3.27假設(shè)某些學(xué)生選修課程后沒有參加考試,所以有選課記錄,但沒有考試成績。試查詢?nèi)鄙俪煽兊膶W(xué)生的學(xué)號(hào)(Sno)和相應(yīng)的課程號(hào)(Cno)。其命令為:SELECTSno,CnoFROMReportsWHEREGradeISNULL;例3.28查詢所有有成績的學(xué)生學(xué)號(hào)(Sno)和課程號(hào)(Cno)。其命令為:SELECTSno,Cno

FROMReports

WHEREGradeISNOTNULL;3查詢結(jié)果排序例3.29查詢選修了C03號(hào)課程的學(xué)生的學(xué)號(hào)(Sno)和成績(Grade),并按成績降序排列。其命令為:SELECTSno,GradeFROMReportsWHERECno='C03'ORDERBYGradeDESC;例3.30查詢?nèi)w學(xué)生情況,查詢結(jié)果按所在系的系名(Sdpet)升序排列,同一系中的學(xué)生按年齡(Sage)降序排列。其命令為:SELECT*FROMStudentsORDERBYSdept,SageDESC;4集函數(shù)的使用例3.31查詢學(xué)生總?cè)藬?shù)。其命令為:SELECTCOUNT(*)FROMStudents;例3.32查詢選修了課程的學(xué)生人數(shù)。其命令為:SELECTCOUNT(DISTINCTSno)FROMReports;例3.33計(jì)算選修C01號(hào)課程的學(xué)生平均成績。其命令為:SELECTAVG(Grade)FROMReportsWHERECno='C01';例3.34查詢選修C01號(hào)課程的學(xué)生最高分?jǐn)?shù)。其命令為:SELECTMAX(Grade)FROMReportsWHERECno='C01';5查詢結(jié)果分組例3.35求各個(gè)課程號(hào)(Cno)及相應(yīng)的選課人數(shù)。其命令為:SELECTCno,COUNT(Sno)CntSnoFROMReportsGROUPBYCno;例3.36查詢選修了3門或3門以上課程的學(xué)生學(xué)號(hào)(Sno)。其命令為:SELECTSnoFROMReportsGROUPBYSnoHAVINGCOUNT(Cno)>連接、嵌套和集合查詢一、連接查詢1不同表之間的連接查詢例3.37查詢每個(gè)學(xué)生及其選修課程的情況。本查詢實(shí)際上是涉及Students與Reports兩個(gè)表的連接操作。這兩個(gè)表之間的聯(lián)系是通過公共屬性Sno實(shí)現(xiàn)的,因此,其操作命令為:SELECTStudents.*,Reports.*FROMStudents,ReportsWHEREStudents.Sno=Reports.Sno;說明:若在以上等值連接中把目標(biāo)列中重復(fù)的屬性列去掉則為自然連接XE"自然連接",其命令為SELECTStudents.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFROMStudents,ReportsWHEREStudents.Sno=Reports.Sno;例3.38查詢每個(gè)學(xué)生的學(xué)號(hào)(Sno)、姓名(Sname)、選修的課程名(Cname)及成績(Grade)。本查詢涉及到三個(gè)表的連接操作,完成該查詢的SQL語句如下:SELECTStudents.Sno,Sname,Cname,GradeFROMStudents,Reports,CoursesWHEREStudents.Sno=Reports.SnoANDReports.Cno=Courses.Cno;2自身連接例3.39查`詢每一門課的間接先修課(即先修課的先修課)。在Courses表關(guān)系中,只有每門課的直接先修課信息,而沒有先修課的先修課。要得到這個(gè)信息,必須先對一門課找到其先修課,再按此先修課的課程號(hào),查找它的先修課程。這就需要要將Courses表與其自身連接。為方便連接運(yùn)算,這里為Courses表取兩個(gè)別名分別為A,B。則完成該查詢的SQL語句為:SELECTA.Cno,A.Cname,B.Pre_CnoFROMCoursesA,CoursesBWHEREA.Pre_Cno=B.Cno;3外連接例3.40把例3.37中的等值連接改為左連接。該左連接操作在SQLServer2000中的命令格式為:SELECTStudents.Sno,Sname,Ssex,Sdept,Cno,GradeFROMStudentsLEFTJOINReportsONStudents.Sno=Reports.Sno;說明:以上左連接操作也可以用如下的右連接操作代替,其結(jié)果完全一樣。SELECTStudents.Sno,Sname,Ssex,Sdept,Cno,GradeFROMReportsRIGHTJOINStudentsONReports.Sno=Students.Sno;二、嵌套查詢1帶謂詞IN的嵌套查詢例3.41查詢選修了編號(hào)為“C02”的課程的學(xué)生姓名(Sname)和所在系(Sdept)。SELECTSname,SdeptFROMStudentsWHERESnoIN(SELECTSnoFROMReportsWHERECno='C02');例3.42查詢與“李偉”在同一個(gè)系學(xué)習(xí)的學(xué)生學(xué)號(hào)(Sno)、姓名(Sname)和系名(Sdept)。該查詢可構(gòu)造嵌套查詢實(shí)現(xiàn),其SQL語句如下:SELECTSno,Sname,SdeptFROMStudentsWHERESdeptIN(SELECTSdeptFROMStudentsWHERESname=’李偉’);說明:本例中的查詢也可以用自身連接來完成,其SQL語句如下:SELECTA.Sno,A.Sname,A.SdeptFROMStudentsA,StudentsBWHEREA.Sdept=B.SdeptANDB.Sname=’李偉’;例3.43查詢選修了課程名為“數(shù)據(jù)結(jié)構(gòu)”的學(xué)生學(xué)號(hào)(Sno)和姓名(Sname)。本查詢涉及學(xué)號(hào)、姓名和課程名(Cname)三個(gè)屬性。學(xué)號(hào)和姓名存放在Students表中,課程名的存放在Courses表中,但Students與Courses兩個(gè)表之間沒有公共屬性,必須通過Reports表建立它們之間的聯(lián)系。所以本查詢實(shí)際上涉及三個(gè)關(guān)系的連接操作。SELECTSno,Sname/*③最后在Studenst關(guān)系中*/FROMStudents/*取出Sno和Sname*/WHERESnoIN(SELECTSno/*②然后在SC關(guān)系中找出*/FROMReports/*選修了3號(hào)課程的學(xué)生學(xué)號(hào)*/WHERECnoIN(SELECTCno/*①首先在Courses關(guān)系中*/FROMCourses/*找出“數(shù)據(jù)結(jié)構(gòu)”的課程號(hào),*/WHERECname=‘?dāng)?shù)據(jù)結(jié)構(gòu)’));/*結(jié)果為C02號(hào)*/說明:本查詢同樣可以用連接查詢實(shí)現(xiàn):SELECTS.Sno,SnameFROMStudentsS,ReportsR,CoursesCWHERES.Sno=R.SnoANDR.Cno=C.CnoANDC.Cname='數(shù)據(jù)結(jié)構(gòu)';2帶有比較運(yùn)算符的嵌套查詢例3.44將例3.42改為帶有比較運(yùn)算符的嵌套查詢。由于一個(gè)學(xué)生只可能在一個(gè)系學(xué)習(xí),因此子查詢的結(jié)果是一個(gè)值,因此可以用=代替IN,其SQL語句如下:SELECTSno,Sname,SdeptFROMStudentsWHERESdept=(SELECTSdeptFROMStudentsWHERESname=’李偉’);3帶謂詞ANY或ALL的嵌套查詢例3.45查詢非自動(dòng)化系的不超過自動(dòng)化系所有學(xué)生的年齡的學(xué)生姓名(Sname)和年齡(Sage)。其查詢命令為SELECTSname,SageFROMStudentsWHERESdept<>'自動(dòng)化'ANDSage<=ALL(SELECTSageFROMStudentsWHERESdept='自動(dòng)化');說明:本查詢也可以用集函數(shù)來實(shí)現(xiàn)。其SQL語句如下:SELECTSname,SageFROMStudentsWHERESdept<>'自動(dòng)化'ANDSage<=(SELECTMIN(Sage)FROMStudentsWHERESdept='自動(dòng)化');4帶謂詞EXISTS的嵌套查詢例3.46查詢所有選修了編號(hào)為“C01”課程的學(xué)生姓名(Sname)和所在系(Sdept)。本查詢的SQL語句是:SELECTSname,SdeptFROMStudentsWHEREEXISTS(SELECT*FROMReportsWHERESno=Students.SnoANDCno='C01');例3.47將例3.42改為帶謂詞EXISTS的查詢,其SQL語句如下SELECTSno,Sname,SdeptFROMStudentsAWHEREEXISTS(SELECT*FROMStudentsBWHEREB.Sdept=A.SdeptANDB.Sname=’李偉’);例3.48查詢選修了所有課程的學(xué)生姓名(Sname)和所在系。由于沒有全稱量詞,可將題目的意思轉(zhuǎn)換成等價(jià)的用存在量詞的形式:查詢這樣的學(xué)生,沒有一門課程是他不選修的。其SQL語句為:SELECTSname,SdeptFROMStudentsWHERENOTEXISTS(SELECT*FROMCoursesWHERENOTEXISTS(SELECT*FROMReportsWHERESno=Students.SnoANDCno=Courses.Cno));三、集合查詢例3.49查詢計(jì)算機(jī)科學(xué)系的學(xué)生或年齡不大于20歲的學(xué)生信息。SELECT*FROMStudentsWHERESdept='計(jì)算機(jī)'UNIONSELECT*FROMStudentsWHERESage<=20;例3.50查詢數(shù)學(xué)系的學(xué)生且年齡不大于20歲的學(xué)生的交集,這實(shí)際上就是查詢數(shù)學(xué)系中年齡不大于20歲的學(xué)生。SELECT*FROMStudentsWHERESdept='數(shù)學(xué)'ANDSage<=20;例3.51查詢數(shù)學(xué)系的學(xué)生與年齡不大于20歲的學(xué)生的差集。本查詢的等價(jià)說法是,查詢數(shù)學(xué)系中年齡大于20歲的學(xué)生。SELECT*FROMStudentsWHERESdept='計(jì)算機(jī)'ANDSage>20;SQL的數(shù)據(jù)更新1插入數(shù)據(jù)例3.52設(shè)數(shù)據(jù)庫中已有一個(gè)關(guān)系History_Student,其關(guān)系模式與Students完全一樣,試將關(guān)系Students中的所有元組插入到關(guān)系History_Student中去,其SQL命令為:INSERTINTOHistory_StudentSELECT*FROMStudents;2修改數(shù)據(jù)例3.53將學(xué)號(hào)為“S03”的學(xué)生年齡改為22歲,即要修改滿足條件的一個(gè)元組的屬性值。UPDATEStudentsSETSage=22WHERESno=’S03’;例3.54將所有學(xué)生的年齡增加1歲。即要修改多個(gè)元組的值。UPDATEStudentsSETSage=1+Sage;例3.55將數(shù)學(xué)系所有學(xué)生的成績置零。由于學(xué)生所在系的信息在Students表中,而學(xué)習(xí)成績在Reports表中,因此,可以將SELECT子查詢作為WHERE子句的條件表達(dá)式。故該更新要求的SQL命令為:UPDATEReportsSETGrade=0WHERE‘?dāng)?shù)學(xué)’=(SELECTSdeptFROMStudentsWHEREStudents.Sno=Reports.Sno);3刪除數(shù)據(jù)例3.56刪除學(xué)號(hào)為“S04”的學(xué)生選修的課號(hào)為“C02”的記錄。DELETEFROMReportsWHERESno=’S04’ANDCno=’C02’;例3.57刪除所有學(xué)生的選課記錄。DELETEFROMReports;這條DELETE語句將刪除Reports的所有元組,使Reports成為空表。例3.58刪除數(shù)學(xué)系所有學(xué)生的選課記錄。DELETEFROMReportsWHERE‘?dāng)?shù)學(xué)’=(SELECTSdeptFROMStudentsWHEREStudents.Sno=Reports.Sno);SQL視圖一定義視圖1建立視圖例3.59建立數(shù)學(xué)系學(xué)生的視圖,并要求進(jìn)行修改和插入操作時(shí)仍需保證該視圖只有數(shù)學(xué)系的學(xué)生,視圖的屬性名為Sno,Sname,Sage,Sdept。CREATEVIEWC_StudentASSELECTSno,Sname,Sage,SdeptFROMStudentsWHERESdept=’數(shù)學(xué)’WITHCHECKOPTION例3.60建立學(xué)生的學(xué)號(hào)(Sno)、姓名(Sname)、選修課程名(Cname)及成績(Grade)的視圖。本視圖由三個(gè)基本表的連接操作導(dǎo)出,其SQL語句如下:CREATEVIEWStudent_CRASSELECTStudents.Sno,Sname,Cname,GradeFROMStudents,Reports,CoursesWHEREStudents.Sno=Reports.SnoANDReports.Cno=Courses.Cno例3.61定義一個(gè)反映學(xué)生出生年份的視圖。CREATEVIEWStudent_birth(Sno,Sname,Sbirth)ASSELECTSno,Sname,1996-SageFROMStudents2刪除視圖例3.62刪除視圖Student_CR。DROPVIEWStudent_CR;二查詢視圖例3.63在數(shù)學(xué)系的學(xué)生視圖C_Student中找出年齡(Sage)小于20歲的學(xué)生姓名(Sname)和年齡(Sage)。SELECTSname,SageFROMC_StudentWHERESage<20;說明:本例轉(zhuǎn)換后的查詢語句為:SELECTSname,SageFROMStudentsWHERESdept=’數(shù)學(xué)’ANDSage<20;例3.64在Student_CR視圖中查詢成績在85分以上的學(xué)生學(xué)號(hào)(Sno)、姓名(Sname)和課程名稱(Cname)。SELECTSno,Sname,CnameFROMStudent_CRWHEREGrade>85;三更新視圖例3.65將數(shù)學(xué)系學(xué)生視圖C_Student中學(xué)號(hào)為S05的學(xué)生姓名改為“黃海”。UPDATEC_StudentSETSname='黃海'WHERESno='S05';說明:DBMS自動(dòng)轉(zhuǎn)換為對基本表的更新語句如下:UPDATEStudentsSETSname='黃海'WHERESno='S05'ANDSdept='數(shù)學(xué)';例3.66向數(shù)學(xué)系學(xué)生視圖C_Student中插入一個(gè)新的學(xué)生記錄,其中學(xué)號(hào)為“S09”,姓名為“王?!?,年齡為20歲。INSERTINTOC_StudentVALUES('S09','王海',20,’數(shù)學(xué)’);例3.67刪除數(shù)學(xué)系學(xué)生視圖C_Student中學(xué)號(hào)為“S09”的記錄。DELETEFROMC_StudentWHERESno=’S09參考實(shí)習(xí)在PowerBuilder中的嵌入式SQL語句說明:本節(jié)的例子必須在PowerBuilder環(huán)境中才能運(yùn)行,不懂PowerBuilder的初學(xué)者沒有必要對其做上機(jī)實(shí)習(xí)。以下這些材料對制作多媒體教案有用。1檢索單行數(shù)據(jù)的SELECT語句例3.76查詢學(xué)號(hào)為“S01”的學(xué)生選修課程號(hào)“C01”課程的考試成績。StringXno,Kno//PowerBuilder聲明兩個(gè)字符串變量,分別存放學(xué)號(hào)和課程號(hào)IntCgrage//PowerBuilder聲明一個(gè)整型變量,用于存放學(xué)習(xí)成績SELECTSno,Cno,Grade//本行開始的4行為一條完整的嵌入式SQL語句INTO:Xno,:Kno,:Cgrage//SQL中引用PowerBuilder的主變量前要加冒號(hào)FROMReportsWHERESno=’S01’ANDCno=’C01’;//PowerBuilder使用SQL時(shí)以分號(hào)結(jié)束以上程序段將SELECT取得的一條記錄賦值給主變量Xno,Kno和Cgrage。2INSERT語句例3.77向表Reports中添加一條記錄(’S12’,’C05’,87)。INSERTINTOReports(Sno,Cno,Grade)VALUES(’S12’,’C05’,87);或者StringXno,Kno//PowerBuilder聲明兩個(gè)字符串變量,分別存放學(xué)號(hào)和課程號(hào)IntCgrage//PowerBuilder聲明一個(gè)整型變量,用于存放學(xué)習(xí)成績Xno=’S12’//將欲插入的值賦給主變量Xno,Kno和CgrageKno=’C05’Cgrage=87INSERTINTOReports(Sno,Cno,Grade)//將主變量Xno,Kno和Cgrage的值插入表中VALUES(:Xno,:Kno,:Cgrage);3UPDATE語句例3.78將表“Reports”中所有成績低于90的學(xué)生加5分。UPDATEReportsSETGrade=Grade+5WHEREGrade<90;4DELETE語句例3.79刪除“Reports”表中所有選“C03”課程的學(xué)生信息。DELETEFROMReportsWHERECno=’C03’;5游標(biāo)的使用例3.80查詢關(guān)系Reports中的Grade信息,如果Grade的值小于85,則將其在原來基礎(chǔ)上增加5,否則將該記錄刪除。這個(gè)更新操作可以通過使用游標(biāo)的以下程序?qū)崿F(xiàn)。IntCgrade//聲明一個(gè)整型變量,作為SQL的主變量DECLAREReport_CurCURSORFOR//聲明游標(biāo)Report_CurSELECTGrade//并將查詢結(jié)果數(shù)據(jù)集相聯(lián)系FROMReports;OPENReport_Cur;//打開游標(biāo)Report_CurFETCHReport_CurINTO:Cgrade;//讀取游標(biāo)的第一條記錄,并存入主變量DOWHILESQLCA.SQLCode=0//循環(huán)結(jié)構(gòu)開始,若讀取成功則進(jìn)入循環(huán)IFCgrade<85THEN//若讀出的該記錄成績(Cgrade)低于85分UPDATEReports//則該記錄的成績(Grade)增加85分SETGrade=Grade+5WHERECURRENTOFReport_Cur;//這是CURRENT型UPDATE語句ELSE//否則刪除該記錄DELETEFROMReportsWHERECURRENTOFReport_Cur;ENDIF FETCHReport_CurINTO:Cgrade;//讀取游標(biāo)的下一條記錄LOOP//循環(huán)結(jié)構(gòu)結(jié)束符CLOSEReport_Cur;//關(guān)閉游標(biāo)Report_Cur二在Delphi中使用SQL語句說明:本節(jié)的例子必須在Delphi環(huán)境中才能運(yùn)行,不懂Delphi的初學(xué)者沒有必要對其做上機(jī)實(shí)習(xí),第7章有一個(gè)完整的應(yīng)用系統(tǒng)例子供上機(jī)實(shí)習(xí)之用。以下這些材料對制作多媒體教案有用。本節(jié)后面每個(gè)例子都需要的=1\*GB2⑴=2\*GB2⑵步語句定義如下,在后面的例子中不再給出。MyQuery:=TQuery.Create(Application);//聲明并創(chuàng)建一個(gè)TQuery類的控件MyQueryMyQuery.DatabaseName:='student';//MyQuery控件要訪問的數(shù)據(jù)庫別名為student1檢索單行數(shù)據(jù)的SELECT語句例3.81查詢學(xué)號(hào)為“S01”的學(xué)生選修課程號(hào)“C01”課程的考試成績,請與例3.76比較。VarXno:AnsiString;Kno:AnsiString;//Delphi聲明兩個(gè)字符串變量,分別存放學(xué)號(hào)和課程號(hào)Cgrage:Integer

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論