第5章 關(guān)系數(shù)據(jù)庫標準語言SQL(新)_第1頁
第5章 關(guān)系數(shù)據(jù)庫標準語言SQL(新)_第2頁
第5章 關(guān)系數(shù)據(jù)庫標準語言SQL(新)_第3頁
第5章 關(guān)系數(shù)據(jù)庫標準語言SQL(新)_第4頁
第5章 關(guān)系數(shù)據(jù)庫標準語言SQL(新)_第5頁
已閱讀5頁,還剩179頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章關(guān)系數(shù)據(jù)庫標準語言SQL5.1SQL的功能及特點SQL是一種介于關(guān)系代數(shù)與關(guān)系演算之間的結(jié)構(gòu)化查詢語言,其功能并不僅僅是查詢。SQL是一個通用的、功能極強的關(guān)系數(shù)據(jù)庫語言。SQL(StructuredQueryLanguage)結(jié)構(gòu)化查詢語言,1974年Boyce和Chamberlin提出,首先在IBM

公司的關(guān)系數(shù)據(jù)庫系統(tǒng)SystemR上實現(xiàn)。特點:功能豐富、使用方便、靈活、語言簡潔易學。1986年,ANSI數(shù)據(jù)庫委員會X3H2批準了SQL作為數(shù)據(jù)庫語言的美國標準,ISO隨后也提出了同樣的決定。應用系統(tǒng)范圍廣,統(tǒng)一標準。5.1.1SQL發(fā)展過程1976年由ChamberlinDD等人描述的SQL的最早版本SEQUEL21986年ANSI就制訂了美國國家標準SQL-861989年ANSI制訂官方標準SQL-891992年制訂SQL標準SQL-921999年制訂SQL標準SQL-992003年制訂SQL最新版本SQL20035.1.2SQL的特點SQL語言之所以能夠為用戶和業(yè)界所接受,并成為國際標準,是因為它是一個綜合的、功能極強同時又簡捷易學的語言。SQL語言集數(shù)據(jù)查詢、數(shù)據(jù)操縱、數(shù)據(jù)定義和數(shù)據(jù)控制功能于一體,主要特點包括:

SQL的特點(續(xù))一、綜合統(tǒng)一SQL語言集數(shù)據(jù)定義語言、數(shù)據(jù)操縱語言、數(shù)據(jù)控制語言的功能于一體,語言風格統(tǒng)一,可以獨立完成數(shù)據(jù)庫生命周期中的全部活動,為數(shù)據(jù)庫應用系統(tǒng)提供了良好的環(huán)境。用戶在數(shù)據(jù)庫系統(tǒng)投入運行后,還可以根據(jù)需要隨時地逐步地修改模式,且并不影響數(shù)據(jù)庫的運行,從而使系統(tǒng)具有良好的可擴展性。在關(guān)系模式中實體和實體的聯(lián)系均用關(guān)系表示,這種數(shù)據(jù)結(jié)構(gòu)的單一性帶來了數(shù)據(jù)操作符的統(tǒng)一,從而克服了非關(guān)系系統(tǒng)由于信息表示方式的多樣性帶來的操作復雜性。SQL的特點(續(xù))二、高度非過程化SQL語言高度非過程化,只要提出“做什么”,而無須指明“怎么做”,因此無需了解存取路徑,存取路徑的選擇以及SQL語句的操作過程由系統(tǒng)自動完成。大大減輕了用戶的負擔,也有利于提高數(shù)據(jù)獨立性。Dowhat----Howtodo三、面向集合的操作方式

每一個SQL的操作對象是一個或多個關(guān)系,操作的結(jié)果也是一個關(guān)系。SQL的特點(續(xù))四、以同一種語法結(jié)構(gòu)提供兩種使用方式SQL語言既是自主式語言,又是嵌入式語言自主式SQL:一般DBMS都提供聯(lián)機交互工具,用戶可直接鍵入SQL命令對數(shù)據(jù)庫進行操作由DBMS來進行解釋嵌入式SQL:能將SQL語句嵌入到高級語言(宿主語言),使應用程序充分利用SQL訪問數(shù)據(jù)庫的能力、宿主語言的過程處理能力,一般需要預編譯,將嵌入的SQL語句轉(zhuǎn)化為宿主語言編譯器能處理的語句

SQL的語法結(jié)構(gòu)基本一致SQL的特點(續(xù))SQL功能操作符數(shù)據(jù)查詢SELECT數(shù)據(jù)定義CREATE,ALTER,DROP數(shù)據(jù)操縱INSERT,UPDATE,DELETE數(shù)據(jù)控制GRANT,REVOKE五、語言簡捷、易學易用

SQL語言功能極強,但語言十分簡捷,完成核心功能只用了9個動詞。5.1.3SQL的基本概念SQL語言支持關(guān)系數(shù)據(jù)庫三級模式結(jié)構(gòu)。其中外模式對應于視圖和部分基本表,模式對應于基本表,內(nèi)模式對應于存儲文件。SQL的基本概念(續(xù))SQL視圖2視圖1基本表2基本表1基本表3基本表4存儲文件2存儲文件1外模式模式內(nèi)模式SQL支持關(guān)系數(shù)據(jù)庫三級模式結(jié)構(gòu)SQL的基本概念基本表:獨立存儲于數(shù)據(jù)庫中的數(shù)據(jù)表(關(guān)系),可有若干個索引。索引:對表中的屬性組進行邏輯上排序,可以加快檢索速度。視圖:由基表導出的虛表,數(shù)據(jù)庫中只保存視圖的定義。

存儲文件:以OS文件的形式保存數(shù)據(jù)庫的表、視圖、索引等數(shù)據(jù)庫對象。學生-選課數(shù)據(jù)庫學生-課程模式STUDENT_C:

學生表:Student(Sno,Sname,Ssex,Sage,Sdept)

課程表:Course(Cno,Cname,Cpno,Ccredit)

學生選課表:SC(Sno,Cno,Grade)Student表學號Sno姓名Sname性別

Ssex年齡

Sage所在系

Sdept200215121200215122200215123200515125李勇劉晨王敏張立男女女男20191819CSCSMAISCourse表課程號Cno課程名Cname先行課Cpno學分Ccredit1234567數(shù)據(jù)庫數(shù)學信息系統(tǒng)操作系統(tǒng)數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)處理PASCAL語言516764243424SC表學號Sno課程號

Cno成績

