版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
通過本章的學(xué)習(xí),重點(diǎn)了解如下內(nèi)容:了解SQL語言的產(chǎn)生與發(fā)展認(rèn)識(shí)SQL語言的特點(diǎn)深入理解SQL語言所涉及的基本概念熟練使用SQL語言進(jìn)行數(shù)據(jù)庫定義、數(shù)據(jù)檢索、數(shù)據(jù)插入、數(shù)據(jù)修改、數(shù)據(jù)刪除等操作。本章主要內(nèi)容3.1SQL概述SQL(StructuredQueryLanguage,結(jié)構(gòu)化查詢語言)主要特點(diǎn)有如下幾條:(1)綜合統(tǒng)一。SQL語言綜合統(tǒng)一的特征體現(xiàn)在兩個(gè)方面:首先,SQL語言集數(shù)據(jù)定義語言DDL、數(shù)據(jù)操縱語言DML、數(shù)據(jù)控制語言DCL功能于一體,充分體現(xiàn)了關(guān)系數(shù)據(jù)語言的特點(diǎn)和優(yōu)點(diǎn)。其次,關(guān)系模型的實(shí)體及實(shí)體間的聯(lián)系均用關(guān)系表示,數(shù)據(jù)結(jié)構(gòu)的單一性使得SQL數(shù)據(jù)操作符也是統(tǒng)一的,其查詢、插入、刪除、修改都只有一種操作符。(2)高度非過程化的語言。而用SQL語言進(jìn)行數(shù)據(jù)操作,用戶只需提出“干什么”,至于“怎么干”由DBMS解決。(3)面向集合的語言。每一個(gè)SQL的操作對象是一個(gè)或多個(gè)關(guān)系,操作的結(jié)果也是一個(gè)關(guān)系。(4)以一種語法結(jié)構(gòu)提供兩種操作方式。即可獨(dú)立使用,又可嵌入到宿主語言中使用,具有自主型和宿主型兩種特點(diǎn)。(5)語言簡捷,易學(xué)易用。3.1SQL概述(序)SELECT:從一個(gè)表或多個(gè)表中檢索列和行;CREATE:按特定的表模式創(chuàng)建一個(gè)新表;DROP:刪除一張表;ALTER:在一個(gè)表被建立之后,修改表的字段設(shè)計(jì);INSERT:向一個(gè)表中增加行;UPDATE:更新表中已存在的行的某幾列的值;DELETE:從一個(gè)表中刪除行;GRANT:向數(shù)據(jù)庫中的用戶授以操作權(quán)限(如修改某個(gè)表的權(quán)限、刪除某個(gè)表的權(quán)限);REVOKE:收回以前授予給當(dāng)前數(shù)據(jù)庫中用戶的權(quán)限。3.2數(shù)據(jù)定義3.2.1創(chuàng)建數(shù)據(jù)庫命令是:
CREATEWORKAMOUNTHEMAAUTHORIZATION<創(chuàng)建者>;例如,創(chuàng)建者是李平的命令如下:CREATEWORKAMOUNTHEMAAUTHORIZATION<李平>;大部分的DBMS,如DB2、XDB、DBASEIV創(chuàng)建數(shù)據(jù)庫的命令語法格式如下:CREATEDATABASE<DATABASE_NAME>;例子:創(chuàng)建一個(gè)名為TEST1的數(shù)據(jù)庫。CREATEDATABASETEST1;3.2.2表及其創(chuàng)建(1)基本表的定義。語句格式:CREATETABLE<表名>(<列名><數(shù)據(jù)類型>[<列級(jí)完整性約束條件>][,<列名><數(shù)據(jù)類型>[<列級(jí)完整性約束條件>]]…[,<表級(jí)完整性約束條件>]);<表名>:所要定義的基本表的名字。<列名>:組成該表的各個(gè)屬性(列)。<列級(jí)完整性約束條件>:涉及相應(yīng)屬性列的完整性約束條件。<表級(jí)完整性約束條件>:涉及一個(gè)或多個(gè)屬性列的完整性約束條件?!纠?.1】建立一個(gè)“雇員”表Employee,它由職工號(hào)Number、姓名Name、性別Sex、年齡Age、所在部門Department五個(gè)屬性組成。其中職工號(hào)不能為空,值是惟一的,并且姓名取值也惟一。CREATETABLEEmployee(NumberCHAR(5)NOTNULLUNIQUE,NameCHAR(20)UNIQUE,SexCHAR(1),AgeInteger,DepartmentCHAR(15));3.2.2表及其創(chuàng)建(序)建立表時(shí),常用完整性約束主要有以下幾種:主碼約束:PRIMARYKEY。惟一性約束:UNIQUE。非空值約束:NOTNULL。默認(rèn)約束:DEFAULT(**),將該列常用的值定義為缺省值,減少數(shù)據(jù)輸入。檢查約束:CHECK(**),通過約束條件表達(dá)式設(shè)置列值應(yīng)滿足的條件。3.2.2表及其創(chuàng)建(序)(2)基本表的刪除。格式:DROPTABLE<表名>;【例3.2】刪除Employee表。DROPTABLEEmployee;(3)基本表的修改。格式:ALTERTABLE<表名>[ADD<新列名><數(shù)據(jù)類型>[完整性約束]][DROP<完整性約束名>][MODIFY<列名><數(shù)據(jù)類型>];其中:<表名>:要修改的基本表。ADD子句:增加新列和新的完整性約束條件。DROP子句:刪除指定的完整性約束條件。MODIFY子句:用于修改列名和數(shù)據(jù)類型。3.2.3約束(1)檢查約束。檢查約束是最常見的約束類型。它允許你聲明在某個(gè)字段里的數(shù)值必須滿足一個(gè)任意的表達(dá)式。用關(guān)鍵字CONSTRAINT。(2)非空約束。非空約束只是簡單地聲明一個(gè)字段必須不能是空值。(3)惟一約束。惟一約束UNIQUE保證在一個(gè)字段或者一組字段里的數(shù)據(jù)與表中其他行的數(shù)據(jù)相比是惟一的。(4)主碼約束。主碼約束只是惟一約束和非空約束的組合。(5)外碼約束。外碼約束聲明一個(gè)字段(或者一組字段)的數(shù)值必須匹配另一個(gè)表中某些行出現(xiàn)的數(shù)值。3.2.3約束(序)一個(gè)表可以包含多于一個(gè)外碼約束。有幾種選擇:1)級(jí)聯(lián)刪除(cascades):即將參照關(guān)系中的所有外碼值與被參照關(guān)系中要?jiǎng)h除元組值相對應(yīng)的元組一起刪除。2)受限刪除(restricted):即當(dāng)參照關(guān)系中沒有任何元組的外碼值與要?jiǎng)h除的被參照關(guān)系的元組的主碼值相同時(shí),系統(tǒng)才執(zhí)行刪除操作,否則拒絕此刪除操作。3)置空值刪除:即刪除被參照關(guān)系的元組,并將參照關(guān)系中的元組所有與被參照關(guān)系中被刪除元組主碼值相同的外碼值置為空值。3.2.4索引及其創(chuàng)建索引分為兩種,聚簇索引和非聚簇索引。在聚簇索引中,索引樹的葉級(jí)頁包含實(shí)際的數(shù)據(jù);記錄的索引順序與物理順序相同。在非聚簇索引中,葉級(jí)頁指向表中的記錄,記錄的物理順序與邏輯順序沒有必然關(guān)系。索引的建立原則如下:(1)索引的建立與維護(hù)由DBA和DBMS完成。索引由DBA和DBO(表的屬主)負(fù)責(zé)建立與刪除,其他用戶不得隨意建立與刪除。維護(hù)工作由DBMS自動(dòng)完成。(2)大表應(yīng)當(dāng)建索引,小表不必建索引,一個(gè)基本表,不宜建較多索引。。(3)根據(jù)查詢要求建立索引。3.2.4索引及其創(chuàng)建(序)(1)建立索引語句格式:CREATE[UNIQUE][CLUSTER]INDEX<索引名>ON<表名>(<列名>[<次序>][,<列名>[<次序>]]…);用<表名>指定要建索引的基本表名字,索引可以建立在該表的一列或多列上,各列名之間用逗號(hào)分隔;<次序>指定索引值的排列次序,升序用ASC表示,降序用DESC表示。缺省值是ASC。UNIQUE表明此索引的每一個(gè)索引值只對應(yīng)惟一的數(shù)據(jù)記錄,CLUSTER表示要建立的索引是聚簇索引。3.2.4索引及其創(chuàng)建(序)【例3.8】為雇員Employee表按職工號(hào)升序建惟一索引。CREATEUNIQUEINDEXEmpNumberONEmployee(Number);【例3.9】在Employee表的Name(姓名)列上建立一個(gè)聚簇索引,而且Employee表中的記錄將按照Name值的升序存放。CREATECLUSTERINDEXEmpNameONEmployee(Name);(2)刪除索引DROPINDEX<索引名>;【例3.10】刪除Employee表的EmpName索引。DROPINDEXEmpName;3.2.5存儲(chǔ)過程與觸發(fā)器1.存儲(chǔ)過程存儲(chǔ)過程(StoredProcedure)是一組為了完成特定功能的SQL語句集,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫中,用戶通過指定存儲(chǔ)過程的名字并給出參數(shù)(如果該存儲(chǔ)過程帶有參數(shù))來執(zhí)行它。下面是TSQL命令創(chuàng)建存儲(chǔ)過程語法格式:CREATEPROCEDUREprocedure_name[;number][{@parameterdata_type}[VARYING][=default][OUTPUT]][,...n][WITH{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}]|[FORREPLICATION]ASsql_statement[...n]3.2.5存儲(chǔ)過程與觸發(fā)器(序)2.觸發(fā)器:觸發(fā)器是一種特殊類型的存儲(chǔ)過程。它與存儲(chǔ)過程的區(qū)別:觸發(fā)器主要是通過事件進(jìn)行觸發(fā)而被執(zhí)行的,而存儲(chǔ)過程可以通過存儲(chǔ)過程名字被直接調(diào)用執(zhí)行。觸發(fā)(tigger)有時(shí)也稱為事件—條件—?jiǎng)幼饕?guī)則(event-condition-actionrules)或ECA規(guī)則,在三個(gè)方面不同于前面討論的約束類型。(1)當(dāng)數(shù)據(jù)庫編程人員所指定的某些事件發(fā)生時(shí)才對觸發(fā)程序進(jìn)行測試。允許的事件種類通常為對特定關(guān)系的插入、刪除或修改。(2)不是直接阻止事件的發(fā)生,而是由觸發(fā)程序?qū)l件進(jìn)行測試。如果條件不滿足,則什么也不做;否則,為響應(yīng)該事件就會(huì)進(jìn)行與該觸發(fā)相關(guān)的處理。(3)如果觸發(fā)條件得到滿足,就由DBMS執(zhí)行與該觸發(fā)相關(guān)的動(dòng)作。于是該動(dòng)作可能阻止事件的發(fā)生或撤消事件(如刪除插入的元組)。3.3數(shù)據(jù)操縱3.3.1數(shù)據(jù)插入語句格式:INSERTINTO<表名>[(<屬性列1>[,<屬性列2>…)]VALUES(<常量1>[,<常量2>]…)功能:將新元組插入指定表中?!纠?.13】將一個(gè)新雇員記錄(職工號(hào):2008020;姓名:陳冬;性別:男;所在部門:一車間;年齡:28歲)插入到Employee表中。INSERTINTOEmployeeVALUES('2008020','陳冬','男','一車間',28);3.3.2數(shù)據(jù)更新數(shù)據(jù)更新包括數(shù)據(jù)修改和數(shù)據(jù)刪除。(1)數(shù)據(jù)修改:語句格式:UPDATE<表名>SET<列名>=<表達(dá)式>[,<列名>=<表達(dá)式>]…[WHERE<條件>];功能:修改指定表中滿足WHERE子句條件的元組。SET子句指定修改方式、要修改的列、修改后取值。WHERE子句指定要修改的元組,缺省表示要修改表中的所有元組。3.3.2數(shù)據(jù)更新(序)(2)數(shù)據(jù)刪除。DELETEFROM<表名>[WHERE<條件>];功能:刪除指定表中滿足WHERE子句條件的元組。WHERE子句指定要?jiǎng)h除的元組,缺省表示要修改表中的所有元組。3.4數(shù)據(jù)檢索語句格式:SELECT[ALL|DISTINCT]<目標(biāo)列表達(dá)式>[,<目標(biāo)列表達(dá)式>]…FROM<表名或視圖名>[,<表名或視圖名>]…[WHERE<條件表達(dá)式>][GROUPBY<列名1>[HAVING<條件表達(dá)式>]][ORDERBY<列名2>[ASC|DESC]](1)SELECT子句:指明要檢索的結(jié)果集的目標(biāo)列。(2)FROM子句:指明從哪(幾)個(gè)表(視圖)中進(jìn)行數(shù)據(jù)檢索。(3)WHERE子句(行條件子句):通過條件表達(dá)式指明返回FROM子句中給出的列必須滿足的標(biāo)準(zhǔn)。(4)GROUPBY子句(分組子句):對滿足WHERE子句的行指明按照SELECT子句中所選擇的某個(gè)(幾個(gè))列的值對整個(gè)結(jié)果集進(jìn)行分組。(5)HAVING子句(分組條件子句):GROUPBY子句后可以帶上HAVING條件子句組表達(dá)組選擇條件,組選擇條件為帶有函數(shù)的條件表達(dá)式,它決定著整個(gè)組記錄的取舍條件。(6)ORDERBY(排序子句):對查詢返回的結(jié)果集進(jìn)行排序。3.4.1單表查詢單表查詢的查詢僅涉及一個(gè)表,又可以分成以下五種情況:選擇表中的若干列、選擇表中的若干元組、對查詢結(jié)果排序、使用集函數(shù)查詢、對查詢結(jié)果分組。(1)選擇表中的若干列?!纠?.15】查詢?nèi)w雇員的職工號(hào)與姓名。SELECTNumber,NameFROMEmployee;【例3.16】查詢?nèi)w雇員的詳細(xì)記錄。SELECT*FROMEmployee;【例3.17】查詢?nèi)w雇員的姓名及其出生年份。SELECTName,2008-AgeFROMEmployee;3.4.1單表查詢(2)選擇表中的若干元組。使用DISTINCT短語,可以消除取值重復(fù)的行。假設(shè)雇員工作量WorkAmount表中有下列數(shù)據(jù): NumberJobNumberAmount200800119220080012852008001388200800229020080023803.4.1單表查詢(序)【例3.19】查詢已經(jīng)分配了工作的雇員職工號(hào)。SELECTDISTINCTNumberFROMWorkAmount;
結(jié)果:Number-------20080012008002【例3.20】查詢所有年齡在20歲以下的雇員姓名及其年齡。SELECTName,AgeFROMEmployeeWHEREAge<20;【例3.21】查詢年齡在20~23歲(包括20歲和23歲)之間的雇員姓名、部門和年齡。SELECTName,Department,AgeFROMEmployeeWHEREAgeBETWEEN20AND23;【例3.22】查詢一車間、三車間和二車間的雇員姓名和性別。SELECTName,SexFROMEmployeeWHEREDepartmentIN('一車間','三車間','二車間');3.4.1單表查詢(序)選擇元組時(shí)還可以用[NOT]LIKE‘<匹配串>’[ESCAPE‘<換碼字符>’]進(jìn)行字符串匹配。通配符有如下兩種:_:也就是下橫線,代表任意單個(gè)字符;例:a_b表示以a開頭,以b結(jié)尾的長度為3的任意字符串。如aab、abb、avb等都滿足該匹配串。%:也就是百分號(hào),代表任意長度的字符串,也可以是長度可以為0的空串;例:a%b表示以a開頭,以b結(jié)尾的任意長度的字符串。如ab、afb、agghhb等都滿足該匹配串。ESCAPE短語:當(dāng)用戶要查詢的字符串本身就含有%或_時(shí),要使用ESCAPE'<換碼字符>'短語對通配符進(jìn)行轉(zhuǎn)義。3.4.1單表查詢(序)匹配模板為含通配符的字符串時(shí)的例子:【例3.23】查詢所有姓劉雇員的姓名、職工號(hào)和性別。SELECTName,Number,SexFROMEmployeeWHERENameLIKE'劉%';使用換碼字符將通配符轉(zhuǎn)義為普通字符的例子:【例3.24】Job表見表3-3,查詢工作名稱以"_1"結(jié)尾的工作的詳細(xì)情況。SELECT*FROMJobWHEREJnameLIKE'%\_1'ESCAPE'\';3.4.1單表查詢(序)(4)使用集函數(shù)。集函數(shù)有如下主要的五類:COUNT([DISTINCT|ALL]*)或COUNT([DISTINCT|ALL]<列名>):用于計(jì)數(shù)。SUM([DISTINCT|ALL]<列名>):用于計(jì)算總和。AVG([DISTINCT|ALL]<列名>):用于計(jì)算平均值。MAX([DISTINCT|ALL]<列名>):用于求最大值。MIN([DISTINCT|ALL]<列名>):用于求最小值。DISTINCT短語:在計(jì)算時(shí)要取消指定列中的重復(fù)值。ALL短語:不取消重復(fù)值;ALL為缺省值。3.4.1單表查詢(序)【例3.29】查詢雇員總?cè)藬?shù)。SELECTCOUNT(*)FROMEmployee;【例3.30】查詢完成了一定的工作量的雇員人數(shù)。SELECTCOUNT(DISTINCTNumber)FROMWORKAMOUNTWHERRAMOUNTISNOTNULL;【例3.31】計(jì)算干1號(hào)工作的雇員平均工作量。SELECTAVG(Amount)FROMWORKAMOUNTWHEREJobNumber='1';3.4.1單表查詢(序)(5)對查詢結(jié)果分組。使用GROUPBY子句對元組進(jìn)行分組,細(xì)化集函數(shù)的作用對象,如果未對查詢結(jié)果分組,集函數(shù)將作用于整個(gè)查詢結(jié)果,對查詢結(jié)果分組后,集函數(shù)將分別作用于每個(gè)組?!纠?.32】查詢各工作號(hào)及相應(yīng)的干該項(xiàng)工作的人數(shù)。SELECTJobNumber,COUNT(Number)FROMWORKAMOUNTGROUPBYJobNumber;結(jié)果:JobNumberCOUNT(Number)
1222343444333.4.2復(fù)雜查詢(1)連接查詢:同時(shí)涉及多個(gè)表的查詢稱為連接查詢,一般格式如下:[<表名1>.]<列名1><比較運(yùn)算符>[<表名2>.]<列名2>[<表名1>.]<列名1>BETWEEN[<表名2>.]<列名2>AND[<表名2>.]<列名3>連接操作的執(zhí)行過程有三種:1)嵌套循環(huán)法(NESTED-LOOP):首先在表1中找到第一個(gè)元組,然后從頭開始掃描表2,逐一查找滿足連接件的元組,找到后就將表1中的第一個(gè)元組與該元組拼接起來,形成結(jié)果表中的一個(gè)元組。表2全部查找完后,再找表1中的第二個(gè)元組,重復(fù)上述操作,直到表1中的全部元組都處理完畢。2)排序合并法(SORT-MERGE):常用于=連接。首先按連接屬性對表1和表2排序,對表1的第一個(gè)元組,從頭開始掃描表2,順序查找滿足連接條件的元組,找到后就將表1中的第一個(gè)元組與該元組拼接起來,形成結(jié)果表中的一個(gè)元組。重復(fù)上述操作,直到表1或表2中的全部元組都處理完畢為止。3)索引連接(INDEX-JOIN):對表2按連接字段建立索引,對表1中的每個(gè)元組,依次根據(jù)其連接字段值查詢表2的索引,從中找到滿足條件的元組,找到后就將表1中的第一個(gè)元組與該元組拼接起來,形成結(jié)果表中的一個(gè)元組。3.4.2復(fù)雜查詢(序)SQL中連接查詢主要有以下類型:1)廣義笛卡爾積2)條件連接查詢3)自身連接。4)外連接(OuterJoin)3.4.2復(fù)雜查詢(序)2)條件連接查詢:帶連接謂詞的連接,格式如下:[<表名1>.]<列名1><比較運(yùn)算符>[<表名2>.]<列名2>[<表名1>.]<列名1>BETWEEN[<表名2>.]<列名2>AND[<表名2>.]<列名3>【例3.34】查詢每個(gè)雇員及其完成工作的情況。SELECTEmployee.*,WORKAMOUNT.*FROMEmployee,WORKAMOUNTWHEREEmployee.Number=WORKAMOUNT.Number;3.4.2復(fù)雜查詢(序)3)自身連接。一個(gè)表與自己進(jìn)行連接,需要給表起別名以示區(qū)別?!纠?.35】查詢每一項(xiàng)工作的間接先修工作(即先行工作的先行工作)。Job表的內(nèi)容見表3-3,其中Cpno列就是該工作的先行工作。SELECTFIRST.JobNumber,SECOND.CpnoFROMJobFIRST,JobSECONDWHEREFIRST.Cpno=SECOND.JobNumber;FIRST、SECOND都是Job表的別名。查詢結(jié)果:1735563.4.2復(fù)雜查詢(序)4)外連接(OuterJoin):以指定表為連接主體,將主體表中不滿足連接條件的元組一并輸出。【例3.36】查詢每個(gè)雇員及其完成一定的工作量的情況,包括沒有完成一定的工作量的雇員。用外連接操作實(shí)現(xiàn)。SELECTEmployee.Number,Name,Sex,Age,Department,JobNumber,AmountFROMEmployee,WORKAMOUNTWHEREEmployee.Number=WORKAMOUNT.Number(*);結(jié)果如下:Employee.Number Name Sex Age Department JobNumber Amount 2008001 張鵬 男 20 二車間 1 922008001 張鵬 男 20 二車間 2 852008001 張鵬 男 20 二車間 3882008002 李敏 女 19 一車間 2 902008002 李敏 女 19 一車間 3 802008003 王敏 女 18 三車間2008004 周青 男 19 一車間3.4.2復(fù)雜查詢(序)(2)嵌套查詢。一個(gè)SELECT-FROM-WHERE語句稱為一個(gè)查詢塊,將一個(gè)查詢塊嵌套在另一個(gè)查詢塊的WHERE子句或HAVING短語的條件中的查詢稱為嵌套查詢。SELECTName外層查詢/父查詢FROMEmployeeWHERENumberIN(SELECTNumber內(nèi)層查詢/子查詢
FROMWORKAMOUNWHEREJobNumber='2');3.4.2復(fù)雜查詢(序)1)帶有IN謂詞的子查詢。【例3.37】查詢與“李敏”在同一個(gè)部門工作的雇員。構(gòu)造嵌套查詢:將第一步查詢嵌入到第二步查詢的條件中。SELECTNumber,Name,DepartmentFROMEmployeeWHEREDepartmentIN(SELECTDepartmentFROMEmployeeWHEREName='李敏');結(jié)果為:NumberNameDepartment2008001李敏一車間2008004周青一車間3.4.2復(fù)雜查詢(序)2)帶有EXISTS謂詞的子查詢。帶有EXISTS謂詞的子查詢可以分為以下5種情況。a.EXISTS謂詞:即存在量詞
,帶有EXISTS謂詞的子查詢不返回任何數(shù)據(jù),只產(chǎn)生邏輯真值“true”或邏輯假值“false”。若內(nèi)層查詢結(jié)果非空,則返回真值;若內(nèi)層查詢結(jié)果為空,則返回假值。由EXISTS引出的子查詢,其目標(biāo)列表達(dá)式通常都用*,因?yàn)閹XISTS的子查詢只返回真值或假值,給出列名無實(shí)際意義?!纠?.39】用嵌套查詢所有完成了1號(hào)工作的雇員姓名。
SELECTNameFROMEmployeeWHEREEXISTS(SELECT*FROMWORKAMOUNT/*相關(guān)子查詢*/WHERENumber=Employee.NumberANDJobNumber='1');3.4.2復(fù)雜查詢(序)b.NOTEXISTS謂詞?!纠?.40】查詢沒有完成1號(hào)一定的工作量的雇員姓名。
SELECTNameFROMEmployeeWHERENOTEXISTS(SELECT*FROMWORKAMOUNTWHERENumber=Employee.NumberANDJobNumber='1');c.不同形式的查詢間的替換?!纠?.41】查詢與“李敏”在同一個(gè)部門工作的雇員??梢杂脦XISTS謂詞的子查詢替換。
SELECTNumber,Name,DepartmentFROMEmployeeS1WHEREEXISTSSELECT*FROMEmployeeS2WHERES2.Department=S1.DepartmentANDS2.Name='李敏';3.4.2復(fù)雜查詢(序)(3)集合查詢。標(biāo)準(zhǔn)SQL直接支持的集合操作只有并操作(UNION)。而一般商用數(shù)據(jù)庫支持的集合操作種類有并操作(UNION)、交操作(INTERSECT)、差操作(MINUS)。1)并操作:就是將兩個(gè)以上的查詢結(jié)果合并起來。語法形式:
<查詢塊> UNION <查詢塊>【例3.42】查詢二車間的雇員及年齡不大于29歲的雇員。SELECT*FROMEmployeeWHEREDepartment='二車間'UNIONSELECT*FROMEmployeeWHEREAge<=29;3.4.2復(fù)雜查詢(序)2)交操作:標(biāo)準(zhǔn)SQL中沒有提供集合交操作,但可用其他方法間接實(shí)現(xiàn)?!纠?.43】查詢完成工作1的雇員集合與完成工作2的雇員集合的交集。本例實(shí)際上是查詢既完成了一定的工作1又完成了一定的工作2的雇員。SELECTNumberFROMWORKAMOUNTWHEREJobNumber='1'ANDNumberIN(SELECTNumberFROMWORKAMOUNTWHEREJobNumber='2');3)差操作:標(biāo)準(zhǔn)SQL中也沒有提供集合差操作,同樣可用其他方法間接實(shí)現(xiàn)?!纠?.44】查詢Employee表中職工號(hào)與WORKAMOUNT表中職工號(hào)的差集。本例實(shí)際上是查詢未分配工作的職工號(hào)。SELECTDISTINCTNumberFROMEmployeeWHERENumberNOTIN(SELECTNumberFROMWORKAMOUNT);3.4.2復(fù)雜查詢(序)(1)插入子查詢結(jié)果。語句格式:INSERTINTO<表名>[(<屬性列1>[,<屬性列2>…)]
子查詢;【例3.45】對每一個(gè)部門,求雇員平均年齡,并把結(jié)果存入數(shù)據(jù)庫。第一步:建表;CREATETABLEDeptage(DepartmentCHAR(15)/*部門名*/AvgageSmaLLINT);/*雇員平均年齡*/第二步:插入數(shù)據(jù);INSERTINTODeptage(Department,Avgage)SELECTDepartment,AVG(Age)FROMEmployeeGROUPBYDepartment;3.4.2復(fù)雜查詢(序)(2)帶子查詢的修改語句。在WHERE子句中嵌入SELECT子句?!纠?.46】將二車間全體雇員的工作量置零。UPDATEWORKAMOUNTSETAmount=0WHERE'二車間'=(SELECTDepartmentFROMEmployeeWHEREEmployee.Number=WORKAMOUNT.Number);(3)帶子查詢的刪除語句。在WHERE子句中嵌入SELECT子句。【例3.47】刪除二車間所有雇員的工作量記錄。DELETEFROMWORKAMOUNTWHERE'二車間'=(SELETEDepartmentFROMEmployeeWHEREEmployee.Number=WORKAMOUNT.Number);3.4.3視圖視圖是從一個(gè)或幾個(gè)基本表(或視圖)導(dǎo)出的表,是虛表。合理使用視圖能夠帶來許多好處,主要有以下幾方面:(1)視圖能夠簡化用戶的操作??梢酝ㄟ^定義視圖,使用戶眼中的數(shù)據(jù)庫結(jié)構(gòu)簡單、清晰,并且可以簡化用戶的數(shù)據(jù)查詢操作。(2)視圖使用戶能以多種角度看待同一數(shù)據(jù)視圖機(jī)制能使不同的用戶以不同的方式看待同一數(shù)據(jù),當(dāng)許多不同種類的用戶使用同一個(gè)數(shù)據(jù)庫時(shí),這種靈活性是非常重要的,可以根據(jù)用戶的不同,在相同的基本表上制作出不同的視圖。(3)視圖對重構(gòu)數(shù)據(jù)庫提供了一定程度的邏輯獨(dú)立性。關(guān)系數(shù)據(jù)庫中,數(shù)據(jù)庫的重構(gòu)造往往是不可避免的。重構(gòu)數(shù)據(jù)庫最常見的是將一個(gè)基本表“垂直”或“水平”地分成多個(gè)表。(4)通過視圖隱藏?cái)?shù)據(jù)有了視圖機(jī)制,就可以在設(shè)計(jì)數(shù)據(jù)庫應(yīng)用系統(tǒng)時(shí),對不同的用戶定義不同的視圖,使數(shù)據(jù)不出現(xiàn)在不應(yīng)看到這些數(shù)據(jù)的用戶視圖上,視圖顯示剪裁過的數(shù)據(jù),使數(shù)據(jù)隱藏在查詢的背后。3.4.3視圖(序)(1)建立視圖。語句格式:CREATEVIEW<視圖名>[(<列名>[,<列名>]…)]AS<子查詢>[WITHCHECKOPTION];組成視圖的屬性列名全部省略或全部指定;若全部省略,則由子查詢中SELECT目標(biāo)列中的諸字段組成;若明確指定視圖的所有列名,則可以是如下幾種情況:1)某個(gè)目標(biāo)列是集函數(shù)或列表達(dá)式。2)目標(biāo)列為*。3)多表連接時(shí)選出了幾個(gè)同名列作為視圖的字段。4)需要在視圖中為某個(gè)列啟用新的更合適的名字。3.4.3視圖(序)【例3.48】建立一車間雇員的視圖。CREATEVIEW一車間_EmployeeASSELECTNumber,Name,AgeFROMEmployeeWHEREDepartment='一車間';【例3.49】建立一車間雇員視圖,要求透過該視圖進(jìn)行的更新操作只涉及部門雇員。CREATEVIEW一車間_EmployeeASSELECTNumber,Name,AgeFROMEmployeeWHEREDepartment='一車間'WITHCHECKOPTION;3.4.3視圖(序)視圖也可以基于多個(gè)基表,看下面的例子?!纠?.50】建立一車間完成了1號(hào)工作的雇員視圖。CREATEVIEW一車間_S1(Number,Name,Amount)ASSELECTEmployee.Number,Employee.Name,WORKAMOUNT.AmountFROMEmployee,WORKAMOUNTWHEREDepartment='一車間'ANDEmployee.Number=WORKAMOUNT.NumberANDWORKAMOUNT.JobNumber='1';視圖還可以基于視圖?!纠?.51】建立一車間完成了1號(hào)工作且工作量在90分以上的雇員的視圖。CREATEVIEW一車間_S2ASSELECTNumber,Name,AmountFROM一車間_S1WHEREAmount>=90;視圖中也可以帶表達(dá)式?!纠?.52】定義一個(gè)反映雇員出生年份的視圖。CREATEVIEWBT_S(Number,Name,Sbirth)ASSELECTNumber,Name,2008-AgeFROMEmployee
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 拱棚工程施工方案(3篇)
- 致敬英烈-緬懷革命先烈主題班會(huì)課件
- 2025年河北省職教高考《職測》核心考點(diǎn)必刷必練試題庫(含答案)
- 《道路交通安全法》知識(shí)考試題庫150題(含答案)
- 2025年江西師范高等??茖W(xué)校高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 2025年江南影視藝術(shù)職業(yè)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 專題03 冠詞(第02期) 帶解析
- 2025科學(xué)儀器行業(yè)市場動(dòng)態(tài)與技術(shù)發(fā)展趨勢
- 無人駕駛與機(jī)器人行業(yè)的關(guān)聯(lián)與前景
- 消防設(shè)計(jì)工程合同模板
- 中央2025年公安部部分直屬事業(yè)單位招聘84人筆試歷年參考題庫附帶答案詳解
- 三年級(jí)數(shù)學(xué)(上)計(jì)算題專項(xiàng)練習(xí)附答案
- 中醫(yī)診療方案腎病科
- 2025年安慶港華燃?xì)庀薰菊衅腹ぷ魅藛T14人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 人教版(2025新版)七年級(jí)下冊數(shù)學(xué)第七章 相交線與平行線 單元測試卷(含答案)
- 玩具有害物質(zhì)風(fēng)險(xiǎn)評估-洞察分析
- 春節(jié)節(jié)后復(fù)工全員安全意識(shí)提升及安全知識(shí)培訓(xùn)
- 2024年河南省公務(wù)員錄用考試《行測》真題及答案解析
- 2023年上海鐵路局集團(tuán)有限公司招聘筆試真題
- 信永中和在線測評85題
評論
0/150
提交評論