




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章結(jié)構(gòu)化語(yǔ)言SQL基礎(chǔ)學(xué)習(xí)目標(biāo)
了解SQL語(yǔ)言的產(chǎn)生與發(fā)展認(rèn)識(shí)SQL語(yǔ)言的特點(diǎn)深入理解SQL語(yǔ)言所涉及的基本概念熟練使用SQL語(yǔ)言進(jìn)行數(shù)據(jù)庫(kù)定義、數(shù)據(jù)檢索、數(shù)據(jù)插入、數(shù)據(jù)修改、數(shù)據(jù)刪除等操作。1第8章結(jié)構(gòu)化語(yǔ)言SQL基礎(chǔ)教學(xué)內(nèi)容
8.1SQL概述8.2數(shù)據(jù)定義8.3數(shù)據(jù)操縱8.4數(shù)據(jù)檢索8.5事務(wù)處理本章小結(jié)返回總目錄28.1SQL概述返回目錄SQL(StructuredQueryLanguage)結(jié)構(gòu)化查詢語(yǔ)言1974年由Boyce和Chamberlin提出,首先在IBM公司的關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)SystemR上實(shí)現(xiàn)。SQL功能豐富、使用方便、靈活、語(yǔ)言簡(jiǎn)潔易學(xué),最終發(fā)展成為關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言。數(shù)據(jù)庫(kù)廠商推出的大部分DBMS產(chǎn)品都支持SQL,使得不同的數(shù)據(jù)庫(kù)系統(tǒng)之間有了共同的操作基礎(chǔ)。3(1)SQL特點(diǎn)SQL介于關(guān)系代數(shù)與關(guān)系演算之間,集數(shù)據(jù)查詢、數(shù)據(jù)操縱、數(shù)據(jù)定義和數(shù)據(jù)控制功能于一體,國(guó)際標(biāo)準(zhǔn)。主要特點(diǎn)有如下幾條:①綜合統(tǒng)一:SQL語(yǔ)言使集數(shù)據(jù)定義語(yǔ)言DDL、數(shù)據(jù)操縱語(yǔ)言DML、數(shù)據(jù)控制語(yǔ)言DCL功能于一體,關(guān)系模型的實(shí)體及實(shí)體間的聯(lián)系均用關(guān)系表示,其查詢、插入、刪除、修改都只有一種操作符。②高度非過(guò)程化的語(yǔ)言:用戶只需提出“干什么”,至于“怎么干”由DBMS解決。③面向集合的語(yǔ)言:每一個(gè)SQL的操作對(duì)象是一個(gè)或多個(gè)關(guān)系,操作的結(jié)果也是一個(gè)關(guān)系。④以一種語(yǔ)法結(jié)構(gòu)提供兩種操作方式:即可獨(dú)立使用,又可嵌入到宿主語(yǔ)言中使用,具有自主型和宿主型兩種特點(diǎn)。⑤語(yǔ)言簡(jiǎn)捷,易學(xué)易用:SQL設(shè)計(jì)很巧妙,核心功能只需9個(gè)動(dòng)詞。在語(yǔ)言上接近英語(yǔ),因此很容易學(xué)習(xí)。返回目錄4SQL語(yǔ)言的動(dòng)詞表8-1SQL語(yǔ)言的動(dòng)詞返回目錄SQL功能操作符數(shù)據(jù)查詢SELECT數(shù)據(jù)定義CREATE,DROP,ALTER數(shù)據(jù)操縱INSERT,UPDATE,DELETE數(shù)據(jù)控制GRANT,REVOKE58.2數(shù)據(jù)定義--8.2.1創(chuàng)建數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)是一個(gè)存放數(shù)據(jù)的表和支持這些數(shù)據(jù)的存儲(chǔ)、檢索、安全性和完整性的邏輯成分所組成的集合。數(shù)據(jù)庫(kù)對(duì)象包括組成數(shù)據(jù)庫(kù)的邏輯成分,如:表、視圖、索引等。ANSI標(biāo)準(zhǔn)SQL建立數(shù)據(jù)庫(kù)結(jié)構(gòu)(模式)的命令是:CREATESTUCOUHEMAAUTHORIZATION<創(chuàng)建者>;例如,創(chuàng)建者是李平的命令如下:CREATESTUCOUHEMAAUTHORIZATION<李平>;但是大部分的DBMS,如DB2,XDB,DBASEIV創(chuàng)建數(shù)據(jù)庫(kù)命令語(yǔ)法格式如下:CREATEDATABASE<DATABASE_NAME>;返回目錄68.2.2表及其創(chuàng)建表類似紙面上的一張表:它由行和列組成。字段的數(shù)目是固定的,每個(gè)字段都有一個(gè)名字。行的數(shù)目是變化的,它反映在任意時(shí)刻里存儲(chǔ)的數(shù)據(jù)量。每個(gè)字段都有一個(gè)數(shù)據(jù)類型。數(shù)據(jù)類型約束可以賦予一個(gè)字段的可能數(shù)值的集合,并且約束為存儲(chǔ)在字段里的數(shù)據(jù)賦以語(yǔ)義,這樣它就可以用于計(jì)算。返回目錄7
(1)表的定義語(yǔ)句格式CREATETABLE<表名><列名><數(shù)據(jù)類型>[<列級(jí)完整性約束條件>][,<列名><數(shù)據(jù)類型>[<列級(jí)完整性約束條件>]]…[,<表級(jí)完整性約束條件>]);<表名>:所要定義的基本表的名字;<列名>:組成該表的各個(gè)屬性(列);<列級(jí)完整性約束條件>:涉及相應(yīng)屬性列的完整性約束條件;<表級(jí)完整性約束條件>:涉及一個(gè)或多個(gè)屬性列的完整性約束條件;返回目錄8數(shù)據(jù)類型返回目錄數(shù)據(jù)類型符號(hào)標(biāo)識(shí)半字長(zhǎng)二進(jìn)制整數(shù)Smallint全字長(zhǎng)二進(jìn)制整數(shù)Int
或Integer雙字長(zhǎng)浮點(diǎn)型Float最大長(zhǎng)度為n變長(zhǎng)字符串VarChar(n)日期型DateIBMDB2SQL支持的部分?jǐn)?shù)據(jù)類型9
[例1]建立一個(gè)“學(xué)生”表Student,它由學(xué)號(hào)Number、姓名Name、性別Sex、年齡Age、所在系Department五個(gè)屬性組成。其中學(xué)號(hào)不能為空,值是唯一的,并且姓名取值也唯一。CREATETABLEStudent
(NumberCHAR(5)NOTNULLUNIQUE,
NameCHAR(20)UNIQUE,
SexCHAR(1),
AgeINT,
DepartmentCHAR(15));建立表時(shí),常用完整性約束主要有以下幾種:主碼約束:PRIMARYKEY;唯一性約束:UNIQUE;非空值約束:NOTNULL;其中PRIMARYKEY定義某屬性為表主碼,它的與UNIQUE的區(qū)別是:定義為主碼的屬性一定是互不相同的,即PRIMARYKEY約束包含UNIQUE約束。UNIQUE約束只是表示該屬性的值互不相同,它不是主碼。返回目錄
(1)表的定義例子10
(2)刪除基本表格式:DROPTABLE<表名>;
基本表被刪除以后,基本表中的數(shù)據(jù)、表上建立的索引都刪除了,表上的視圖往往仍然保留,但卻無(wú)法引用。刪除基本表時(shí)系統(tǒng)會(huì)從數(shù)據(jù)字典中刪去有關(guān)該基本表及其索引的描述。[例2]刪除Student表
DROPTABLEStudent;返回目錄11
(3)修改基本表格式:ALTERTABLE<表名>[ADD<新列名><數(shù)據(jù)類型>[完整性約束]][DROP<完整性約束名>][MODIFY<列名><數(shù)據(jù)類型>];其中:<表名>:要修改的基本表;ADD子句:增加新列和新的完整性約束條件;DROP子句:刪除指定的完整性約束條件;MODIFY子句:用于修改列名和數(shù)據(jù)類型;返回目錄12
(3)修改基本表---例子[例4]向Student表增加“入學(xué)時(shí)間”列,其數(shù)據(jù)類型為日期型。
ALTERTABLEStudentADDStuCouomeDATE;不論基本表中原來(lái)是否已有數(shù)據(jù),新增加的列一律為空值。
刪除屬性列可以分為直接刪除或間接刪除間接刪除就是把表中要保留的列及其內(nèi)容復(fù)制到一個(gè)新表中,然后刪除原表,再將新表重命名為原表名直接刪除屬性列就比較簡(jiǎn)單。修改原有的列定義有可能會(huì)破壞已有數(shù)據(jù),所以有些DBMS不允許直接刪除屬性列,這時(shí),就必須采用間接刪除。返回目錄138.2.3約束數(shù)據(jù)類型是約束我們可以在表里存儲(chǔ)什么類型的數(shù)據(jù)的一種方法。數(shù)據(jù)類型提供的約束實(shí)在是太粗糙。一個(gè)包含產(chǎn)品價(jià)格的字段可能應(yīng)該只接受正數(shù)。但是沒(méi)有哪種數(shù)據(jù)類型只接受正數(shù)。可能需要根據(jù)其他字段或者行的數(shù)據(jù)來(lái)約束字段數(shù)據(jù)。比如,在一個(gè)包含產(chǎn)品信息的表中,每個(gè)產(chǎn)品編號(hào)都應(yīng)該只有一行。SQL允許你在字段和表上定義約束。約束給予你所需要對(duì)數(shù)據(jù)施加的一切控制。在一個(gè)字段里存儲(chǔ)會(huì)違反約束的數(shù)據(jù),那么就會(huì)給出一個(gè)錯(cuò)誤信息。適用于數(shù)值來(lái)自缺省值的情況。返回目錄14
(1)檢查約束最常見的約束類型。允許在某個(gè)字段里的數(shù)值必須滿足一個(gè)任意的表達(dá)式。檢查約束用關(guān)鍵字CONSTRAINT,它后面跟著一個(gè)標(biāo)識(shí)符,表示這個(gè)約束一個(gè)獨(dú)立的名字。然后再跟著約束定義。比如,要強(qiáng)制一個(gè)正數(shù)的產(chǎn)品價(jià)格,在ORACLE中你可以用:CREATETABLEproducts(
product_noCHAR(8),nameCHAR(8),priceNUMBER(7)CONSTRAINTc1CHECK(price>0));約束定義在數(shù)據(jù)類型后面。一個(gè)檢查約束由一個(gè)關(guān)鍵字CHECK后面跟著一個(gè)放在圓括弧里的表達(dá)式組成。檢查約束表達(dá)式應(yīng)該包含受約束的字段,否則這個(gè)約束就沒(méi)什么意義了。返回目錄15(2)非空約束與唯一約束非空約束簡(jiǎn)單地聲明一個(gè)字段必須不能是空值,前面講建表的時(shí)候已經(jīng)提過(guò)非空約束是約束的一種類型非空約束總能寫成一個(gè)字段約束。非空約束在功能上等效于創(chuàng)建一個(gè)檢查約束CHECK(column_nameISNOTNULL)非空約束可不用明確的名字一個(gè)字段可以有多個(gè)約束。只要在一個(gè)約束后面繼續(xù)寫另外一個(gè)就可以了唯一約束UNIQUE保證在一個(gè)字段或者一組字段里的數(shù)據(jù)與表中其它行的數(shù)據(jù)相比是唯一的返回目錄16(4)主碼主碼約束是唯一約束和非空約束的組合。所以,下面兩個(gè)表定義接受同樣的數(shù)據(jù):CREATETABLEproducts(
product_noINTUNIQUENOTNULL,nameCHAR(8),priceNUMBER(7));CREATETABLEproducts(
product_noPRIMARYKEY,nameCHAR(8),priceNUMBER(7));返回目錄17(4)主碼主碼也可以約束多于一個(gè)字段;其語(yǔ)法類似唯一約束:CREATETABLEexample(aINT,bINT,cINT,PRIMARYKEY(a,c));主碼表示一個(gè)字段或者是若干個(gè)字段的組合可以用于表中的數(shù)據(jù)行的唯一標(biāo)識(shí)。表最多可以有一個(gè)主碼,但是它可以有多個(gè)唯一和非空約束。每個(gè)表都必須有一個(gè)主碼。返回目錄18(5)外碼1約束字段數(shù)值必須匹配另外一個(gè)表中某些行出現(xiàn)的數(shù)值。假設(shè)我們有個(gè)產(chǎn)品表:CREATETABLEproducts(
product_noPRIMARYKEY,nameCHAR(8),priceNUMBER(7));假設(shè)有一個(gè)存儲(chǔ)這些產(chǎn)品的訂單的表。我們想保證訂單表只包含實(shí)際存在的產(chǎn)品。因此我們?cè)谟唵伪碇卸x一個(gè)外碼約束引用產(chǎn)品表:CREATETABLEorders(
order_idINTPRIMARYKEY,
product_noINTREFERENCESproducts(product_no),quantityINT);不可能創(chuàng)建任何其product_no
沒(méi)有在產(chǎn)品表中出現(xiàn)的訂單。在這種情況下我們把訂單表叫做參照表,而產(chǎn)品表是被參照表。返回目錄19(5)外碼2一個(gè)表可以包含多于一個(gè)外碼約束。外碼刪除相關(guān)方式:①級(jí)聯(lián)刪除(cascades):即將參照關(guān)系中的所有外碼值與被參照關(guān)系中要?jiǎng)h除元組值相對(duì)應(yīng)的元組一起刪除。②受限刪除(restricted):即當(dāng)參照關(guān)系中沒(méi)有任何元組的外碼值與要?jiǎng)h除的被參照關(guān)系的元組的主碼值相同時(shí),系統(tǒng)才執(zhí)行刪除操作,否則拒絕此刪除操作。③置空值刪除:即刪除被參照關(guān)系的元組,并將參照關(guān)系中的元組所有與被參照關(guān)系中被刪除元組主碼值相同的外碼值置為空值。受限刪除和級(jí)聯(lián)刪除是兩種最常見的選項(xiàng)。返回目錄208.2.4索引及其創(chuàng)建建立索引是加快查詢速度的有效手段,建立索引必須由DBA或表的屬主(即建立表的人)根據(jù)需要建立,有些DBMS自動(dòng)建立以下列上的索引。
PRIMARYKEYUNIQUE索引的維護(hù)由DBMS自動(dòng)完成,DBMS自動(dòng)選擇是否使用索引以及使用哪些索引。返回目錄21(1)建立索引語(yǔ)句格式:CREATE[UNIQUE][CLUSTER]INDEX<索引名>ON<表名>(<列名>[<次序>][,<列名>[<次序>]]…); 用<表名>指定要建索引的基本表名字索引可以建立在該表的一列或多列上,各列名之間用逗號(hào)分隔<次序>指定索引值的排列次序,升序用ASC表示,降序用DESC表示。缺省值是ASC。UNIQUE表明此索引的每一個(gè)索引值只對(duì)應(yīng)唯一的數(shù)據(jù)記錄CLUSTER表示要建立的索引是聚簇索引。返回目錄22(1)建立索引---例子[例1]為學(xué)生-課程數(shù)據(jù)庫(kù)中的Student,Course,STUCOU三個(gè)表建立索引。其中Student表按學(xué)號(hào)升序建唯一索引,Course表按課程號(hào)升序建唯一索引,STUCOU表按學(xué)號(hào)升序和課程號(hào)降序建唯一索引。CREATEUNIQUEINDEXStuNumberONStudent(Number);CREATEUNIQUEINDEXCouCounumONCourse(Counum);CREATEUNIQUEINDEXSTUCOUnoONSTUCOU(NumberASC,CounumDESC);返回目錄23(1)建立索引3對(duì)于已含重復(fù)值的屬性列不能建UNIQUE索引對(duì)某個(gè)列建立UNIQUE索引后,插入新記錄時(shí)DBMS會(huì)自動(dòng)檢查新記錄在該列上是否取了重復(fù)值建立聚簇索引后,基表中數(shù)據(jù)也需要按指定的聚簇屬性值的升序或降序存放。[例2]CREATECLUSTERINDEXStuNameONStudent(Name);在Student表的Name(姓名)列上建立一個(gè)聚簇索引,而且Student表中的記錄將按照Name值的升序存放。在一個(gè)基本表上最多只能建立一個(gè)聚簇索引,聚簇索引的用途是對(duì)于某些類型的查詢,可以提高查詢效率。很少對(duì)基表進(jìn)行增刪操作,很少對(duì)其中的變長(zhǎng)列進(jìn)行修改操作,可以建立聚簇索引。返回目錄24(2)刪除索引DROPINDEX<索引名>;刪除索引時(shí),系統(tǒng)會(huì)從數(shù)據(jù)字典中刪去有關(guān)該索引的描述。[例3]刪除Student表的StuName索引。
DROPINDEXStuName
;返回目錄258.2.5存儲(chǔ)過(guò)程與觸發(fā)器保證數(shù)據(jù)庫(kù)中數(shù)據(jù):完整性一致性提高應(yīng)用的性能,常常采用存儲(chǔ)過(guò)程和觸發(fā)器技術(shù)。返回目錄26存儲(chǔ)過(guò)程是一組為了完成特定功能的SQL語(yǔ)句集,編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)中用戶通過(guò)指定存儲(chǔ)過(guò)程的名字并給出參數(shù)(如果該存儲(chǔ)過(guò)程帶有參數(shù))來(lái)執(zhí)行它。是實(shí)現(xiàn)特定功能的程序體,不同的應(yīng)用程序都可以通過(guò)名稱和參數(shù)調(diào)用存儲(chǔ)過(guò)程對(duì)存儲(chǔ)過(guò)程的修改完善不會(huì)影響應(yīng)用程序,存儲(chǔ)過(guò)程可以提高系統(tǒng)的可移植性。存儲(chǔ)過(guò)程是經(jīng)過(guò)預(yù)編譯和優(yōu)化過(guò)的程序代碼,存儲(chǔ)過(guò)程能夠?qū)崿F(xiàn)較快的執(zhí)行速度。返回目錄27TSQL命令創(chuàng)建存儲(chǔ)過(guò)程語(yǔ)法格式:CREATEPROCEDUREprocedure_name[;number] [{@parameterdata_type}
[VARYING][=default][OUTPUT] ][,...n][WITH{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}]|[FORREPLICATION]ASsql_statement[...n]返回目錄28參數(shù)說(shuō)明:procedure_name:是要?jiǎng)?chuàng)建的存儲(chǔ)過(guò)程的名字;Number:用一個(gè)整數(shù)用來(lái)區(qū)別一組同名的存儲(chǔ)過(guò)程;@parameter:存儲(chǔ)過(guò)程的參數(shù);Data_type:參數(shù)的數(shù)據(jù)類型;VARYING:用于指定作為輸出OUTPUT參數(shù)支持的結(jié)果集,僅應(yīng)用于游標(biāo)型參數(shù);Default:用于指定參數(shù)的默認(rèn)值。;OUTPUT:表明該參數(shù)是一個(gè)返回參數(shù);RECOMPILE:存儲(chǔ)過(guò)程每執(zhí)行一次都又要重新編譯;ENCRYPTION:表示SQLServer加密了syStuCouomments
表,該表的text字段是包含CREATEPROCEDURE語(yǔ)句的存儲(chǔ)過(guò)程文本;FORREPLICATION:用于指定不能在訂閱服務(wù)器上執(zhí)行為復(fù)制創(chuàng)建的存儲(chǔ)過(guò)程;AS:用于指定該存儲(chǔ)過(guò)程要執(zhí)行的操作;sql_statement:是存儲(chǔ)過(guò)程中要包含的任意數(shù)目和類型的Transact-SQL語(yǔ)句;返回目錄29存儲(chǔ)過(guò)程---例子[例1]該例是創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,實(shí)現(xiàn)將數(shù)據(jù)庫(kù)中的人員代碼的自動(dòng)生成,每增加一個(gè)新人員,就從自動(dòng)生成庫(kù)t_table.number中得到新人員的人員代碼,將這個(gè)值存入局部變量str
中,作為新記錄的personnel_id;然后執(zhí)行存儲(chǔ)過(guò)程,使t_table.number的值加1,以備下一個(gè)調(diào)用。創(chuàng)建存儲(chǔ)過(guò)程:CREATEPROCEDUREget_numberAS Updatet_tableSetnumber=number+1COMMIT調(diào)用存儲(chǔ)過(guò)程:selectt_table.numberinto:strfromt_table;DECLAREsp_getnumberPROCEDUREFORget_number;Executesp_getnumber;Closesp_getnumber;返回目錄30
觸發(fā)器一種特殊類型的存儲(chǔ)過(guò)程與存儲(chǔ)過(guò)程的區(qū)別:觸發(fā)器主要是通過(guò)事件進(jìn)行觸發(fā)而被執(zhí)行的而存儲(chǔ)過(guò)程可以通過(guò)存儲(chǔ)過(guò)程名字被直接調(diào)用執(zhí)行。對(duì)某一表進(jìn)行諸如UPDATE、INSERT、DELETE這些操作時(shí),SQL就會(huì)自動(dòng)執(zhí)行觸發(fā)器所定義的SQL語(yǔ)句能夠?qū)崿F(xiàn)由主碼和外碼所不能保證的復(fù)雜的參照完整性和數(shù)據(jù)的一致性。能夠?qū)崿F(xiàn)比CHECK語(yǔ)句更為復(fù)雜的約束。返回目錄31觸發(fā)與約束的區(qū)別觸發(fā)(tigger)也稱為事件一條件一動(dòng)作規(guī)則(event-condition-actionrules)或ECA規(guī)則,在三個(gè)方面不同于前面討論的約束類型。①當(dāng)數(shù)據(jù)庫(kù)編程人員所指定的某些事件發(fā)生時(shí)才對(duì)觸發(fā)程序進(jìn)行測(cè)試。允許的事件種類通常為對(duì)特定關(guān)系的插入、刪除或修改。②不是直接阻止事件的發(fā)生,而是由觸發(fā)程序?qū)l件進(jìn)行測(cè)試。如果條件不滿足,則什么也不做,否則,為響應(yīng)該事件就會(huì)進(jìn)行與該觸發(fā)相關(guān)的處理。③如果觸發(fā)條件得到滿足,就由DBMS執(zhí)行與該觸發(fā)相關(guān)的動(dòng)作。于是該動(dòng)作可能阻止事件的發(fā)生或撤消事件(如刪除插入的元組)。實(shí)際上,動(dòng)作可能是數(shù)據(jù)庫(kù)操作的任何序列。返回目錄32觸發(fā)器---例子[例2]我們將寫出應(yīng)用于表Farmer(name,address,cert,networth)的SQL3觸發(fā)程序。觸發(fā)程序是由對(duì)networth屬性的修改而啟動(dòng)的。該規(guī)則的作用是對(duì)降低農(nóng)民存收入的任何嘗試加以阻止。
l)CREATETRIGGERNetgetworthTrigger2)AFTERUPDATEOFnetworthONFarmer3)REFERENCING4)OLDASOldTuple,
5)NEWASNewTuple6)WHEN(OldTget>NewTget)
7)UPDATEFarmer8)SETnetworth=OldTuple.networth9)WHEREcert=NewTuple.cert10)FOREACHROW返回目錄33觸發(fā)器---例子1)行給出具有關(guān)鍵字CREATETRIGGER和觸發(fā)程序名的說(shuō)明。2)行給出了觸發(fā)事件,即修改關(guān)系Farmer中的屬性netget。3)到5)行是為該觸發(fā)程序的條件和動(dòng)作部分如何引用舊元組(修改前的元組)和新元組(修改后的元組)提供一種方法。根據(jù)4)行和5)行中的說(shuō)明,將用OldTuple和NewTuple分別引用這兩個(gè)元組。在條件和動(dòng)作部分,這些名稱可以像在普通SQL查詢的FROM子句中說(shuō)明的元組變量一樣使用。6)行是觸發(fā)程序的條件部分。它表明只有在新的農(nóng)民存收入低于舊的凈農(nóng)民存收入時(shí)才執(zhí)行動(dòng)作。
7)行到9)行構(gòu)成動(dòng)作部分:它們是普通的SQL修改語(yǔ)句,而具有的功能是將該農(nóng)民的存收入恢復(fù)到修改以前的值。9)行的WHERE子句保證只影響到修改的元組(具有特定cert的元組)。10)行表明了要求,即每當(dāng)修改元組,該觸發(fā)程序都會(huì)啟動(dòng)一次。如果沒(méi)有這一行,那么,每個(gè)SQL語(yǔ)句都使觸發(fā)程序執(zhí)行一次而無(wú)論發(fā)生多少改變?cè)M的觸發(fā)事件。返回目錄34觸發(fā)器---相關(guān)解釋AFTER:其規(guī)則的動(dòng)作將在觸發(fā)事件之后執(zhí)行BEFORE:WHEN中的條件在觸發(fā)事件之前檢驗(yàn)。如果條件為真觀u執(zhí)行觸發(fā)程序的動(dòng)作。此外,無(wú)論條件是否為真,都將執(zhí)行觸發(fā)程序修改的事件。INSTEADOF:(如果符合WHEN中的條件)會(huì)執(zhí)行動(dòng)作,而永遠(yuǎn)不會(huì)執(zhí)行觸發(fā)事件。觸發(fā)事件:UPDATEINSERTDELETE。。任意數(shù)量用分號(hào)分開的SQL語(yǔ)句組成觸發(fā)器。返回目錄358.3數(shù)據(jù)操縱數(shù)據(jù)操縱數(shù)據(jù)插入數(shù)據(jù)更新返回目錄368.3.1數(shù)據(jù)插入語(yǔ)句格式:INSERTINTO<表名>[(<屬性列1>[,<屬性列2>…)]VALUES(<常量1>[,<常量2>]…)功能:將新元組插入指定表中。37數(shù)據(jù)插入---例子
[例1]將一個(gè)新學(xué)生記錄(學(xué)號(hào):95020;姓名:陳冬;性別:男;所在系:IS;年齡:18歲)插入到Student表中。INSERTINTOStudentVALUES('95020','陳冬','男','IS',18);沒(méi)有指定屬性列:表示要插入的是一條完整的元組,且屬性列屬性與表定義中的順序一致,指定部分屬性列:插入的元組在其余屬性列上取空值。VALUES子句提供的值必須與INTO子句匹配,包括值的個(gè)數(shù)和值的類型。DBMS在執(zhí)行插入語(yǔ)句時(shí)會(huì)檢查所插元組是否破壞表上已定義的完整性規(guī)則,即實(shí)體完整性和參照完整性。破壞完整性規(guī)則的則拒絕插入。返回目錄388.3.2數(shù)據(jù)更新數(shù)據(jù)更新包括數(shù)據(jù)修改和數(shù)據(jù)刪除。(1)數(shù)據(jù)修改語(yǔ)句格式:UPDATE<表名>SET<列名>=<表達(dá)式>[,<列名>=<表達(dá)式>]…[WHERE<條件>];功能:修改指定表中滿足WHERE子句條件的元組。SET子句:指定修改方式、要修改的列、修改后取值。WHERE子句:指定要修改的元組、缺省表示要修改表中的所有元組。返回目錄39(1)數(shù)據(jù)修改---例子
[例1]將學(xué)生95001的年齡改為22歲。
UPDATEStudentSETAge=22WHERENumber='95001';DBMS在執(zhí)行修改語(yǔ)句時(shí)會(huì)檢查修改操作是否破壞表上已定義的完整性規(guī)則、實(shí)體完整性、主碼不允許修改、用戶定義的完整性、NOTNULL約束、UNIQUE約束、值域約束等。返回目錄40(2)數(shù)據(jù)刪除(2)數(shù)據(jù)刪除
DELETEFROM<表名>[WHERE<條件>];功能:刪除指定表中滿足WHERE子句條件的元組。WHERE子句:指定要?jiǎng)h除的元組,缺省表示要修改表中的所有元組。DBMS在執(zhí)行刪除語(yǔ)句時(shí)會(huì)檢查所刪除的元組是否破壞表上已定義的完整性規(guī)則:主要是參照完整性,一般有三種處理方式:級(jí)連刪除,受限刪除,置空值刪除返回目錄418.4數(shù)據(jù)檢索語(yǔ)句格式:SELECT[ALL|DISTINCT]<目標(biāo)列表達(dá)式>[,<目標(biāo)列表達(dá)式>]…FROM<表名或視圖名>[,<表名或視圖名>]…[WHERE<條件表達(dá)式>][GROUPBY<列名1>[HAVING<條件表達(dá)式>]][ORDERBY<列名2>[ASC|DESC]];SELECT子句:指定要顯示的屬性列;FROM子句:指定查詢對(duì)象(基本表或視圖);WHERE子句:指定查詢條件;GROUPBY子句:對(duì)查詢結(jié)果按指定列的值分組,該屬性列值相等的元組為一個(gè)組。通常會(huì)在每組中作用集函數(shù);HAVING短語(yǔ):篩選出只有滿足指定條件的組;ORDERBY子句:對(duì)查詢結(jié)果表按指定列值的升序或降序排序。返回目錄428.4.1單表查詢
單表查詢的查詢僅涉及一個(gè)表是一種最簡(jiǎn)單的查詢操作分成以下五種情況:選擇表中的若干列;選擇表中的若干元組;對(duì)查詢結(jié)果排序;使用集函數(shù)查詢;對(duì)查詢結(jié)果分組。返回目錄43(1)選擇表中的若干列1查詢表中指定列。例子如下:[例1]查詢?nèi)w學(xué)生的學(xué)號(hào)與姓名。SELECTNumber,NameFROMStudent;
當(dāng)然也可以查詢表中的全部列,查詢表中的全部列時(shí)可以將表中的全部列名列出,也可以簡(jiǎn)單地用*代替。例子如下:[例2]查詢?nèi)w學(xué)生的詳細(xì)記錄。SELECT*FROMStudent;返回目錄44(1)選擇表中的若干列2查詢經(jīng)過(guò)計(jì)算的值,此時(shí)SELECT子句的<目標(biāo)列表達(dá)式>為表達(dá)式、算術(shù)表達(dá)式、字符串常量、函數(shù)、列別名等。[例3]查全體學(xué)生的姓名及其出生年份。SELECTName,2000-AgeFROMStudent;
輸出結(jié)果:
Name2000-Age----------------------
張小鵬1976
李敏1977
王名1978
張立1978返回目錄45(1)選擇表中的若干列3將一個(gè)常量串表達(dá)式放入查詢結(jié)果。[例4]查詢?nèi)w學(xué)生的姓名、出生年份和所有系,要求用小寫字母表示所有系名。SELECTName,'YearofBirth:',2000-Age,ISLOWER(Department)FROMStudent;輸出結(jié)果:
Name'YearofBirth:'2000-AgeISLOWER(Department)
----------------------------------------------
張小鵬YearofBirth:1976cs
李敏YearofBirth:1977is
王名YearofBirth:1978ma
張立YearofBirth:1977is返回目錄46(1)選擇表中的若干列4用列別名改變查詢結(jié)果的列標(biāo)題。請(qǐng)看下面的例子:SELECTNameNAME,'YearofBirth:’BIRTH,2000-AgeBIRTHDAY,ISLOWER(Department)DEPARTMENTFROMStudent;輸出結(jié)果:
NAMEBIRTHBIRTHDAYDEPARTMENT------------------------------------------------------
張小鵬YearofBirth:1976cs
李敏YearofBirth:1977is
王名YearofBirth:1978ma
張立YearofBirth:1977is返回目錄47(2)選擇表中的若干元組1選擇表中的若干元組可以消除取值重復(fù)的行。此時(shí)可以在SELECT子句中使用DISTINCT短語(yǔ)。假設(shè)STUCOU表中有下列數(shù)據(jù):
NumberCounumGrade---------------------9500119295001285950013889500229095002380返回目錄48(2)選擇表中的若干元組2
[例5]查詢選修了課程的學(xué)生學(xué)號(hào)。SELECTDISTINCTNumberFROMSTUCOU;
結(jié)果:
Number-------9500195002注意DISTINCT短語(yǔ)的作用范圍是所有目標(biāo)列。請(qǐng)看以下例子:例:查詢選修課程的各種成績(jī)錯(cuò)誤的寫法:SELECTDISTINCTCounum,DISTINCTGradeFROMSTUCOU;正確的寫法:SELECTDISTINCTCounum,GradeFROMSTUCOU;
返回目錄49(2)選擇表中的若干元組3選擇元組最常見的就是查詢滿足條件的元組,條件可以是比較大小的條件,此時(shí)在WHERE子句的<比較條件>中使用比較運(yùn)算符:=、>、<、>=、<=、!=、<>、!>、!<或邏輯運(yùn)算符NOT+比較運(yùn)算符。[例6]查詢所有年齡在20歲以下的學(xué)生姓名及其年齡。SELECTName,AgeFROMStudentWHEREAge<20;返回目錄50(2)選擇表中的若干元組4選擇元組還可以使用謂詞BETWEEN…AND…或NOTBETWEEN…AND…確定元組范圍。[例7]查詢年齡在20~23歲(包括20歲和23歲)之間的學(xué)生的姓名、系別和年齡。SELECTName,Department,AgeFROMStudentWHEREAgeBETWEEN20AND23;要想查詢年齡不在20~23歲之間的學(xué)生姓名、系別和年齡,只需在上例的BETWEEN前加上NOT即可。返回目錄51(2)選擇表中的若干元組5選擇元組還可以使用謂詞IN<值表>,NOTIN<值表>來(lái)確定一個(gè)集合。<值表>是用逗號(hào)分隔的一組取值。[例8]查詢信息系(IS)、數(shù)學(xué)系(MA)和計(jì)算機(jī)科學(xué)系(CS)學(xué)生的姓名和性別。SELECTName,SexFROMStudentWHEREDepartmentIN('IS','MA','CS');返回目錄52(2)選擇表中的若干元組6可以用[NOT]LIKE‘<匹配串>’[ESCAPE‘<換碼字符>’]進(jìn)行字符串匹配。<匹配串>:當(dāng)匹配模板為固定字符串時(shí),可以用=運(yùn)算符取代LIKE謂詞,用!=或<>運(yùn)算符取代NOTLIKE謂詞。通配符有如下兩種:%(百分號(hào)):代表任意長(zhǎng)度(長(zhǎng)度可以為0)的字符串;_(下橫線):代表任意單個(gè)字符;ESCAPE短語(yǔ):當(dāng)用戶要查詢的字符串本身就含有%或_時(shí),要使用ESCAPE'<換碼字符>'短語(yǔ)對(duì)通配符進(jìn)行轉(zhuǎn)義。返回目錄53(2)選擇表中的若干元組7[例9]查詢所有姓劉學(xué)生的姓名、學(xué)號(hào)和性別。
SELECTName,Number,SexFROMStudentWHERENameLIKE‘劉%’;使用換碼字符將通配符轉(zhuǎn)義為普通字符的例子:[例10]查詢以"DB_"開頭,且倒數(shù)第3個(gè)字符為i的課程的詳細(xì)情況。
SELECT*FROMCourseWHERECnameLIKE'DB\_%i__'ESCAPE'\';返回目錄54(2)選擇表中的若干元組8涉及空值的查詢,使用謂詞ISNULL或ISNOTNULL可以進(jìn)行涉及空值的查詢,“ISNULL”不能用“=NULL”代替。[例11]某些學(xué)生選修課程后沒(méi)有參加考試,所以有選課記錄,但沒(méi)有考試成績(jī)。查詢?nèi)鄙俪煽?jī)的學(xué)生的學(xué)號(hào)和相應(yīng)的課程號(hào)。
SELECTNumber,CounumFROMSTUCOUWHEREGradeISNULL;返回目錄55(2)選擇表中的若干元組9選擇元組時(shí)可以用邏輯運(yùn)算符AND和OR來(lái)聯(lián)結(jié)多個(gè)查詢條件形成多重條件查詢AND的優(yōu)先級(jí)高于OR,也可以用括號(hào)改變優(yōu)先級(jí),可用來(lái)實(shí)現(xiàn)多種其他謂詞。[例12]查詢計(jì)算機(jī)系年齡在20歲以下的學(xué)生姓名。
SELECTNameFROMStudentWHEREDepartment='CS'ANDAge<20;返回目錄56(3)對(duì)查詢結(jié)果排序使用ORDERBY子句可以按一個(gè)或多個(gè)屬性列排序。升序:ASC;降序:DESC;[例13]查詢選修了3號(hào)課程的學(xué)生的學(xué)號(hào)及其成績(jī),查詢結(jié)果按分?jǐn)?shù)降序排列。SELECTNumber,GradeFROMSTUCOUWHERECounum='3'ORDERBYGradeDESC;[例14]查詢?nèi)w學(xué)生情況,查詢結(jié)果按所在系的系號(hào)升序排列,同一系中的學(xué)生按年齡降序排列。SELECT*FROMStudentORDERBYDepartment,AgeDESC;返回目錄57(4)使用集函數(shù)集函數(shù)有如下主要的五類:COUNT(*)用于計(jì)數(shù);COUNT([DISTINCT|ALL]<列名>):用于計(jì)數(shù);SUM([DISTINCT|ALL]<列名>):用于計(jì)算總和; AVG([DISTINCT|ALL]<列名>):用于計(jì)算平均值;MAX([DISTINCT|ALL]<列名>):用于求最大值;MIN([DISTINCT|ALL]<列名>):用于求最小值;DISTINCT短語(yǔ):在計(jì)算時(shí)要取消指定列中的重復(fù)值;ALL短語(yǔ):不取消重復(fù)值;ALL為缺省值。返回目錄58(4)使用集函數(shù)
[例15]查詢學(xué)生總?cè)藬?shù)。
SELECTCOUNT(*)
FROMStudent;
[例16]查詢選修了課程的學(xué)生人數(shù)。SELECTCOUNT(DISTINCTNumber)FROMSTUCOU;注意:用DISTINCT以避免重復(fù)計(jì)算學(xué)生人數(shù)。[例17]計(jì)算1號(hào)課程的學(xué)生平均成績(jī)。SELECTAVG(Grade)FROMSTUCOUWHERECounum='1';返回目錄59(5)對(duì)查詢結(jié)果分組1使用GROUPBY子句對(duì)元組進(jìn)行分組,細(xì)化集函數(shù)的作用對(duì)象,如果未對(duì)查詢結(jié)果分組,集函數(shù)將作用于整個(gè)查詢結(jié)果,對(duì)查詢結(jié)果分組后,集函數(shù)將分別作用于每個(gè)組。[例18]求各個(gè)課程號(hào)及相應(yīng)的選課人數(shù)。
SELECTCounum,COUNT(Number)
FROMSTUCOUGROUPBYCounum;
結(jié)果:
CounumCOUNT(Number)
122 234 344 433 548GROUPBY子句的作用對(duì)象是查詢的中間結(jié)果表,分組方法:按指定的一列或多列值分組,值相等的為一組。
返回目錄60(5)對(duì)查詢結(jié)果分組2使用GROUPBY子句后,SELECT子句的列名列表中只能出現(xiàn)分組屬性和集函數(shù)。使用HAVING短語(yǔ)篩選最終輸出結(jié)果。[例19]查詢有3門以上課程是90分以上的學(xué)生的學(xué)號(hào)及(90分以上的)課程數(shù)
SELECTNumber,COUNT(*)
FROMSTUCOUWHEREGrade>=90GROUPBYNumberHAVINGCOUNT(*)>=3;使用HAVING短語(yǔ)篩選最終輸出結(jié)果時(shí),只有滿足HAVING短語(yǔ)指定條件的組才輸出。注意HAVING短語(yǔ)與WHERE子句的區(qū)別:作用對(duì)象不同:WHERE子句作用于基表或視圖,從中選擇滿足條件的元組。HAVING短語(yǔ)作用于組,從中選擇滿足條件的組。返回目錄618.4.2復(fù)雜查詢(1)連接查詢:同時(shí)涉及多個(gè)表的查詢稱為連接查詢,用來(lái)連接兩個(gè)表的條件稱為連接條件或連接謂詞。一般格式:[<表名1>.]<列名1><比較運(yùn)算符>[<表名2>.]<列名2>
比較運(yùn)算符:=、>、<、>=、<=、!=;[<表名1>.]<列名1>BETWEEN[<表名2>.]<列名2>AND[<表名2>.]<列名3>連接謂詞中的列名稱為連接字段,連接條件中的各連接字段類型必須是可比的,但不必是相同的。返回目錄62連接操作的執(zhí)行過(guò)程1①嵌套循環(huán)法(NESTED-LOOP):首先在表1中找到第一個(gè)元組,然后從頭開始掃描表2,逐一查找滿足連接件的元組,找到后就將表1中的第一個(gè)元組與該元組拼接起來(lái),形成結(jié)果表中一個(gè)元組。表2全部查找完后,再找表1中第二個(gè)元組,然后再?gòu)念^開始掃描表2,逐一查找滿足連接條件的元組,找到后就將表1中的第二個(gè)元組與該元組拼接起來(lái),形成結(jié)果表中一個(gè)元組。重復(fù)上述操作,直到表1中的全部元組都處理完畢。返回目錄63連接操作的執(zhí)行過(guò)程2②排序合并法(SORT-MERGE):常用于=連接,首先按連接屬性對(duì)表1和表2排序,對(duì)表1的第一個(gè)元組,從頭開始掃描表2,順序查找滿足連接條件的元組,找到后就將表1中的第一個(gè)元組與該元組拼接起來(lái),形成結(jié)果表中一個(gè)元組。當(dāng)遇到表2中第一條大于表1連接字段值的元組時(shí),對(duì)表2的查詢不再繼續(xù)找到表1的第二條元組,然后從剛才的中斷點(diǎn)處繼續(xù)順序掃描表2,查找滿足連接條件的元組,找到后就將表1中的第一個(gè)元組與該元組拼接起來(lái),形成結(jié)果表中一個(gè)元組。直接遇到表2中大于表1連接字段值的元組時(shí),對(duì)表2的查詢不再繼續(xù),重復(fù)上述操作,直到表1或表2中的全部元組都處理完畢為止。64連接操作的執(zhí)行過(guò)程3③索引連接(INDEX-JOIN):對(duì)表2按連接字段建立索引,對(duì)表1中的每個(gè)元組,依次根據(jù)其連接字段值查詢表2的索引,從中找到滿足條件的元組,找到后就將表1中的第一個(gè)元組與該元組拼接起來(lái),形成結(jié)果表中一個(gè)元組。65SQL中連接查詢的主要類型廣義笛卡爾積:不帶連接謂詞的連接,往往沒(méi)有實(shí)際意義,所以很少使用。條件連接查詢:帶連接謂詞的連接,格式如下:[<表名1>.]<列名1><比較運(yùn)算符>[<表名2>.]<列名2>其中比較運(yùn)算符一般有>、<、>=、<=、!=、=等幾種。[<表名1>.]<列名1>BETWEEN[<表名2>.]<列名2>AND[<表名2>.]<列名3>任何子句中引用表1和表2中同名屬性時(shí),都必須加表名前綴。引用唯一屬性名時(shí)可以加也可以省略表名前綴。返回目錄66連接查詢---例子
[例1]查詢每個(gè)學(xué)生及其選修課程的情況。SELECTStudent.*,STUCOU.*FROMStudent,STUCOUWHEREStudent.Number=STUCOU.Number
;返回目錄67③自身連接一個(gè)表與自己進(jìn)行連接,稱為表的自身連接,這時(shí)候需要給表起別名以示區(qū)別,由于所有屬性名都是同名屬性,因此必須使用別名前綴。
[例2]查詢每一門課的間接先修課(即先修課的先修課)
SELECTFIRST.Counum,SECOND.CpnoFROMCourseFIRST,CourseSECONDWHEREFIRST.Cpno=SECOND.Counum;FIRST,SECOND都是Course表的別名。返回目錄68④外連接(OuterJoin)普通連接操作只輸出滿足連接條件的元組,外連接操作以指定表為連接主體,將主體表中不滿足連接條件的元組一并輸出。
[例3]查詢每個(gè)學(xué)生及其選修課程的情況包括沒(méi)有選修課程的學(xué)生。用外連接操作實(shí)現(xiàn)。
SELECTStudent.Number
,Name,Sex,Age,Department,Counum
,GradeFROMStudent,STUCOUWHEREStudent.Number=STUCOU.Number(*);結(jié)果如下:Student.Number NameSexAgeDepartmentCounumGrade95001張小鵬男20CS19295001張小鵬男20CS28595001張小鵬男20CS38895002李敏女19IS29095002李敏女19IS38095003王敏女18MA95004張立男19IS在表名后面加外連接操作符(*)或(+)指定非主體表,非主體表有一“萬(wàn)能”的虛行,該行全部由空值組成,虛行可以和主體表中所有不滿足連接條件的元組進(jìn)行連接。由于虛行各列全部是空值,因此與虛行連接的結(jié)果中返回目錄69(2)嵌套查詢一個(gè)SELECT-FROM-WHERE語(yǔ)句稱為一個(gè)查詢塊,將一個(gè)查詢塊嵌套在另一個(gè)查詢塊的WHERE子句或HAVING短語(yǔ)的條件中的查詢稱為嵌套查詢。
SELECTName 外層查詢/父查詢
FROMStudentWHERENumberIN
(SELECTNumber內(nèi)層查詢/子查詢
FROMSTUCOUWHERECounum='2');嵌套查詢的子查詢是有限制的:子查詢不能使用ORDERBY子句。層層嵌套方式反映了SQL語(yǔ)言的結(jié)構(gòu)化,有些嵌套查詢可以用連接運(yùn)算替代。返回目錄70嵌套查詢分類嵌套查詢分為:不相關(guān)子查詢和相關(guān)子查詢。不相關(guān)子查詢即子查詢的查詢條件不依賴于父查詢;相關(guān)子查詢的子查詢的查詢條件依賴于父查詢。不相關(guān)子查詢的求解方法是是由里向外逐層處理。即每個(gè)子查詢?cè)谏弦患?jí)查詢處理之前求解,子查詢的結(jié)果用于建立其父查詢的查找條件。相關(guān)子查詢的求解方法是首先取外層查詢中表的第一個(gè)元組,根據(jù)它與內(nèi)層查詢相關(guān)的屬性值處理內(nèi)層查詢,若WHERE子句返回值為真,則取此元組放入結(jié)果表;然后再取外層表的下一個(gè)元組;重復(fù)這一過(guò)程,直至外層表全部檢查完為止。返回目錄71①帶有IN謂詞的子查詢[例4]查詢與“李敏”在同一個(gè)系學(xué)習(xí)的學(xué)生。構(gòu)造嵌套查詢:將第一步查詢嵌入到第二步查詢的條件中。
SELECTNumber,Name,DepartmentFROMStudentWHEREDepartmentIN
(SELECTDepartmentFROMStudentWHEREName=‘李敏’);結(jié)果為:NumberNameDepartment95001李敏IS95004張立IS返回目錄72①帶有IN謂詞的子查詢查詢可以用用自身連接完成。
SELECTS1.Number,S1.Name,S1.DepartmentFROMStudentS1,StudentS2WHERES1.Department=S2.DepartmentANDS2.Name='李敏';當(dāng)然父查詢和子查詢中的表均可以定義別名,進(jìn)行區(qū)分。
SELECTNumber,Name,DepartmentFROMStudentS1WHERES1.DepartmentIN
(SELECTDepartmentFROMStudentS2WHERES2.Name=‘李敏’);返回目錄73①帶有IN謂詞的子查詢[例5]查詢選修了課程名為“信息系統(tǒng)”的學(xué)生學(xué)號(hào)和姓名。
SELECTNumber,Name③最后在Student關(guān)系中
FROMStudent取出Number和NameWHERENumberIN
(SELECTNumber②然后在STUCOU關(guān)系中找出選
FROMSTUCOU修了3號(hào)課程的學(xué)生學(xué)號(hào)
WHERECounumIN
(SELECTCounum①首先在Course關(guān)系中找出“信
FROMCourse息系統(tǒng)”的課程號(hào),結(jié)果為3號(hào)
WHERECname=‘信息系統(tǒng)’));結(jié)果:Number Name---------95001張小鵬
95002李敏返回目錄74②帶有EXISTS謂詞的子查詢:1)EXISTS謂詞:2)NOTEXISTS謂詞3)不同形式的查詢間的替換4)用EXISTS/NOTEXISTS實(shí)現(xiàn)全稱量詞751)EXISTS謂詞:即存在量詞
,帶有EXISTS謂詞的子查詢不返回任何數(shù)據(jù),只產(chǎn)生邏輯真值“true”或邏輯假值“false”。若內(nèi)層查詢結(jié)果非空,則返回真值;若內(nèi)層查詢結(jié)果為空,則返回假值。由EXISTS引出的子查詢,其目標(biāo)列表達(dá)式通常都用*[例6]用嵌套查詢所有選修了1號(hào)課程的學(xué)生姓名。
SELECTNameFROMStudentWHEREEXISTS
(SELECT*FROMSTUCOU/*相關(guān)子查詢*/WHERENumber=Student.NumberANDCounum='1');思路分析:本查詢涉及Student和STUCOU關(guān)系。在Student中依次取每個(gè)元組的Number值,用此值去檢查STUCOU關(guān)系。若STUCOU中存在這樣的元組,其Number值等于此Student.Number值,并且其Counum='1',則取此Student.Name送入結(jié)果關(guān)系。返回目錄762)NOTEXISTS謂詞
[例7]查詢沒(méi)有選修1號(hào)課程的學(xué)生姓名。
SELECTNameFROMStudentWHERENOTEXISTS
(SELECT*FROMSTUCOUWHERENumber=Student.NumberANDCounum='1');返回目錄773)不同形式的查詢間的替換一些帶EXISTS或NOTEXISTS謂詞的子查詢不能被其他形式的子查詢等價(jià)替換。但是所有帶IN謂詞、比較運(yùn)算符、ANY和ALL謂詞的子查詢都能用帶EXISTS謂詞的子查詢等價(jià)替換。
[例8]查詢與“李敏”在同一個(gè)系學(xué)習(xí)的學(xué)生??梢杂脦XISTS謂詞的子查詢替換:
SELECTNumber,Name,DepartmentFROMStudentS1WHEREEXISTS
SELECT*FROMStudentS2WHERES2.Department=S1.DepartmentANDS2.Name='李敏';>返回目錄784)用EXISTS/NOTEXISTS實(shí)現(xiàn)全稱量詞1SQL語(yǔ)言中沒(méi)有全稱量詞
,可以把帶有全稱量詞的謂詞轉(zhuǎn)換為等價(jià)的帶有存在量詞的謂詞:(
x)P≡
(
x(
P))
[例9]查詢選修了全部課程的學(xué)生姓名。
SELECTNameFROMStudentWHERENOTEXISTS
(SELECT*FROMCourseWHERENOTEXISTS
(SELECT*FROMSTUCOUWHERENumber=Student.NumberANDCounum=Course.Counum);返回目錄794)用EXISTS/NOTEXISTS實(shí)現(xiàn)全稱量詞2SQL語(yǔ)言中也沒(méi)有蘊(yùn)函(Implication)邏輯運(yùn)算,同樣可以利用謂詞演算將邏輯蘊(yùn)函謂詞等價(jià)轉(zhuǎn)換為:
p
q≡
p∨q
。[例10]查詢至少選修了學(xué)生95002選修的全部課程的學(xué)生號(hào)碼。解題思路:用邏輯蘊(yùn)函表達(dá)。查詢學(xué)號(hào)為x的學(xué)生,對(duì)所有的課程y,只要95002學(xué)生選修了課程y,則x也選修了y。形式化表示:用P表示謂詞“學(xué)生95002選修了課程y”;q表示謂詞“學(xué)生x選修了課程y”; 則上述查詢?yōu)椋海?/p>
y)p
q等價(jià)變換: (
y)p
q≡
(
y(
(p
q))
≡
(
y(
(
p∨q)
≡
y(p∧
q)返回目錄804)用EXISTS/NOTEXISTS實(shí)現(xiàn)全稱量詞3變換后語(yǔ)義:不存在這樣的課程y,學(xué)生95002選修了y,而學(xué)生x沒(méi)有選。用NOTEXISTS謂詞表示:
SELECTDISTINCTNumberFROMSTUCOUSTUCOUXWHERENOTEXISTS
(SELECT*FROMSTUCOUSTUCOUYWHERESTUCOUY.Number='95002'ANDNOTEXISTS
(SELECT*FROMSTUCOUSTUCOUZWHERESTUCOUZ.Number=STUCOUX.NumberANDSTUCOUZ.Counum=STUCOUY.Counum));返回目錄81(3)集合查詢標(biāo)準(zhǔn)SQL直接支持的集合操作只有并操作(UNION);一般商用數(shù)據(jù)庫(kù)支持的集合操作種類有:并操作(UNION)交操作(INTERSECT)差操作(MINUS)。返回目錄82①并操作:將兩個(gè)以上的查詢結(jié)果合并起來(lái)。語(yǔ)法形式: <查詢塊>UNION<查詢塊>參加UNION操作的各結(jié)果表的列數(shù)必須相同;對(duì)應(yīng)項(xiàng)的數(shù)據(jù)類型也必須相同。[例11]查詢計(jì)算機(jī)科學(xué)系的學(xué)生及年齡不大于19歲的學(xué)生。
SELECT*FROMStudentWHEREDepartment='CS'UNIONSELECT*FROMStudentWHEREAge<=19;返回目錄83②交操作標(biāo)準(zhǔn)SQL中沒(méi)有提供集合交操作,但可用其他方法間接實(shí)現(xiàn)。[例12]查詢選修課程1的學(xué)生集合與選修課程2的學(xué)生集合的交集。本例實(shí)際上是查詢既選修了課程1又選修了課程2的學(xué)生。
SELECTNumberFROMSTUCOUWHERECounum='1'ANDNumberIN
(SELECTNumberFROMSTUCOUWHERECounum='2');返回目錄84(3)
差操作:標(biāo)準(zhǔn)SQL中也沒(méi)有提供集合差操作,同樣可用其他方法間接實(shí)現(xiàn)。[例13]查詢學(xué)生姓名與教師姓名的差集。本例實(shí)際上是查詢學(xué)校中未與教師同名的學(xué)生姓名。
SELECTDISTINCTNameFROMStudentWHERENameNOTIN
(SELECTTname FROMTeacher);返回目錄85①插入子查詢結(jié)果的語(yǔ)句格式1INSERTINTO<表名>[(<屬性列1>[,<屬性列2>…)]子查詢;功能是將子查詢結(jié)果插入指定表中。[例14]對(duì)每一個(gè)系,求學(xué)生的平均年齡,并把結(jié)果存入數(shù)據(jù)庫(kù)。第一步:建表;
CREATETABLEDeptage
(DepartmentCHAR(15)/*系名*/
AvgageSMALLINT);/*學(xué)生平均年齡*/第二步:插入數(shù)據(jù);
INSERTINTODeptage(Department,Avgage)
SELECTDepartment,AVG(Age)
FROMStudentGROUPBYDepartment;返回目錄86①插入子查詢結(jié)果的語(yǔ)句格式2INTO子句(與插入單條元組類似):指定要插入數(shù)據(jù)的表名及屬性列,屬性列的順序可與表定義中的順序不一致沒(méi)有指定屬性列:表示要插入的是一條完整的元組指定部分屬性列:插入的元組在其余屬性列上取空值。子查詢中的SELECT子句目標(biāo)列必須與INTO子句匹配,包括值的個(gè)數(shù)和值的類型。87②帶子查詢的修改語(yǔ)句格式與修改語(yǔ)句基本相同,只是在WHERE子句中可以嵌入SELECT子句。[例15]將計(jì)算機(jī)科學(xué)系全體學(xué)生的成績(jī)置零。
UPDATESTUCOUSETGrade=0WHERE'CS'=
(SELECTDepartmentFROMStudentWHEREStudent.Number=STUCOU.Number);返回目錄88③帶子查詢的刪除語(yǔ)句:格式與刪除語(yǔ)句基本相同,只是在WHERE子句中可以嵌入SELECT子句。[例16]刪除計(jì)算機(jī)科學(xué)系所有學(xué)生的選課記錄。
DELETEFROMSTUCOUWHERE'CS'=
(SELETEDepart
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司業(yè)務(wù)合作保密協(xié)議
- 導(dǎo)航原理(第3版)課件 第五章 導(dǎo)航測(cè)距原理
- 乳源免疫調(diào)節(jié)肽抗人卵巢癌作用及機(jī)制探究:從細(xì)胞到分子層面的解析
- 不同麻醉方式對(duì)老年髖部手術(shù)患者血流動(dòng)力學(xué)影響的比較研究
- 八年級(jí)數(shù)學(xué)整式乘除易錯(cuò)點(diǎn)試卷及答案
- 八年級(jí)數(shù)學(xué)一次函數(shù)拓展試卷及答案
- 保育師的考試題及答案
- 鍋爐巡檢試題及答案
- 淄博專技考試試題及答案
- 中醫(yī)痰飲試題及答案
- 2025年重慶市公務(wù)員錄用考試《行測(cè)》真題及答案解析(記憶版)
- T/CEMIA 023-2021半導(dǎo)體單晶硅生長(zhǎng)用石英坩堝
- 弱視診斷及治療
- 2025下半年中級(jí)軟件水平考試《軟件評(píng)測(cè)師(綜合知識(shí))》試卷真題(附解析)
- 網(wǎng)絡(luò)安全漏洞分析與防護(hù)策略
- TCHSA-024-2023-數(shù)字化無(wú)牙頜種植修復(fù)技術(shù)專家共識(shí)-1
- 《中藥材產(chǎn)業(yè)發(fā)展趨勢(shì)》課件
- 甘肅天水2025年公開招聘農(nóng)村(村務(wù))工作者筆試題帶答案分析
- 珠寶廣告合同協(xié)議
- 屋頂翻修合同協(xié)議
- 遠(yuǎn)程藥學(xué)服務(wù)管理制度
評(píng)論
0/150
提交評(píng)論