Grade2002151212002151212002151212002151222002151221232392858890805.2數(shù)據(jù)定義語句SQL語言使用數(shù)據(jù)定義語言(DATADEFINITIONLANGUAGE,簡稱DDL)實現(xiàn)其數(shù)據(jù)定義功能。操作對象操作對象創(chuàng)建刪除修改表CreatetableDroptableAltertable視圖CreateviewDropview索引CreateindexDropindex數(shù)據(jù)庫CreatedatabaseDropdatabaseAlterdatabaseSQL語句格式的約定符號語句格式中,<>中的內(nèi)容是必須的,是用戶自定義語義;[]為任選項{}或分隔符|表示必選項,即必選其中之一項[,…N]表示前面得項可以重復多次5.2.1基本表的定義與維護一、定義基本表

CREATETABLE<表名>

(<列名><數(shù)據(jù)類型>[列級完整性約束] [,<列名><數(shù)據(jù)類型>[列級完整性約束]]…[,<表級完整性約束>]);注意:

(1)<表名>是合法標識符,最多可有128個字符,如S,SC,C,不允許重名。(2)列名(字母開頭,可含字母、數(shù)字、#、$、_<=128字符)

。同一表中不許有重名列;(3)數(shù)據(jù)類型:見表5-3;(4)字段的長度、精度和小數(shù)位數(shù);數(shù)據(jù)類型SQL中域的概念用數(shù)據(jù)類型來實現(xiàn)關(guān)于數(shù)據(jù)類型:具體依DBMS而定(P118)基本數(shù)據(jù):Integer,SmallInt

Numeric(p,n),floatChar(n),varchar(n)Date,time,timestamp等字段數(shù)據(jù)類型當用SQL語句定義表時,需要為表中的每一個字段設置一個數(shù)據(jù)類型,用來指定字段所存放的數(shù)據(jù)是整數(shù)、字符串、貨幣或是其它類型的數(shù)據(jù)。SQLSERVER的數(shù)據(jù)類型有很多種,分為以下9類:1.整數(shù)數(shù)據(jù)類型:依整數(shù)數(shù)值的范圍大小,有BIT,INT,SMALLINT,TINYINT四種。2.精確數(shù)值類型:用來定義可帶小數(shù)部分的數(shù)字,有NUMERIC和DECIMAL兩種。十進制數(shù),共P位,其中小數(shù)點后S位。0<=S<=P,S=0時可省略。如:123.0、8000.563.近似浮點數(shù)值數(shù)據(jù)類型:當數(shù)值的位數(shù)太多時,可用此數(shù)據(jù)類型來取其近似值,用FLOAT和REAL兩種。如:1.23E+104.日期時間數(shù)據(jù)類型:用來表示日期與時間,依時間范圍與精確程度可分為DATETIME與SMALLDATETIME兩種。如:1998-06-0815:30:005.字符串數(shù)據(jù)類型:用來表示字符串的字段。包括:CHAR,VARCHAR,TEXT三種,如:“數(shù)據(jù)庫”6.標記數(shù)據(jù)類型:有UNIQUEIDENTIFIER,TIMESTAMP兩種,此數(shù)據(jù)類型通常系統(tǒng)自動產(chǎn)生,而不是用戶輸入的,TIMESTAMP記錄數(shù)據(jù)更新的時間戳印,而UNIQUEIDENTIFIER用來識別每一筆數(shù)據(jù)的唯一性。字段數(shù)據(jù)類型各種數(shù)據(jù)類型的有關(guān)規(guī)定如下表:

數(shù)據(jù)類型數(shù)據(jù)內(nèi)容與范圍占用的字節(jié)BIT0,1,NULL實際使用1BIT,但會占用1BYTE,若一個數(shù)據(jù)中有數(shù)個BIT字段,則可共占1個BYTEINT-2^31到2^31-14BYTESSMALLINT-2^15至2^15-12BYTESTINYINT0至2551BYTESNUMERIC-10^38-1至10^38-11-9位數(shù)使用5BYTES10-19位數(shù)使用9BYTES20-28位數(shù)使用13BYTES29-38位數(shù)使用17BYTESDECIMAL-10^38-1至10^38-15-17BYTES因長度而異,與NUMERIC相同F(xiàn)LOAT-1.79E+306至1.79E+308,最多可表示53位數(shù)8BYTESREAL-3.40E+38到3.40E+38,最多可表示24位數(shù)4BYTES

各種數(shù)據(jù)類型的有關(guān)規(guī)定如下表:

DATETIME1753/1/1至9999/12/318BYTESSMALLDATETIME1900/1/1至2079/6/64BYTESCHAR1-8000個字符1個字符占1B,尾端空白字符保留VARCHAR1-8000個字符1個字符占1B,尾端空白字符刪除。TEXT2^31-1個字符1個字符占2B,最大可存儲2GB

各種數(shù)據(jù)類型的有關(guān)規(guī)定如下表:

①字段的長度:指字段所能容納的最大數(shù)據(jù)量,但對不同的數(shù)據(jù)類型來說,長度對字段的意義可能有些不同。對字符串數(shù)據(jù)類型而言,長度代表字段所能容納的字符的數(shù)目,因此它會限制用戶所能輸入的文本長度。對數(shù)值類的數(shù)據(jù)類型而言,長度則代表字段使用多少個字節(jié)來存放數(shù)字。②精度和小數(shù)位數(shù)精度是指數(shù)中數(shù)字的位數(shù),包括小數(shù)點左側(cè)的整數(shù)部分和小數(shù)點右側(cè)的小數(shù)部分;小數(shù)位數(shù)則是指數(shù)字小數(shù)點右側(cè)的位數(shù)。例如:數(shù)字12345.678,其精度為8,小數(shù)位數(shù)為3;所以只有數(shù)值類的數(shù)據(jù)類型才有必要指定精度和小數(shù)位數(shù)。字段的長度、精度和小數(shù)位數(shù)經(jīng)常以如下所示的格式來表示數(shù)據(jù)類型以及它所采用的長度、精度和小數(shù)位數(shù),其中的N代表長度,P代表精度,S表示小數(shù)位數(shù)。BINARY(N)--------BINARY(10)CHAR(N)--------CHAR(20)NUMERIC(P,[S])-------NUMERIC(8,3)但有的數(shù)據(jù)類型的精度與小數(shù)位數(shù)是固定的,對采用此類數(shù)據(jù)類型的字段而言,不需設置精度與小數(shù)位數(shù),如:如果某字段采用INT數(shù)據(jù)類型,其長度固定是4,精度固定是10,小數(shù)位數(shù)則固定是0,這表示字段將能存放10位數(shù)沒有小數(shù)點的整數(shù)。存儲大小則是4個字節(jié)。字段的長度、精度和小數(shù)位數(shù)完整性約束條件列約束:Primarykey,Unique,Notnull,Foreignkey,defaultvalue數(shù)據(jù)字典存儲信息包括:

1.關(guān)系模式:關(guān)系名、屬性名稱及類型、鍵;

2.視圖描述;

5.存儲結(jié)構(gòu)和存取方法;

4.完整性約束;

5.安全性約束:用戶操作權(quán)限。每個DBMS都包含一個稱為數(shù)據(jù)字典(DD)的小型數(shù)據(jù)庫完整性約束條件當用戶操作表中數(shù)據(jù)時,由DBMS自動檢查該操作是否違背了這些完整性約束條件。如果完整性約束條件涉及到該表的多個屬性列,則必須定義在表級上,否則既可以定義在列級上也可以在表級上。Sno例1:建立一個學生表Student,它由學號Sno、姓名Sname、性別Ssex、年齡Sage、所在系Sdept五個屬性組成。其中學號為主碼并且姓名取值唯一。

CreatetableStudent(Snochar(4)

PrimaryKey,Snamechar(20)unique,Ssexchar(1),Sageint,Sdeptchar(15))StudentSnameSexSageSdept主碼在SQLSERVER中,對于基本表的約束分為列約束和表約束。列約束是對某一個特定列的約束,包含在列定義中,直接跟在該列的其他定義之后,用空格分隔,不必指定列名;表約束與列定義相互獨立,不包括在列定義中,通常用于對多個列一起進行約束,定義表約束時必須指出要約束的那些列的名稱。完整性約束的基本語法格式為:

[CONSTRAINT<約束名>]<約束類型>約束名:約束不指定名稱時,系統(tǒng)會給定一個名稱。定義完整性約束USESTUDENT_CCREATETABLEStudent(SNOCHAR(10)NOTNULL,SNVARCHAR(20),AGEINT,SEXCHAR(2)DEFAULT'男',DEPTVARCHAR(20));

USESTUDENT_CCREATETABLEStudent(SNOCHAR(5),SNCHAR(8),SEXCHAR(2),CONSTRAINTS_UNIQUNIQUE(SN,SEX));

定義完整性約束(1)NULL/NOTNULL是否允許該字段的值為NULL。NULL值不是0也不是空白,更不是填入字符串“NULL”,而是表示“不知道”、“不確定”或“沒有數(shù)據(jù)”的意思。當某一字段的值一定要輸入才有意義的時候,則可以設置為NOTNULL。如主鍵列就不允許出現(xiàn)空值,否則就失去了唯一標識一條記錄的作用只能用于定義列約束,其語法格式如下:

[CONSTRAINT<約束名>][NULL|NOTNULL]

約束類型(SQLSERVER中)(2)UNIQUE約束UNIQUE約束用于指明基本表在某一列或多個列的組合上的取值必須唯一。定義了UNIQUE約束的那些列稱為唯一鍵,系統(tǒng)自動為唯一鍵建立唯一索引,從而保證了唯一鍵的唯一性。唯一鍵允許為空,但系統(tǒng)為保證其唯一性,最多只可以出現(xiàn)一個NULL值。UNIQUE既可用于列約束,也可用于表約束。約束類型(SQLSERVER中)UNIQUE用于定義列約束時,其語法格式如下:

[CONSTRAINT<約束名>]UNIQUEUNIQUE用于定義表約束時,其語法格式如下:

[CONSTRAINT<約束名>]UNIQUE(<列名>[{,<列名>}])約束類型(SQLSERVER中)例建立一個Student表,定義SN+SEX為唯一鍵。USESTUDENT_CCREATETABLEStudent(SNOCHAR(5),SNCHAR(8),SEXCHAR(2),CONSTRAINTS_UNIQUNIQUE(SN,SEX));系統(tǒng)為SN+SEX建立唯一索引,確保同一性別的學生沒有重名。(3)PRIMARYKEY約束PRIMARYKEY約束用于定義基本表的主鍵,起唯一標識作用,其值不能為NULL,也不能重復,以此來保證實體的完整性。

PRIMARYKEY與UNIQUE約束類似,通過建立唯一索引來保證基本表在主鍵列取值的唯一性,但它們之間存在著很大的區(qū)別:①在一個基本表中只能定義一個PRIMARYKEY約束,但可定義多個UNIQUE約束;②對于指定為PRIMARYKEY的一個列或多個列的組合,其中任何一個列都不能出現(xiàn)空值,而對于UNIQUE所約束的唯一鍵,則允許為空。注意:不能為同一個列或一組列既定義UNIQUE約束,又定義PRIMARYKEY約束。PRIMARYKEY既可用于列約束,也可用于表約束。約束類型(SQLSERVER中)PRIMARYKEY用于定義列約束時,其語法格式如下:

CONSTRAINT<約束名>PRIMARYKEYPRIMARYKEY用于定義表約束時,即將某些列的組合定義為主鍵,其語法格式如下:

[CONSTRAINT<約束名>]PRIMARYKEY(<列名>[{<列名>}])約束類型(SQLSERVER中)USESTUDENT_CCREATETABLESC(SNOCHAR(5)NOTNULL,CNOCHAR(5)NOTNULL,GRADENUMERIC(3),CONSTRAINTSC_PRIMPRIMARYKEY(SNO,CNO));例:建立一個SC表,定義SNO+CNO為SC的主鍵(4)FOREIGNKEY約束FOREIGNKEY約束指定某一個列或一組列作為外碼,其中,包含外碼的表稱為從表,包含外部鍵所引用的主鍵或唯一鍵的表稱主表。系統(tǒng)保證從表在外碼上的取值要么是主表中某一個主碼值,要么取空值。以此保證兩個表之間的連接,確保了實體的參照完整性。FOREIGNKEY既可用于列約束,也可用于表約束,其語法格式為:

[CONSTRAINT<約束名>]FOREIGNKEY REFERENCES<主表名>(<列名>[{<列名>}])約束類型(SQLSERVER中)USESTUDENTCREATETABLESC(SNOCHAR(5)NOTNULLCONSTRAINTS_FOREFOREIGNKEYREFERENCESS(SNO),CNOCHAR(5)NOTNULLCONSTRAINTC_FOREFOREIGNKEYREFERENCESC(CNO),GRADENUMERIC(3),CONSTRAINTS_C_PRIMPRIMARYKEY(SNO,CNO));例:建立一個SC表,定義SNO,CNO為SC的外碼。USESTUDENT_CCreatetable

Course(cnochar(4),

cnamechar(20),

cpnochar(1),

ccreditchar(1),

PrimaryKey(cno),FOREIGNKEY(Cpno)REFERENCESCourse(Cno))例:

課程表:Course(Cno,Cname,Cpno,Ccredit)先修課

Cpno是外碼被參照表是Course被參照列是Cno(5)CHECK約束CHECK約束用來檢查字段值所允許的范圍,如,一個字段只能輸入整數(shù),而且限定在0-100的整數(shù),以此來保證域的完整性。CHECK既可用于列約束,也可用于表約束,其語法格式為:

[CONSTRAINT<約束名>]CHECK(<條件>)約束類型(SQLSERVER中)USESTUDENT_CCREATETABLEStudent(SNOCHAR(6)CONSTRAINTS_PRIMPRIMARYKEY,SNCHAR(8)CONSTRAINTSN_CONSNOTNULL,AGENUMERIC(2)CONSTRAINTAGE_CONSNOTNULL,CONSTRAINTAGE_CHK

CHECK(AGEBETWEEN15AND50),SEXCHAR(2)DEFAULT'男',DEPTCHAR(10)CONSTRAINTDEPT_CONSNOTNULL);例:建立包含完整性定義的學生表USESTUDENT_CCREATETABLESC (Sno

CHAR(4),

Cno

CHAR(4),

GRADESAMLLINT,

PRIMARYKEY(Sno,Cno),

FOREIGNKEY(Sno) REFERENCES

Student(Sno),

FOREIGNKEY(Cno)

REFERENCES

Course(Cno) )學生選課表:SC(Sno,Cno,Grade)修改基本表SQL語言用ALTERTABLE語句修改基本表:

ALTERTABLE<表名>[ADD<新列名><數(shù)據(jù)類型>[完整性約束]][DROP<完整性約束名>][ALTERCOLUMN<列名><數(shù)據(jù)類型>];

ADD子句用于增加新列和新的完整性約束條件

DROP子句用于刪除制定的完整性約束條件

ALTERCOLUMN子句用于修改原有的列定義,包括修改列名和數(shù)據(jù)類型。修改基本表(續(xù))(1)ADD方式使用ADD方式可以向表中增加列定義和表約束語法格式:ALTERTABLE<表名>ADD(<列定義>|<約束條件>[{,(<列定義>|<約束條件>}])例:在Student表中增加一個班號列ALTERTABLEStudentADDCLASSNOCHAR(6);不論基本表中原來是否己有數(shù)據(jù),新增加的列一律為空值。SnoSnameSsexSageSdeptStudentALTERTABLEStudentADDScomeDATEScome例2:向Student表增加“入學時間”列,其數(shù)據(jù)類型為日期型。修改基本表(續(xù))修改基本表(續(xù))(2)ALTERCOLUMN方式該方式能對基本表中已有的列定義進行修改語法格式:ALTERTABLE<表名>ALTERCOLUMN(<列名><數(shù)據(jù)類型[NULL|NOTNULL][{,(<列名><數(shù)據(jù)類型[NULL|NOTNULL]}])例:把Student表中Sno列加寬到10為字符寬度ALTERTABLEStudentALTERCOLUMN

SnoCHAR(10);修改基本表(續(xù))(3)DROP方式該方式能刪除基本表中已有的完整性約束定義語法格式:ALTERTABLE<表名>DROPCONSTRAINT<約束名>|PRMARYKEY|UNIQUE(<列名>[{,<列名>}])例:刪除Student表中的主碼ALTERTABLEStudentDROPPRIMARYKEY新標準中可以直接刪除屬性列ALTERTABLESDROPScome刪除基本表DROPTABLE<表名>[RESTRICT|CASCADE];RESTRICT:刪除表是有限制的。欲刪除的基本表不能被其他表的約束所引用如果存在依賴該表的對象,則此表不能被刪除CASCADE:刪除該表沒有限制。在刪除基本表的同時,相關(guān)的依賴對象一起刪除刪除基本表(續(xù))

[例]刪除Student表

DROPTABLEStudentCASCADE;基本表定義被刪除,數(shù)據(jù)被刪除表上建立的索引、視圖、觸發(fā)器等一般也將被刪除5.2.2索引的定義與維護對于一個基本表,根據(jù)需要建立若干個索引建立索引的兩個主要目的:

加快查詢速度保證行的唯一性加快連接速度索引的定義與維護一、建立索引create[unique/distinct][cluster]index

索引名on

表名(列名[asc/desc][,列名asc/desc]]…)

unique(distinct):唯一性索引,不允許表中不同的行在索引列上取相同值。若已有相同值存在,則系統(tǒng)給出相關(guān)信息,不建此索引。系統(tǒng)并拒絕違背唯一性的插入、更新

cluster:聚集索引,表中元組按索引項的值排序并物理地聚集在一起。一個基本表上只能建一個聚集索引

asc/desc:索引表中索引值的排序次序,缺省為asc索引的定義與維護用戶可以在最常查詢的列上建立聚簇索引以提高查詢效率。顯然在一個基本表上最多只能建立一個聚簇索引。建立聚簇索引后,更新索引列數(shù)據(jù)時,往往導致表中記錄的物理順序的變更,代價較大,因此對于經(jīng)常更新的列不宜建立聚簇索引。例:

CREATECLUSTERINDEXStuSnameONStudent(sname)在Student表的Sname(姓名)列上建立一個聚簇索引,而且Student表中的記錄將按照Sname值的升序存放。注:在一個基本表上最多只能建立一個聚簇索引例子索引的定義與維護2.刪除索引刪除索引使用DROPINDEX語句,其一般格式為:DROPINDEX<索引名>例7刪除Student表的Stusname索引。DROPINDEXStusname刪除索引時,系統(tǒng)會同時從數(shù)據(jù)字典中刪去有關(guān)該索引的描述。5.3數(shù)據(jù)查詢數(shù)據(jù)庫查詢是數(shù)據(jù)庫的核心操作。Select語句格式:Select<輸出屬性列表>From<一個或多個數(shù)據(jù)庫表或視圖>[Where<查詢條件>][GroupBy<分組條件>][OrderBy<結(jié)果排序>]查詢分類單表查詢連接查詢嵌套查詢集合查詢5.3.1查詢——單表查詢一、選擇表中的列,投影運算二、選擇表中的若干元組三、查詢結(jié)果排序四、使用集函數(shù)五、對查詢結(jié)果分組單表查詢(續(xù))一、選擇表中若干列1.查詢指定列 在很多情況下,用戶只對表中的一部分屬性列感興趣,這時可以通過在SELECT子句的<目標列表達式>中指定要查詢的列。單表查詢(續(xù))

例:查詢?nèi)w學生的學號與姓名

SELECTSno,SnameFROMStudent;

<目標列表達式>中各個列的先后順序可以與表中的順序不一致。用戶可以根據(jù)應用的需要改變列的顯示順序。單表查詢(續(xù))2.查詢?nèi)苛?將表中的所有屬性列都選出來,可以有兩種方法。一種是在SELECT關(guān)鍵字后列出所有列名。如果列的顯示順序與在基本表中的順序相同,也可以將<目標列表達式>指定為*。 例:查詢?nèi)w學生的詳細記錄

SELECT* FROMStudent;單表查詢(續(xù))3.查詢經(jīng)過計算的值

SELECT子句的<目標列表達式>不僅可以是表中的屬性列,也可以是表達式。 例:查詢?nèi)w學生的姓名及出生年份

SELECTSname,2012-Sage FROMStudent;單表查詢(續(xù))

<目標列表達式>不僅可以是算術(shù)表達式,還可以是字符串常量、函數(shù)等。 例:查詢?nèi)w學生的姓名、出生年份和所在系,要求用小寫字母表示系名。

SELECTSname,’YearofBirth’,2004-Sage,LOWER(Sdept) FROMStudent;

注意,用字符串常量做目標列表達式時,必須用單引號把字符串引起來,表示一個字符串常量。

單表查詢(續(xù)) 用戶也可以通過指定別名來改變查詢結(jié)果的列標題,這對于含算數(shù)表達式、常量、函數(shù)名的目標列表達式尤為有用。

SELECTSnameNAME,’YearofBirth’BIRTH,2004-SageBIRTHDAY,LOWER(Sdept)DEPT FROMStudent;單表查詢(續(xù))二、選擇表中的若干元組1.消除取值重復的行 投影到某些指定的列上會產(chǎn)生重復數(shù)據(jù)。 如果查詢結(jié)果包含了許多重復行,要去掉結(jié)果中的重復行,必須使用DISTINCT短語。如果不指定DISTINCT短語則缺省為ALL。

SELECTDISTINCTSno FROMSC;單表查詢(續(xù))2.查詢滿足條件的元組 查詢滿足條件的元組可以通過WHERE子句實現(xiàn)。WHERE子句常用的查詢條件如下:單表查詢(續(xù))查詢條件謂詞比較=,>,<等確定范圍BETWEENAND,NOTBETWEENAND確定集合IN,NOTIN字符匹配LIKE,NOTLIKE空值ISNULL,ISNOTNULL多重條件AND,OR,NOT單表查詢(續(xù))比較大小可以用比較運算符來進行數(shù)據(jù)大小的比較。邏輯運算符NOT也可以與比較符運算符一起使用。例:查詢計算機系全體學生的名單SELECTSnameFROMStudentWHERESdept=‘CS’;單表查詢(續(xù))確定范圍 謂詞BETWEENAND和NOTBETWEENAND可以用來查找屬性值在(或不在)指定范圍的元組。 例:查詢年齡在20-23歲之間的學生姓名、系別和年齡。

SELECTSname,Sdept,Sage FROMStudent WHERESageBETWEEN20AND23注:區(qū)間端點?單表查詢(續(xù))確定集合謂詞IN可以用來查找屬性值屬于指定集合的元組。例:顯示信息系、數(shù)學系和計算機科學系學生的姓名和性別SELECTSname,SsexFROMStudentWHERESdeptIN(‘IS’,’MA’,’CS’);單表查詢(續(xù))例:查詢至少選修了1號和3號課程學生的學號SELECTSNOFROMSCWHERECNO=’1’AND SNOIN(SELECTSNO FROMSC WHERECNO=’3’);單表查詢(續(xù))字符匹配 謂詞LIKE可以用來進行字符串的匹配。其一般語法格式如下:

[NOT]LIKE‘<匹配串>’[ESCAPE‘<換碼字符>’]

其含義是查找指定的屬性列值與<匹配串>相匹配的元組。<匹配串>可以是一個完整的字符串,也可以含有通配符%和_。其中:

%(百分號)代表任意長度的字符串。

_(下橫線)代表任意單個字符。

單表查詢(續(xù))

例:查詢所有姓劉的學生的姓名、學號和性別

SELECTSname,Sno,Ssex FROMStudent WHERESnameLIKE‘劉%’;單表查詢(續(xù))例:查詢姓“歐陽”且全名為3個漢字的學生的姓名。SELECTSnameFROMStudentWHERESnameLIKE‘歐陽__’;注意:一個漢字要占兩個字符的位置單表查詢(續(xù))

如果用戶要查詢的字符串本身就包含有%或_,這時就要使用ESCAPE‘<換碼字符>’短語對通配符進行轉(zhuǎn)義了。

例:查詢DB_Design課程的課程號和學分。

SELECTCno,Ccredit FROMCourse WHERECnameLIKE‘DB\_Design’ESCAPE‘\’;

單表查詢(續(xù))涉及空值的查詢使用ISNULL和NOTISNULL謂詞。例:查詢?nèi)鄙俪煽兊膶W生的學號和相應的課程號。SELECTSno,CnoFROMSCWHEREGradeISNULL;IS不能用等號代替。單表查詢(續(xù))多重條件查詢 邏輯運算符AND和OR可以用來連接多個查詢條件。AND的優(yōu)先級高于OR。 例:查詢計算機系年齡在20歲以下的學生的姓名。SELECTSnameFROMStudentWHERESdept=‘CS’ANDSage<20;IN謂詞可以寫作多個OR運算符的縮寫。SELECTSname,SsexFROMStudentWHERESdeptIN(‘IS’,’MA’,’CS’);SELECTSname,SsexFROMStudentWHERESdept=‘IS’orSdept=‘MA’orSdept=‘CS’;等價單表查詢(續(xù))單表查詢(續(xù))三、對查詢結(jié)果排序(ORDERBY子句)

用戶可用ORDERBY子句對查詢結(jié)果按照一個或多個屬性列進行排序,缺省為升序。 例:查詢選修了3號課程的學生的學號及其成績,查詢結(jié)果按分數(shù)的降序排列。

SELECTSno,Grade FROMSC WHERECno=‘3’ ORDERBYGradeDESC;單表查詢(續(xù)) 對于空值,若按升序排,含空值的元組將最后顯示。若按降序排,空值的元組將最先顯示。多列排序時,排序列的順序不一樣,排序優(yōu)先級也不同,前面的優(yōu)先級高。

例:

SELECT* FROMStudent ORDERBYSdept,SageDESC;單表查詢(續(xù))學號姓名系別年齡0003王莉信息220007王蒙信息210009李鐵信息201012張敏計算機221016李明計算機212013趙強數(shù)學212011孫震數(shù)學20單表查詢(續(xù))四、使用聚集函數(shù)

SQL提供的集函數(shù)主要有:

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

COUNT([DISTINCT|ALL]<列名>)統(tǒng)計一列中值個數(shù)

SUM([DISTINCT|ALL]<列名>)計算一列值的總和

AVG([DISTINCT|ALL]<列名>)計算一列值的平均值

MAX([DISTINCT|ALL]<列名>)求一列值中最大值

MIN([DISTINCT|ALL]<列名>)求一列值中最小值單表查詢(續(xù))

如果指定DISTINCT短語,則表示在計算時要取消指定列中的重復值,否則表示不取消重復值。缺省為ALL。 例:查詢學生總數(shù)。

SELECTCOUNT(*) FROMStudent;單表查詢(續(xù))例:查詢選修了課程的學生人數(shù)

SELECTCOUNT(DISTINCTSno) FROMSC;例:計算1號課程的學生平均成績

SELECTAVG(Grade) FROMSC WHERECno=‘1’;單表查詢(續(xù))例:查詢選修了1號課程的學生的最高分

SELECTMAX(Grade) FROMSC WHERECno=‘1’;單表查詢(續(xù))五、對查詢結(jié)果分組(GROUPBY子句)

對查詢結(jié)果分組的目的時為了細化集函數(shù)的作用對象。如果未對查詢結(jié)果分組,集函數(shù)將作用于整個查詢結(jié)果。分組后集函數(shù)將作用于每一個組。 例:求各個課程號及相應的選修人數(shù)

SELECTCno,COUNT(Sno) FROMSC GROUPBYCno;單表查詢(續(xù))HAVING短語指定選擇組的條件,只有滿足條件的組才會被選出來。HAVING短語的條件由集函數(shù)構(gòu)造。

例:查詢選修了3門以上課程的學生學號

SELECTSno FROMSC GROUPBYSno HAVINGCOUNT(*)>3;單表查詢(續(xù))WHERE子句與

HAVING短語的區(qū)別:

作用對象不同WHERE子句:作用于基本表或者視圖,從中選擇滿足條件的元組。HAVING短語:作用于組,從中選擇滿足條件的組。例:查詢選修了3門以上課程是90分以上的學生學號及(90分以上)課程數(shù)。 SELECTSno,COUNT(*)FROMSCWHEREGrade>90GROUPBYSnoHAVINGCOUNT(*)>3;單表查詢(續(xù))5.3.2連接查詢

前面的查詢都是針對一個表進行的。若一個查詢同時涉及兩個以上的表,則稱之為連接查詢。連接查詢是關(guān)系數(shù)據(jù)庫中最主要的查詢,也是查詢中最難的一部分,包括等值連接、自然連接、非等值連接查詢、自身連接查詢、外連接查詢和復合條件連接查詢。5.3.2連接查詢一、等值與非等值連接查詢 連接查詢中用來連接兩個表的條件稱為連接條件或連接謂詞,其一般格式為:

[<表名1>.]<列名1><比較運算符>[<表名2>.]<列名2>

除了正規(guī)的比較運算符外還可以應用between運算符。 當連接運算符為=號時,稱為等值連接。其它稱為非等值連接。 連接謂詞中的列名稱為連接字段。連接條件中的各連接字段類型必須時可比的,但不必是相同的。

5.3.2連接查詢DBMS連接的過程是:表1表2元組1元組1元組2元組2….…元組n元組m表1表2元組1元組1元組2元組2….…元組n元組m5.3.2連接查詢5.3.2連接查詢表1表2元組1元組1元組2元組2….…元組n元組m5.3.2連接查詢表1表2元組1元組1元組2元組2….…元組n元組m5.3.2連接查詢表1表2元組1元組1元組2元組2….…元組n元組m5.3.2連接查詢表1表2元組1元組1元組2元組2….…元組n元組m5.3.2連接查詢表1表2元組1元組1元組2元組2….…元組n元組m5.3.2連接查詢表1表2元組1元組1元組2元組2….…元組n元組m連接查詢等值連接:連接運算符為=[例33]查詢每個學生及其選修課程的情況

SELECTStudent.*,SC.* FROMStudent,SC WHEREStudent.Sno=SC.Sno;連接查詢Student.SnoSnameSsexSageSdeptSC.SnoCnoGrade200215121李勇男20CS200215121192200215121李勇男20CS200215121285200215121李勇男20CS200215121388200215122劉晨女19CS200215122290200215122劉晨女19CS200215122380查詢結(jié)果:連接查詢自然連接:[例34]對[例33]用自然連接完成。

SELECTStudent.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFROMStudent,SCWHEREStudent.Sno=SC.Sno;查詢結(jié)果Student.SnoSnameSsexSageSdeptCnoGrade200215121李勇男20CS192200215121李勇男20CS285200215121李勇男20CS388200215122劉晨女19CS290200215122劉晨女19CS380二、自身連接

連接操作不僅可以在兩個表之間進行,也可以是一個表與其自己進行連接,稱為表的自然連接。需要給表起別名以示區(qū)別由于所有屬性名都是同名屬性,因此必須使用別名前綴

例:查詢每一門課程的間接先行課。5.3.2連接查詢5.3.2連接查詢CnoCnameCpnoCcredit1數(shù)據(jù)庫542數(shù)學23信息系統(tǒng)144操作系統(tǒng)635數(shù)據(jù)結(jié)構(gòu)746數(shù)據(jù)處理27PASCAL語言64CnoCnameCpnoCcredit1數(shù)據(jù)庫542數(shù)學23信息系統(tǒng)144操作系統(tǒng)635數(shù)據(jù)結(jié)構(gòu)746數(shù)據(jù)處理27PASCAL語言64SELECTo,second.cpnoFROMCoursefirst,CoursesecondWHEREfirst.cpno=o;5.3.2連接查詢查詢結(jié)果:CnoPcno1735565.3.2連接查詢

例:查詢至少選修了1、2號課程的學生

SELECTSC1.SnoFROMSCSC1,SCSC2WHERESC1.Sno=SC2.SnoANDSC1.Cno=‘1’ ANDSC2.Cno=‘2’;5.3.2連接查詢?nèi)?、外連接

外連接與普通連接的區(qū)別:普通連接操作只輸出滿足連接條件的元組外連接操作以指定表為連接主體,將主體表中不滿足連接條件的元組一并輸出[例36]改寫[例33]SELECTStudent.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFROMStudentLEFTOUTJOINSCON(Student.Sno=SC.Sno);5.3.2連接查詢執(zhí)行結(jié)果:Student.SnoSnameSsexSageSdeptCnoGrade200215121李勇男20CS192200215121李勇男20CS285200215121李勇男20CS388200215122劉晨女19CS290200215122劉晨女19CS380200215123王敏女18MANULLNULL200215125張立男19ISNULLNULL5.3.2連接查詢左外連接列出左邊關(guān)系(如本例Student)中所有的元組右外連接列出右邊關(guān)系中所有的元組5.3.2連接查詢四、復合條件連接

WHERE子句中可以有多個連接條件,稱為復合條件連接。

連接操作除了可以是兩表連接,一個表與其自身連接外,還可以是兩個以上的表進行連接,后者通常稱為多表連接。查詢選修了2號課程且成績在90分以上的學生的學號、姓名、分數(shù)SELECTStudent.Sno,student.SnameFROMStudent,SCWHERE

Student.Sno=SC.SnoAND

/*連接謂詞*/SC.Cno='2'AND/*其他限定條件*/SC.Grade>90;

/*其他限定條件*/5.3.2連接查詢5.3.3嵌套查詢 在SQL語言中,一個SELECTFROMWHERE子句稱為一個查詢塊。將一個查詢塊嵌套在另一個查詢塊的WHERE子句或HAVING子句的條件中的查詢稱為嵌套查詢。嵌套查詢(續(xù))

例如:

SELECTSname

/*外層查詢/父查詢*/

FROMStudent WHERESno

IN(SELECTSno

/*內(nèi)層查詢/子查詢*/ FROMSC WHERECno=‘2’);嵌套查詢(續(xù))

上層的查詢塊稱為外層查詢或父查詢,下層的查詢塊稱為內(nèi)層查詢或子查詢。SQL語言允許多層嵌套查詢。子查詢的限制不能使用ORDERBY子句層層嵌套方式反映了SQL語言的結(jié)構(gòu)化有些嵌套查詢可以用連接運算替代嵌套查詢(續(xù))不相關(guān)子查詢:子查詢的查詢條件不依賴于父查詢由里向外逐層處理。即每個子查詢在上一級查詢處理之前求解,子查詢的結(jié)果用于建立其父查詢的查找條件。嵌套查詢(續(xù))相關(guān)子查詢:子查詢的查詢條件依賴于父查詢首先取外層查詢中表的第一個元組,根據(jù)它與內(nèi)層查詢相關(guān)的屬性值處理內(nèi)層查詢,若WHERE子句返回值為真,則取此元組放入結(jié)果表然后再取外層表的下一個元組重復這一過程,直至外層表全部檢查完為止嵌套查詢(續(xù))一、帶有IN謂詞的子查詢 在嵌套查詢中,子查詢的結(jié)果往往是一個集合,所以謂詞IN是嵌套查詢中最經(jīng)常使用的謂詞。

IN表示在某個集合的范圍。 例:查詢與“劉晨”在同一個系學習的學生。嵌套查詢(續(xù))

SELECTSno,Sname,Sdept FROMStudent WHERESdeptIN (SELECTSdept FROMStudent WHERESname=‘劉晨’);嵌套查詢(續(xù))[例39]查詢與“劉晨”在同一個系學習的學生。

此查詢要求可以分步來完成①

確定“劉晨”所在系名

SELECTSdept

FROMStudentWHERESname='劉晨'; 結(jié)果為:CS嵌套查詢(續(xù))②查找所有在IS系學習的學生。

SELECTSno,Sname,Sdept

FROMStudentWHERESdept='CS';結(jié)果為:SnoSnameSdept200215121李勇CS200215122劉晨CS嵌套查詢(續(xù))將第一步查詢嵌入到第二步查詢的條件中

SELECTSno,Sname,Sdept FROMStudent WHERESdept

IN(SELECTSdeptFROMStudentWHERESname=‘劉晨’);此查詢?yōu)椴幌嚓P(guān)子查詢。嵌套查詢(續(xù))用自身連接完成[例39]查詢要求

SELECTS1.Sno,S1.Sname,S1.SdeptFROMStudentS1,StudentS2WHERES1.Sdept=S2.SdeptAND

S2.Sname='劉晨';嵌套查詢(續(xù))[例]查詢選修了課程名為“信息系統(tǒng)”的學生學號和姓名

SELECTSno,Sname

③最后在Student關(guān)系中

FROMStudent取出Sno和Sname WHERESnoIN(SELECTSno

②然后在SC關(guān)系中找出選

FROMSC修了3號課程的學生學號

WHERECnoIN(SELECTCno

①首先在Course關(guān)系中找出

FROMCourse“信息系統(tǒng)”的課程號,為3號

WHERECname=‘信息系統(tǒng)’

));嵌套查詢(續(xù))用連接查詢實現(xiàn)[例40]

SELECTSno,SnameFROMStudent,SC,CourseWHEREStudent.Sno=SC.SnoAND

SC.Cno=Course.CnoAND

Course.Cname=‘信息系統(tǒng)’;嵌套查詢(續(xù))

相關(guān)查詢求解:首先取外層查詢表中的第一個元組,根據(jù)它于內(nèi)層查詢相關(guān)的屬性值處理內(nèi)層查詢,內(nèi)層查詢形成結(jié)果集供外層查詢使用。然后在取外層查詢的下一個元組,重復這一過程,直到外層表全部檢索完為止。嵌套查詢(續(xù))學號姓名001張三002李四003王五學號課程號001c1001c2001c3002c1002c3003c4向下層傳遞值………嵌套查詢(續(xù))二、帶有比較運算符的子查詢 帶有比較運算符的子查詢是指父查詢與子查詢之間用比較運算符進行連接。需要內(nèi)層查詢的結(jié)果必須是單值。 例如,查詢和“劉晨”在同一個系學習的學生可以寫為:嵌套查詢(續(xù))

SELECTSno,Sname,Sdept FROMStudent WHERESdept= (SELECTSdept FROMStudent WHERESname=‘劉晨’);

注意:子查詢一定要跟在比較符之后。嵌套查詢(續(xù))子查詢一定要跟在比較符之后

錯誤的例子:

SELECTSno,Sname,SdeptFROMStudentWHERE(SELECTSdeptFROMStudentWHERESname=‘劉晨’)=Sdept;嵌套查詢(續(xù))例:找出每個學生超過他選修課程平均成績的課程號。

SELECTSno,CnoFROMSCxWHEREGrade>=(SELECTAVG(Grade) FROMSCyWHEREy.Sno=x.Sno);相關(guān)子查詢嵌套查詢(續(xù))可能的執(zhí)行過程:

1.從外層查詢中取出SC的一個元組x,將元組x的Sno值(200215121)傳送給內(nèi)層查詢。

SELECTAVG(Grade)FROMSCyWHEREy.Sno='200215121';2.執(zhí)行內(nèi)層查詢,得到值88(近似值),用該值代替內(nèi)層查詢,得到外層查詢:

SELECTSno,CnoFROMSCxWHEREGrade>=88;嵌套查詢(續(xù))5.執(zhí)行這個查詢,得到(200215121,1)(200215121,3)4.外層查詢?nèi)〕鱿乱粋€元組重復做上述1至3步驟,直到外層的SC元組全部處理完畢。結(jié)果為:

(200215121,1)(200215121,3)(200215122,2)嵌套查詢(續(xù))三、帶有ANY或ALL謂詞的子查詢 子查詢返回單值時可以用比較運算符,如果查詢結(jié)果為多值則可以使用ANY或ALL配合比較運算符。謂詞語義ANY:任意一個值ALL:所有值

>ANY 大于子查詢結(jié)果的某個值

>ALL 大于子查詢結(jié)果的所有值

<ANY 小于子查詢結(jié)果的某個值

<ALL 小于子查詢結(jié)果的所有值嵌套查詢(續(xù))

>=ANY 大于等于子查詢結(jié)果的某個值

>=ALL 大于等于子查詢結(jié)果的所有值

<=ANY 小于等于子查詢結(jié)果的某個值

<=ALL 小于等于子查詢結(jié)果的所有值

=ANY 等于子查詢結(jié)果的某個值

=ALL 等于子查詢結(jié)果的所有值

!=ANY 不等于子查詢結(jié)果的某個值

!=ALL 不等于子查詢結(jié)果的任何一個值 (NOTIN)嵌套查詢(續(xù))

例:查詢其它系中比信息系某一學生年齡小的學生姓名和年齡。解法一:

SELECTSname,Sage FROMStudent WHERESage<ANY(SELECTSage FROMStudent WHERESdept=‘IS’) ANDSdept<>’IS’;嵌套查詢(續(xù))解法二:可以用集函數(shù)來實現(xiàn)上面的查詢,首先找出IS系中最大年齡,然后在父查詢中查所有非IS系且年齡小于IS系最大年齡的學生。

SELECTSname,Sage FROMStudent WHERESage<(SELECTMAX(Sage) FROMStudent WHERESdept=‘IS’) ANDSdept<>’IS’; 嵌套查詢(續(xù))

練習:找出平均成績最高的學生號

SELECT

SnoFROMSCGROUP

BYSNOHAVINGAVG(Grade)>=all

(SELECTAVG(Grade) FROMSC GROUP

BY

Sno);嵌套查詢(續(xù))

例:檢索選修課程C2的學生中成績最高的學生的學號SELECTSnoFROMSCWHERECno=‘C2’ANDGRADE>=ALL (SELECTGrade FROMSC WHERECno=‘C2’);嵌套查詢(續(xù))四、帶有EXISTS謂詞的子查詢

EXISTS代表存在量詞,子查詢不返回任何數(shù)據(jù),只產(chǎn)生邏輯真值和假值。如果子查詢有數(shù)據(jù)則返回真值,如果子查詢沒有數(shù)據(jù)則返回假值。嵌套查詢(續(xù))1.EXISTS謂詞存在量詞

帶有EXISTS謂詞的子查詢不返回任何數(shù)據(jù),只產(chǎn)生邏輯真值“true”或邏輯假值“false”。若內(nèi)層查詢結(jié)果非空,則外層的WHERE子句返回真值若內(nèi)層查詢結(jié)果為空,則外層的WHERE子句返回假值由EXISTS引出的子查詢,其目標列表達式通常都用*,因為帶EXISTS的子查詢只返回真值或假值,給出列名無實際意義2.NOTEXISTS謂詞若內(nèi)層查詢結(jié)果非空,則外層的WHERE子句返回假值若內(nèi)層查詢結(jié)果為空,則外層的WHERE子句返回真值嵌套查詢(續(xù))

例44:查詢所有選修了1號課程的學生姓名。

思路分析:本查詢涉及Student和SC關(guān)系在Student中依次取每個元組的Sno值,用此值去檢查SC關(guān)系若SC中存在這樣的元組,其Sno值等于此Student.Sno值,并且其Cno='1',則取此Student.Sname送入結(jié)果關(guān)系嵌套查詢(續(xù))SELECTSname FROMStudent WHEREEXISTS (SELECT* FROMSC WHERESno=Student.SnoANDCno=‘1’);嵌套查詢(續(xù))連接查詢表示:SelectSnameFromStudent,SCWhereStudent.Sno=SC.SnoandCno=‘1’;嵌套查詢(續(xù))例:列出選修了1號和2號課程的學生的學號SELECTSC1.SnoFROMSCSC1WHERESC1.Cno=‘1’ ANDEXISTS

(SELECTSC2.Sno FROMSCSC2 WHERESC2.Cno=‘2’ ANDSC2.Sno=SC1.Sno);嵌套查詢(續(xù))與EXISTS對應的是NOTEXISTS,和EXISTS相反,子查詢沒有數(shù)據(jù)返回真值,有數(shù)據(jù)返回假值。不同形式的查詢間的替換一些帶EXISTS或NOTEXISTS謂詞的子查詢不能被其他形式的子查詢等價替換所有帶IN謂詞、比較運算符、ANY和ALL謂詞的子查詢都能用帶EXISTS謂詞的子查詢等價替換用EXISTS/NOTEXISTS實現(xiàn)全稱量詞(難點)SQL語言中沒有全稱量詞(Forall)可以把帶有全稱量詞的謂詞轉(zhuǎn)換為等價的帶有存在量詞的謂詞:

(x)P≡(x(P))嵌套查詢(續(xù))

例:查詢沒有選修1號課程的學生的姓名。

SELECTSname FROMStudent WHERENOTEXISTS (SELECT* FROMSC WHERESno=Student.SnoANDCno=‘1’);嵌套查詢(續(xù))

例:查詢選修了全部課程的學生姓名

SELECTSname FROMStudent WHERENOTEXISTS (SELECT* FROMCourse WHERENOTEXISTS (SELECT* FROMSC WHERESno=Student.Sno ANDCno=Course.Cno));5.3.4集合查詢SELECT語句的查詢結(jié)果是元組的集合,所以多個SELECT語句的結(jié)果可進行集合操作。集合操作的種類并操作UNION交操作INTERSECT差操作EXCEPT

集合查詢(續(xù))形式:

<查詢塊> UNION/INTERSECT/EXCEPT <查詢塊>參加UNION操作的各結(jié)果表的列數(shù)必須相同對應項的數(shù)據(jù)類型也必須相同集合查詢(續(xù))例45:查詢計算機科學系的學生及年齡不大于19歲的學生。方法一:

SELECT*FROMStudentWHERESdept='CS'UNIONSELECT*FROMStudentWHERESage<=19方法二:

SELECTDISTINCT*FROMStudentWHERESdept='CS'ORSage<=19集合查詢(續(xù))

例:檢索沒人選修的課程號和課程名

SELECTCno,CnameFROMCourseWHERECnoIN(SELECTCnoFROMCExceptSELECTDISTINCTCnoFROMSC);5.3.5SELECT語句的一般格式SELECT[ALL|DISTINCT]<目標列表達式>[別

溫馨提示

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

評論

0/150

提交評論