數(shù)據(jù)庫(kù)原理與應(yīng)用 教學(xué)課件 作者 蔡延光第4章 數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL_第1頁(yè)
數(shù)據(jù)庫(kù)原理與應(yīng)用 教學(xué)課件 作者 蔡延光第4章 數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL_第2頁(yè)
數(shù)據(jù)庫(kù)原理與應(yīng)用 教學(xué)課件 作者 蔡延光第4章 數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL_第3頁(yè)
數(shù)據(jù)庫(kù)原理與應(yīng)用 教學(xué)課件 作者 蔡延光第4章 數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL_第4頁(yè)
數(shù)據(jù)庫(kù)原理與應(yīng)用 教學(xué)課件 作者 蔡延光第4章 數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL_第5頁(yè)
已閱讀5頁(yè),還剩134頁(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)介

第4章數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL本章概要SQL是結(jié)構(gòu)化查詢語(yǔ)言(StructuredQueryLanguage)的縮寫,其功能包括數(shù)據(jù)查詢、數(shù)據(jù)操縱、數(shù)據(jù)定義和數(shù)據(jù)控制四個(gè)部分。SQL語(yǔ)言簡(jiǎn)潔、方便實(shí)用、功能齊全,已成為目前應(yīng)用最廣的關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言。4.1.1SQL簡(jiǎn)介

SQL語(yǔ)言發(fā)展主要經(jīng)歷了以下幾個(gè)階段:1974年由Boyce和Chamberlin提出,當(dāng)時(shí)稱為SEQUEL(STUCTUREDENGLISHQUERYLANGUAGE);IBM公司對(duì)其進(jìn)行了修改,并用于其SYSTEMR關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)中。1981年,IBM推出其商用關(guān)系關(guān)系數(shù)據(jù)庫(kù)SQL/DS,并將其名字改為SQL,由于SQL語(yǔ)言功能強(qiáng)大,簡(jiǎn)潔易用,因此得到了廣泛的使用。最早的SQL標(biāo)準(zhǔn)是1986年10月由美國(guó)國(guó)家標(biāo)準(zhǔn)公布的,隨后ISO于1987年也正式采納它為國(guó)際標(biāo)準(zhǔn),并在此基礎(chǔ)上進(jìn)行補(bǔ)充,到1989年,ISO提出了完整特性的SQL,并稱之為SQL-89,1992年公布了SQL-92標(biāo)準(zhǔn)(又稱為SQL2),1999年公布了SQL-99標(biāo)準(zhǔn)(又稱為SQL3)。今天廣泛應(yīng)用于各種大型數(shù)據(jù)庫(kù),如SYBASE、INFORMIX、ORACLE、DB2、INGRES等,也用于各種小型數(shù)據(jù)庫(kù),如FOXPRO、ACCESS。4.1.2SQL的主要功能數(shù)據(jù)定義:用來(lái)定義數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu),包括定義表、視圖、索引等。數(shù)據(jù)定義只是定義結(jié)構(gòu),不涉及到具體的數(shù)據(jù),SQL語(yǔ)言使用DDL實(shí)現(xiàn)其數(shù)據(jù)定義功能,使用CREATE、DROP、ALTER命令動(dòng)詞完成該功能。數(shù)據(jù)操縱:主要完成對(duì)數(shù)據(jù)的存取工作,包括數(shù)據(jù)查詢及數(shù)據(jù)更新兩大類操作,其中數(shù)據(jù)更新包括數(shù)據(jù)的新增、修改和刪除操作。SQL語(yǔ)言使用數(shù)據(jù)操縱語(yǔ)言實(shí)現(xiàn)其數(shù)據(jù)操縱功能,使用SELECT、INSERT、UPDATE、DELETE命令動(dòng)詞完成該功能。數(shù)據(jù)控制:主要完成對(duì)數(shù)據(jù)的安全性、完整性規(guī)則的描述以及對(duì)事務(wù)的控制,SQL語(yǔ)言使用DCL實(shí)現(xiàn)其數(shù)據(jù)控制功能,使用GRANT、REVOKE等命令動(dòng)詞完成該功能。4.1.3SQL語(yǔ)言的主要特點(diǎn)綜合統(tǒng)一:集DDL、DML、DCL功能于一體,可獨(dú)立完成數(shù)據(jù)庫(kù)生命周期中的全部活動(dòng),語(yǔ)言風(fēng)格統(tǒng)一。語(yǔ)言簡(jiǎn)捷,易學(xué)易用。SQL語(yǔ)言功能極強(qiáng),但由于設(shè)計(jì)巧妙,語(yǔ)言十分簡(jiǎn)潔,完成數(shù)據(jù)定義、數(shù)據(jù)操縱、數(shù)據(jù)控制的核心功能只用了9個(gè)動(dòng)詞。高度非過(guò)程化:用戶只需提出“做什么”,而無(wú)需指明“怎么做”。因此用戶無(wú)需了解存取路徑,存取路徑的選擇以及SQL語(yǔ)句的操作過(guò)程由系統(tǒng)自動(dòng)完成。這不但大大減輕了用戶負(fù)擔(dān),而且有利于提高數(shù)據(jù)獨(dú)立性。面向集合的操作方式:操作對(duì)象、查詢結(jié)果、更新數(shù)據(jù)均可以是元組的集合。以同一種語(yǔ)法格式提供兩種使用方式:自含式、嵌入式。SQL支持關(guān)系數(shù)據(jù)庫(kù)的三級(jí)模式結(jié)構(gòu)。4.1.3SQL語(yǔ)言的主要特點(diǎn)4.1.3SQL語(yǔ)言的主要特點(diǎn)三級(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ù)中。SQL視圖1視圖2基本表1基本表2基本表3基本表4存儲(chǔ)文件1存儲(chǔ)文件2外模式模式內(nèi)模式4.1.4SQL語(yǔ)法SQL輸入由一系列命令組成,而命令是由一系列記號(hào)構(gòu)成。記號(hào)是否合法取決于特定命令的語(yǔ)法,它可以是關(guān)鍵字、文本、常量,或者是特殊的字符符號(hào),記號(hào)與記號(hào)之間通常用空格、TAB,換行符分隔。如:SELECT*FROMMy_Table。其中SELECT是關(guān)鍵字,即在SQL語(yǔ)言中有固定含義的單詞,My_Table是標(biāo)識(shí)符,根據(jù)使用它們的命令的不同,標(biāo)識(shí)符用來(lái)命名數(shù)據(jù)庫(kù)對(duì)象,如庫(kù)、表、視圖、索引、存儲(chǔ)過(guò)程、觸發(fā)器等,關(guān)鍵字和標(biāo)識(shí)符有著同樣的語(yǔ)法結(jié)構(gòu)。SQL標(biāo)識(shí)符必須是以字母或下劃線“_”開(kāi)頭,其后可以包含字母、數(shù)字、下劃線等。如My_Table是合法的標(biāo)識(shí)符。在一般情況下,標(biāo)識(shí)符中不允許有空格,也不能與命令動(dòng)詞、關(guān)鍵字或函數(shù)名同名。在編寫SQL命令時(shí),各個(gè)命令必須以命令動(dòng)詞開(kāi)始,各部分之間要用空格隔開(kāi),而SQL中的數(shù)據(jù)項(xiàng)(包括表,視圖和屬性列)之間用“,”隔開(kāi),而字符串常數(shù)的定界符為單引號(hào)。4.1.4SQL語(yǔ)法約定符號(hào)意義[](方括號(hào))[]中的內(nèi)容為任選項(xiàng),根據(jù)具體情況決定是否選用。|(豎線)必選項(xiàng),表示兩邊的部分只能選用其中的一個(gè)。<>(尖括號(hào))<>中的內(nèi)容為實(shí)際語(yǔ)義,表示其中內(nèi)容要以實(shí)際名稱或參數(shù)輸入,為必選內(nèi)容。{}(大括號(hào))必選項(xiàng),表示必須至少選其中的一個(gè)選項(xiàng)。()(小括號(hào))是語(yǔ)句的組成部分,一定要輸入…(省略號(hào))表示可以任意多次地重復(fù)前面的單元[,...n]指示前面的項(xiàng)可以重復(fù)

n次,具體值由逗號(hào)分隔4.2SQL數(shù)據(jù)定義

SQL語(yǔ)言使用數(shù)據(jù)定義語(yǔ)言(DATADEFINITIONLANGUAGE,簡(jiǎn)稱DDL)實(shí)現(xiàn)其數(shù)據(jù)定義功能。操作對(duì)象操作對(duì)象創(chuàng)建刪除修改表CreatetableDroptableAltertable視圖CreateviewDropview索引CreateindexDropindex數(shù)據(jù)庫(kù)CreatedatabaseDropdatabaseAlterdatabase4.2.1數(shù)據(jù)庫(kù)定義數(shù)據(jù)庫(kù)包括定義數(shù)據(jù)庫(kù)名、確定數(shù)據(jù)庫(kù)文件及其大小、確認(rèn)日志文件的位置和大小。定義數(shù)據(jù)庫(kù)使用CREATEDATABASE語(yǔ)句,其語(yǔ)法格式為:CREATEDATABASE<數(shù)據(jù)庫(kù)名>[ON[PRIMARY]([NAME=<邏輯數(shù)據(jù)文件名>,]FILENAME=’<操作數(shù)據(jù)文件路徑和文件名>’[,SIZE=<文件長(zhǎng)度>][,MAXSIZE=<最大文件長(zhǎng)度>][,FILEGROWTH=<文件增長(zhǎng)率>])[,…n]][LOGON([NAME=〈邏輯日志文件名〉,]FILENAME=’〈操作日志文件路徑和文件名〉’[,SIZE=〈文件長(zhǎng)度〉])[,…n]][FORRESTORE]4.2.1數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)定義語(yǔ)句中包括以下4個(gè)方面的內(nèi)容:定義數(shù)據(jù)庫(kù)名。定義數(shù)據(jù)文件。在ON子句中,PRIMARY短語(yǔ)指明主文件名(.mdf)。NAME短語(yǔ)定義邏輯數(shù)據(jù)文件名。FILENAME短語(yǔ)定義物理數(shù)據(jù)文件的存儲(chǔ)位置和文件名。SIZE短語(yǔ)定義文件的大小,數(shù)據(jù)庫(kù)文件最小為1MB,默認(rèn)值為3MB。MAXSIZE短語(yǔ)定義文件的最大空間。FILEGROWTH說(shuō)明文件的增長(zhǎng)率,默認(rèn)值為10%??梢远x多個(gè)數(shù)據(jù)文件,默認(rèn)第一個(gè)為主文件。定義日志文件。在LOGON子句中,NAME短語(yǔ)定義邏輯日志文件名。FILENAME短語(yǔ)定義日志文件的存儲(chǔ)位置和文件名。SIZE短語(yǔ)定義日志文件的長(zhǎng)度。可以定義多個(gè)日志文件。FORRESTORE子句。用于重建數(shù)據(jù)庫(kù),該重建的數(shù)據(jù)庫(kù)用于數(shù)據(jù)恢復(fù)操作。4.2.1數(shù)據(jù)庫(kù)例:創(chuàng)建數(shù)據(jù)庫(kù)“學(xué)生選課庫(kù)”,初始大小為4MB。CREATEDATABASE學(xué)生選課庫(kù)ONPRIMARY(NAME=學(xué)生選課庫(kù),FILENAME=‘C:\SQLSERVER\DATA\學(xué)生選課.mdf’,SIZE=4MB,MAXSIZE=6MB,FILEGROWTH=20%)4.2.1數(shù)據(jù)庫(kù)2.選擇數(shù)據(jù)庫(kù):數(shù)據(jù)庫(kù)的選擇使用USE命令,其語(yǔ)法格式為:USE<數(shù)據(jù)庫(kù)名>3.刪除數(shù)據(jù)庫(kù):刪除數(shù)據(jù)庫(kù)的語(yǔ)法格式為:DROPDATABASE<數(shù)據(jù)庫(kù)名>例:將學(xué)生選課庫(kù)刪除。DROPDATABASE學(xué)生選課庫(kù)1、創(chuàng)建數(shù)據(jù)表:數(shù)據(jù)表是關(guān)系數(shù)據(jù)庫(kù)的基本組成單位,它物理地存儲(chǔ)于數(shù)據(jù)庫(kù)的存儲(chǔ)文件中。CREATETABLE[<庫(kù)名.>]<表名>(<列名><數(shù)據(jù)類型>[列級(jí)完整性約束條件]

[,<列名><數(shù)據(jù)類型>[列級(jí)完整性約束條件]] [,…n] [,<表級(jí)完整性約束條件>][,…n])4.2.2基本表(1)表名:是所要定義的基本表的名字,同一個(gè)數(shù)據(jù)庫(kù)中,不允許基本表重名,命名格式遵從標(biāo)識(shí)符的命名規(guī)則,如SC,Student。(2)列名:表示基本表的各個(gè)屬性,同一個(gè)基本表中不允許出現(xiàn)重復(fù)的屬性名,命名格式遵從標(biāo)識(shí)符的命名規(guī)則,字母開(kāi)頭,可含字母、數(shù)字、#、$、_等。4.2.2基本表例:建立表Student。CREATETABLEStudent(Sno CHAR(5),

Sname VARCHAR(20), Sex CHAR(1),

SdeptVARCHAR(15),

SmonCHAR(5),

SbirthDay SMALLDATETIME)執(zhí)行該語(yǔ)句后,便產(chǎn)生了學(xué)生基本表的空表。4.2.2基本表上列為創(chuàng)建基本表的最簡(jiǎn)單形式,還可以對(duì)表進(jìn)一步定義,如主碼、空值的設(shè)定,使數(shù)據(jù)庫(kù)用戶能夠根據(jù)應(yīng)用的需要對(duì)基本表的定義做出更為詳盡的規(guī)定。在SQLSERVER中,對(duì)于基本表的約束分為列約束和表約束。4.2.2基本表列約束:是對(duì)某一個(gè)特定列的約束,包含在列定義中,直接跟在該列的其他定義之后,用空格分隔,不必指定列名。表約束:與列定義相互獨(dú)立,不包括在列定義中,通常用于對(duì)多個(gè)列一起進(jìn)行約束,定義表約束時(shí)必須指出要約束的那些列的名稱。完整性約束的基本語(yǔ)法格式為:

[CONSTRAINT<約束名>]<約束類型>約束名:約束不指定名稱時(shí),系統(tǒng)會(huì)給定一個(gè)名稱。完整性約束定義約束類型:在定義完整性約束時(shí)必須指定完整性約束的類型。在SQLSERVER中可以定義5種類型的完整性約束。(1)NULL/NOTNULL:是否允許該字段的值為NULL。NULL值不是0也不是空白,更不是填入字符串“NULL”,而是表示“不知道”、“不確定”或“沒(méi)有數(shù)據(jù)”的意思。當(dāng)某一字段的值一定要輸入才有意義的時(shí)候,則可以設(shè)置為NOTNULL。如主碼列就不允許出現(xiàn)空值,否則就失去了唯一標(biāo)識(shí)一條記錄的作用,只能用于定義列約束,其語(yǔ)法格式如下:

[CONSTRAINT<約束名>][NULL|NOTNULL]實(shí)例例:建立Student表,對(duì)Sno字段進(jìn)行NOTNULL約束。CREATETABLEStudent(Sno CHAR(5)NOTNULL,

Sname VARCHAR(20), Sex CHAR(1),

Sdept VARCHAR(15),

Smon CHAR(5),

SBirthDay SMALLDATETIME)當(dāng)SNO為空值時(shí),系統(tǒng)給出錯(cuò)誤信息,無(wú)NOTNULL約束時(shí),系統(tǒng)缺省為NULL。其中S_CONS為指定的約束名稱,當(dāng)約束名稱省略時(shí),系統(tǒng)自動(dòng)產(chǎn)生一個(gè)名字。完整性約束定義(2)UNIQUE約束:UNIQUE約束用于指明基本表在某一列或多個(gè)列的組合上的取值必須唯一。定義了UNIQUE約束的那些列稱為唯一鍵,系統(tǒng)自動(dòng)為唯一鍵建立唯一索引,從而保證了唯一鍵的唯一性。唯一鍵允許為空,但系統(tǒng)為保證其唯一性,最多只可以出現(xiàn)一個(gè)NULL值。UNIQUE既可用于列約束,也可用于表約束。UNIQUE用于定義列約束時(shí),其語(yǔ)法格式如下:

[CONSTRAINT<約束名>]UNIQUE舉例例:建立一個(gè)Student表,定義Sname為唯一碼。CREATETABLEStudent(

Sno CHAR(5) NOTNULL,

Sname VARCHAR(20) UNIQUE, Sex CHAR(1),

Sdept VARCHAR(15),

Smon CHAR(5),

SBirthDay SMALLDATETIME)完整性約束定義UNIQUE用于定義表約束時(shí),其語(yǔ)法格式如下:

[CONSTRAINT<約束名>]UNIQUE(<列名>[{,<列名>}])例:建立一個(gè)Student表,定義Sname+Sex為唯一碼。CREATETABLEStudent(

Sno CHAR(5) NOTNULL,

Sname VARCHAR(20),Sex CHAR(1),

Sdept VARCHAR(15),

Smon CHAR(5),

SBirthDay SMALLDATETIME,CONSTRAINTS_UNIQUNIQUE(Sname,Sex))完整性約束定義(3)PRIMARYKEY約束:用于定義基本表的主碼,起唯一標(biāo)識(shí)作用,其值不能為NULL,也不能重復(fù),以此來(lái)保證實(shí)體的完整性。PRIMARYKEY與UNIQUE約束類似,通過(guò)建立唯一索引來(lái)保證基本表在主碼列取值的唯一性,主要區(qū)別在于:①在一個(gè)基本表中只能定義一個(gè)PRIMARYKEY約束,但可定義多個(gè)UNIQUE約束;②對(duì)于指定為PRIMARYKEY的一個(gè)列或多個(gè)列的組合,其中任何一個(gè)列都不能出現(xiàn)空值,而對(duì)于UNIQUE所約束的唯一鍵,則允許為空。注意:不能為同一個(gè)列或一組列既定義UNIQUE約束,又定義PRIMARYKEY約束。PRIMARYKEY既可用于列約束,也可用于表約束。PRIMARYKEY用于定義列約束時(shí),其語(yǔ)法格式如下:

CONSTRAINT<約束名>PRIMARYKEY完整性約束定義舉例例:建立一個(gè)Student表,定義Sno為該表的主碼。CREATETABLEStudent(

Sno CHAR(5)PRIMARYKEY, Sname VARCHAR(20)UNIQUE, Sex CHAR(1),

Sdept VARCHAR(15),

Smon Char(5),

SBirthDay SMALLDATETIME)PRIMARYKEY用于定義表約束時(shí),即將某些列的組合定義為主碼,其語(yǔ)法格式如下:

[CONSTRAINT<約束名>]PRIMARYKEY(<列名>[{<列名>}])例:建立一個(gè)SC表,定義SNO+CNO為SC的主碼CREATETABLESC(SNOCHAR(5)NOTNULL,CNOCHAR(5)NOTNULL,SCORENUMERIC(3),CONSTRAINTSC_PRIMPRIMARYKEY(SNO,CNO))完整性約束定義(4)FOREIGNKEY約束:指定某一個(gè)列或一組列作為外碼。如果關(guān)系R2的一個(gè)或一組屬性X不是R2的主碼,而是另一關(guān)系R1的主碼,則該屬性或?qū)傩越MX稱為關(guān)系R2的外碼或外部關(guān)系鍵。并稱關(guān)系R2為參照關(guān)系,關(guān)系R1為被參照關(guān)系。系統(tǒng)保證參照關(guān)系在外碼上的取值要么是被參照關(guān)系中某一個(gè)主碼值,要么取空值。以此保證兩個(gè)表之間的連接,確保了實(shí)體的參照完整性。FOREIGNKEY既可用于列約束,也可用于表約束,其語(yǔ)法格式為:完整性約束定義

[CONSTRAINT<約束名>]FOREIGNKEY(<外碼>)

REFERENCES<被參照關(guān)系名>(<列名>[{<列名>}])舉例例:建立一個(gè)SC表,定義Sno,Cno為SC的外碼。CREATETABLESC(

SnoCHAR(5)FOREIGNKEY(SNO)REFERENCESStudent(Sno),

CnoCHAR(5)FOREIGNKEY(CNO)REFERENCESCourse(Cno), SCOREDECIMAL(4,1), CONSTRAINTS_C_PRIMPRIMARYKEY(Sno,Cno))完整性約束定義(5)CHECK約束:CHECK約束用來(lái)檢查字段值所允許的范圍,如,一個(gè)字段只能輸入整數(shù),而且限定在0-100的整數(shù),以此來(lái)保證域的完整性。CHECK既可用于列約束,也可用于表約束,其語(yǔ)法格式為:

[CONSTRAINT<約束名>]CHECK(<條件>)舉例例:建立一個(gè)SC表,定義SCORE的取值范圍為0~100之間 CREATETABLESC(Sno CHAR(5),

Cno CHAR(5),SCOREDECIMAL(4,1)CHECK(SCORE>=0ANDSCORE<=100))2.修改基本表由于應(yīng)用環(huán)境和應(yīng)用需求的變化,經(jīng)常需要修改基本表的結(jié)構(gòu),比如,增加新列和完整性約束、修改原有的列定義和完整性約束等。SQL語(yǔ)言使用ALTERTABLE命令來(lái)完成這一功能,其語(yǔ)法格式為:

ALTERTABLE〈表名〉[ADD〈新列名〉〈數(shù)據(jù)類型〉[列完整性約束]][DROP〈完整性約束名〉][MODIFY〈列名〉〈數(shù)據(jù)類型〉]

注意:使用此方式增加的新列自動(dòng)填充NULL值,所以不能為增加的新列指定NOTNULL約束。例:在SC表中增加完整性約束定義,使SCORE在0~100之間。ALTERTABLESCADDCONSTRAINTSCORE_CHKCHECK(SCOREBETWEEN0AND100)1.ADD方式2.修改基本表2.DROP方式:使用DROP語(yǔ)句刪除指定的完整性約束條件例:

刪除SC表中的SCORE_CHK約束。ALTERTABLESCDROPSCORE_CHK2.修改基本表2.修改基本表3.MODIFY方式例:把S表中的SNO列加寬到8位字符寬度

ALTERTABLESMODIFYCOLUMNSNOCHAR(8)注意:使用此方式有如下一些限制:①不能改變列名;②不能將含有空值的列的定義修改為NOTNULL約束;③若列中已有數(shù)據(jù),則不能減少該列的寬度,也不能改變其數(shù)據(jù)類型;④只能修改NULL|NOTNULL約束,其它類型的約束在修改之前必須先刪除,然后再重新添加修改過(guò)的約束定義。3.刪除基本表當(dāng)某個(gè)基本表無(wú)用時(shí),可將其刪除。刪除后,該表中的數(shù)據(jù)和在此表上所建的索引都被刪除,而建立在該表上的視圖不會(huì)隨之刪除,系統(tǒng)將繼續(xù)保留其定義,但已無(wú)法使用。如果重新恢復(fù)該表,這些視圖可重新使用。刪除表的語(yǔ)法格式:DROPTABLE<表名>例:刪除表STUDENT。DROPTABLESTUDENT注意:只能刪除自己建立的表,不能刪除其他用戶所建的表。4.2.3索引1.定義索引:語(yǔ)法格式為:

CREATE[UNIQUE][CLUSTER]INDEX<索引名>ON<表名>(<列名>[<次序>][,<列名>[<次序>]]…)其中:1)UNIQUE表示要建立唯一索引,此索引的每一個(gè)索引值只對(duì)應(yīng)唯一的數(shù)據(jù)記錄。2)CLUSTER表示要建立的索引是聚簇索引。索引可以建立在該表的一列或多列上,各列名之間用逗號(hào)分隔。3)可用<次序>指定索引值的排列次序,升序ASC,降序DESC,默認(rèn)為ASC。4.2.3索引例:為Student,Course,SC三個(gè)表建立索引。其中Student表按學(xué)號(hào)升序建唯一索引,Course表按課程號(hào)升序建唯一索引,SC表按學(xué)號(hào)升序和課程號(hào)降序建唯一索引。CREATENIQUEINDEXS_SnoONStudent(Sno)CREATENIQUEINDEXC_CnoONCourse(Cno)CREATENIQUEINDEXSCnoONSC(Sno

ASC,CnoDESC)索引機(jī)制對(duì)于提高數(shù)據(jù)庫(kù)的查詢效率非常高,在使用過(guò)程中,需注意唯一索引與聚簇索引之間的區(qū)別,以及聚簇索引與非聚簇索引之間的區(qū)別。4.2.3索引2.刪除索引建立索引是為了提高查詢速度,但隨著索引的增多,數(shù)據(jù)更新時(shí),系統(tǒng)會(huì)花費(fèi)許多時(shí)間來(lái)維護(hù)索引,因此,有必要?jiǎng)h除不必要的索引,其語(yǔ)法格式為:DROPINDEX數(shù)據(jù)表名.索引名例:刪除表SC的索引SCno。DROPNDEXC.SCno4.3數(shù)據(jù)查詢數(shù)據(jù)查詢是數(shù)據(jù)庫(kù)中最常見(jiàn)的操作。SQL語(yǔ)言提供SELECT語(yǔ)句,通過(guò)查詢操作可得到所需的信息。SELECT語(yǔ)句的一般格式為:Select<列名表>--指定希望查看的列From<表名列表>--指定要查詢的表[Where<條件>]--指定查詢條件[GroupBy<分組列名表>--指定要分組的列

[Having<條件>]]--指定分組的條件[OrderBy<排序列名表>]--指定如何排序查詢的結(jié)果是仍是一個(gè),執(zhí)行過(guò)程如下:根據(jù)WHERE子句的檢索條件,從FROM子句指定的基本表或視圖中選取滿足條件的元組,再按照SELECT子句中指定的列,投影得到結(jié)果表。如果有GROUP子句,則將查詢結(jié)果按照<列名1>相同的值進(jìn)行分組。如果GROUP子句后有HAVING短語(yǔ),則只輸出滿足HAVING條件的元組。如果有ORDER子句,查詢結(jié)果還要按照<列名2>的值進(jìn)行排序。Select<列名表>--指定希望查看的列From<表名列表>--指定要查詢的表[Where<條件>]

--指定查詢條件[GroupBy<分組列名表>

--指定要分組的列

[Having<條件>]]

--指定分組的條件[OrderBy<排序列名表>]--指定如何排序4.3數(shù)據(jù)查詢*:字段組的省略寫法.表示表中全部字段,按關(guān)系模式中屬性的順序排列.ALL:全部操作符。說(shuō)明在查詢結(jié)果中保留重復(fù)值,如果查詢中有統(tǒng)計(jì)字段,要求計(jì)算重復(fù)值,格式為:ALL<字段>或ALL<字段組>DISTINCT:去掉重復(fù)操作,格式為:DISTINCT<字段>或DISTINCT<字段組>Select<列名表>--指定希望查看的列From<表名列表>--指定要查詢的表例

查詢學(xué)生的全部信息。

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

另外,利用投影查詢可控制列名的順序,并可通過(guò)指定別名改變查詢結(jié)果的列標(biāo)題的名字。SELECT*FROMStudentSELECTDISTINCTSNOFROMSC4.3數(shù)據(jù)查詢例:查詢?nèi)w學(xué)生的姓名、學(xué)號(hào)和出生日期。

SELECTSname

姓名,Sno

學(xué)號(hào),

SBirthDayAS出生日期FROMStudent上述查詢均為不使用WHERE子句的無(wú)條件查詢,也稱作投影查詢。4.3數(shù)據(jù)查詢條件查詢當(dāng)要在表中找出滿足某些條件的行時(shí),則需使用WHERE子句指定查詢條件。WHERE子句中,條件通常通過(guò)三部分來(lái)描述:1.列名;2.比較運(yùn)算符;3.列名、常數(shù)。運(yùn)算符含義=,>,<,>=,<=,!=比較大小多重條件AND,ORBETWEENAND確定范圍IN確定集合LIKE字符匹配ISNULL空值常用的比較運(yùn)算符比較大小的條件查詢例:查詢成績(jī)高于85分的學(xué)生的學(xué)號(hào)、課程號(hào)和成績(jī)。SELECTSno,Cno,ScoreFROMSCWHEREScore>85多重條件查詢當(dāng)WHERE子句需要指定一個(gè)以上的查詢條件時(shí),則需要使用邏輯運(yùn)算符AND、OR和NOT將其連結(jié)成復(fù)合的邏輯表達(dá)式。其優(yōu)先級(jí)由高到低為:NOT、AND、OR,用戶可以使用括號(hào)改變優(yōu)先級(jí)。例:查詢選修C1或C2且分?jǐn)?shù)大于等于85分學(xué)生的的學(xué)號(hào)、課程號(hào)和成績(jī)。SELECTSno,Cno,ScoreFROMSCWHERE(Cno=‘C1’ORCno=‘C2’)ANDScore>=85確定范圍例:查詢成績(jī)?cè)?0至100之間的學(xué)生的學(xué)號(hào)以及課程號(hào)。SELECTSno,Cno

FROMSCWHEREScoreBETWEEN90AND100等價(jià)于

SELECTSno,CnoFROMstudentWHERE----------?確定集合利用“IN”操作可以查詢屬性值屬于指定集合的元組。例:查詢選修C1或C2的學(xué)生的學(xué)號(hào)、課程號(hào)和成績(jī)。SELECTSNO,CNO,SCOREFROMSCWHERECNOIN(‘C1’,‘C2’)此語(yǔ)句也可以使用邏輯運(yùn)算符“OR”實(shí)現(xiàn)。SELECTSNO,CNO,SCOREFROMSCWHERECNO=‘C1’ORCNO=‘C2’確定集合利用“NOTIN”可以查詢指定集合外的元組。例:查詢沒(méi)有選修C1,也沒(méi)有選修C2的學(xué)生的學(xué)號(hào)、課程號(hào)和成績(jī)。SELECTSNO,CNO,SCOREFROMSCWHERECNONOTIN(‘C1’,‘C2’)等價(jià)于:SELECTSNO,CNO,SCOREFROMSCWHERECNO!=‘C1’ANDCNO!=‘C2’部分匹配查詢上例均屬于完全匹配查詢,當(dāng)不知道完全精確的值時(shí),用戶還可以使用LIKE或NOTLIKE進(jìn)行部分匹配查詢(也稱模糊查詢)。LIKE定義的一般格式為:

<屬性名>LIKE<字符串常量>屬性名必須為字符型,字符串常量的字符可以包含如下兩個(gè)特殊符號(hào):%:表示任意知長(zhǎng)度的字符串;_:表示任意單個(gè)字符。部分匹配查詢例:查詢所有姓張的學(xué)生的學(xué)號(hào)和姓名。SELECTSNO,SNameFROMstudentWHERESNameLIKE‘張%’例:查詢姓名中第二個(gè)漢字是“力”的學(xué)生學(xué)號(hào)和姓名。SELECTSNO,SNameFROMStudentWHERETNameLIKE‘__力%’注:一個(gè)漢字占兩個(gè)字符。思考:查詢姓名的第一個(gè)字母為‘R’并且倒數(shù)第二個(gè)字母為‘S’的學(xué)生如果用戶要查詢的字符串本身就包含有通配符“%”或“_”,為了避免SQL將其解釋成通配符,則使用ESCAPE‘<換碼字符>’短語(yǔ)。例:查詢以“DB_”開(kāi)頭的課程的課程號(hào),課程名和學(xué)分。 SELECTCno,Cname,CreditsFROMCourse WHERECnameLIKE‘DB\_%’ESCAPE‘\’ESCAPE‘\’短語(yǔ)表示“\”為換碼字符,這樣匹配串中緊跟在“\”后面的字符“_”不再具有通配符的含義,轉(zhuǎn)義為普通的“_”字符。部分匹配查詢

空值查詢ISNULL某個(gè)字段沒(méi)有值稱之為具有空值(NULL)。通常沒(méi)有為一個(gè)列輸入值時(shí),該列的值就是空值。空值不同于零和空格,它不占任何存儲(chǔ)空間。例:某些學(xué)生選課后沒(méi)有參加考試,有選課記錄,但沒(méi)有考試成績(jī),考試成績(jī)?yōu)榭罩担@與參加考試,成績(jī)?yōu)榱惴值牟煌?/p>

insertSC(Sno,Cno)values('02','c2')例:查詢沒(méi)有考試成績(jī)的學(xué)生的學(xué)號(hào)和相應(yīng)的課程號(hào)。SELECTSNO,CNOFROMSCWHERESCOREISNULL注意:這里的空值條件為ISNULL,不能寫成SCORE=NULL。4.3.3連接查詢當(dāng)查詢同時(shí)涉及兩個(gè)以上的表時(shí),稱為連接查詢。這種查詢是關(guān)系數(shù)據(jù)庫(kù)中非常重要的查詢,包括等值連接查詢、自然連接查詢、非等值連接查詢、自身連接查詢、外連接查詢和復(fù)合條件查詢等。連接操作的目的:通過(guò)加在連接字段的條件將多個(gè)表連接起來(lái),以便從多個(gè)表中查詢數(shù)據(jù)。而表之間的聯(lián)系是通過(guò)表的字段值來(lái)體現(xiàn)的,這種字段稱為連接字段,要求各連接字段類型必須是可比的,用來(lái)連接兩個(gè)表的條件稱為連接條件。連接方法:連接條件通過(guò)查詢語(yǔ)句中WHERE子句表達(dá),連接條件和元組選擇條件之間用AND操作符銜接。表之間滿足一定的條件的行進(jìn)行連接,此時(shí)FROM子句中指明進(jìn)行連接的表名,WHERE子句指明連接的列名及其連接條件。4.3.3連接查詢例:查詢王建平同學(xué)所選修課程及其成績(jī)。 SELECTSC.Sno,Sname,ScoreFROMStudent,SC WHERE(Student.Sno=SC.Sno)AND(Sname=‘王建平’)其中:1)Sno為連接字段,Student.Sno=SC.Sno

為連接條件。Sname=‘王建平’為元組選擇條件,一般在WHERE子句中,同時(shí)有元組選擇條件及連接條件,連接條件在前,元組選擇條件在后,中間用AND操作符銜接。2)引用列名Sno時(shí)要加上表名前綴,是因?yàn)閮蓚€(gè)表中的列名相同,必須用表名前綴來(lái)確切說(shuō)明所指列屬于哪個(gè)表,以避免二義性。如果列名是唯一的,比如Sname,就可以不加前綴。3)上面的操作是將Student表中的Sno和SC表中的Sno相等的行連接,同時(shí)選取Sname為“王建平”的元組,然后再在SC.Sno,Sname,Score列上投影,這是連接、選取和投影的操作組合。4.3.3連接查詢對(duì)于連接查詢來(lái)說(shuō),連接條件的一般格式為:[<表名1>.]<列名1><比較運(yùn)算符>[<表名2>.]<列名2>其中:比較運(yùn)算符主要有:=、>、<、>=、<=、!=,當(dāng)比較運(yùn)算符為“=“時(shí)稱為等值連接,其他情況為非等值連接。通俗地講,DBMS執(zhí)行連接操作的過(guò)程是:首先在表1中找到第1個(gè)元組,然后從頭開(kāi)始掃描表2,逐一查找滿足連接條件的元組,找到后就將表1中的第1個(gè)元組與該元組拼接起來(lái),形成結(jié)果表中一個(gè)元組。表2全部查找完后,再找表1中第2個(gè)元組,然后再?gòu)念^開(kāi)始掃描表2,逐一查找滿足連接條件的元組,找到后就將表1中的第2個(gè)元組與該元組拼接起來(lái),形成結(jié)果表中一個(gè)元組。重復(fù)上述操作,直到表1中全部元組都處理完畢為止。如果多表連接沒(méi)有WHERE子句,則可知其為笛卡爾積運(yùn)算。1.等值連接查詢連接運(yùn)算符為“=”的連接操作稱為等值連接,其語(yǔ)法格式為:[<表名1>.]<列名1>=[<表名2>.]<列名2>例:查詢每個(gè)學(xué)生及其選修課程的情況。SELECTStudent.*,SC.*FROMStudent,SCWHEREStudent.Sno=SC.SnoSnoSnameSexSBirthDaySdeptSnoCnoScoreS01王建平男1984-1-12自動(dòng)化S01C0192S01王建平男1984-1-12自動(dòng)化S01C0384S02劉華女1984-7-1自動(dòng)化S02C0190S02劉華女1984-7-1自動(dòng)化S02C0294S02劉華女1984-7-1自動(dòng)化S02C0382S03范林軍女1983-6-30計(jì)算機(jī)S03C0172S03范林軍女1983-6-30計(jì)算機(jī)S03C0290S04李偉男1985-4-1數(shù)學(xué)S04C03752.自然連接自然連接是等值連接的一種特殊情況,當(dāng)?shù)戎颠B接中的連接字段相同、并且在SELECT子句中去除了重復(fù)字段時(shí),則該連接操作為自然連接。例:對(duì)上題用自然連接完成。SELECTStudent.Sno,Sname,Sex,SBirthDay,Sdept,Cno,ScoreFROMStudent,SCWHEREStudent.Sno=SC.Sno由于Sname,Sex,SBirthDay,Score等屬性列在Student與SC表中是唯一的,故引用時(shí)可以去掉表名前綴。而Sno屬性列在這兩個(gè)表中都有,因此引用時(shí)必須加上表名前綴。結(jié)果為:2.自然連接SnoSnameSexSBirthDaySdeptCnoScoreS01王建平男1984-1-12自動(dòng)化C0192S01王建平男1984-1-12自動(dòng)化C0384S02劉華女1984-7-1自動(dòng)化C0190S02劉華女1984-7-1自動(dòng)化C0294S02劉華女1984-7-1自動(dòng)化C0382S03范林軍女1983-6-30計(jì)算機(jī)C0172S03范林軍女1983-6-30計(jì)算機(jī)C0290S04李偉男1985-4-1數(shù)學(xué)C03753.自身連接連接操作不僅可以在兩個(gè)表中進(jìn)行,同一個(gè)表也可以與自己進(jìn)行連接,稱為表的自身連接,主要用于同一個(gè)表中的數(shù)據(jù)的比較。由于自身連接是對(duì)同一張表進(jìn)行連接查詢,因此各表必須起別名以示區(qū)別,且由于所有屬性名都是同名屬性,因此必須使用別名前綴加以限定。例:查詢每一門課的間接先修課(即先修課的先修課)SELECTFIRST.Cno,F(xiàn)IRST.Cname,SECOND.CPre_CnoFROMCourseFIRST,CourseSECONDWHEREFIRST.Pre_Cno=SECOND.Cno3.自身連接CnoCnamePre_CnoC02數(shù)據(jù)結(jié)構(gòu)C03數(shù)據(jù)庫(kù)C05C04DB_設(shè)計(jì)C02C06計(jì)算機(jī)網(wǎng)絡(luò)C05C07操作系統(tǒng)表中”Pre_Cno”屬性列沒(méi)有值的行,表示該課程有先修課,但沒(méi)有間接先修課。4.外連接在前面介紹的連接操作中,結(jié)果集中只保留了符合連接條件的元組,而排除了表中沒(méi)有對(duì)應(yīng)的或匹配的元組情況,這種連接稱為內(nèi)連接。如果要求查詢結(jié)果集中保留非匹配的元組,則需要執(zhí)行外部連接操作。如以Student表為主體,輸出所有學(xué)生的基本情況及選課情況,即使沒(méi)有選課的學(xué)生也希望輸出其基本信息,這時(shí)就必須使用外連接操作。外連接分為左連接和右連接兩種類型:左連接操作是在結(jié)果集中保留連接表達(dá)式左表中的非匹配記錄。右連接操作是在結(jié)果集中保留連接表達(dá)式右表中的非匹配記錄。商品化的DBMS一般都支持外連接,但具體的SQL命令卻有差別。在SQLServer2000中,外連接操作符有兩種:LEFTJOINON用于左連接。RIGHTJOINON用于右連接。4.外連接將例4-31改為左連接操作,如下所示:SELECTStudent.Sno,Sname,Sex,SBirthDay,

Sdept,Cno,ScoreFROMStudentLEFTJOINSCONStudent.Sno=SC.Sno以上的左連接也可以用如下的右連接操作代替。SELECTStudent.Sno,Sname,Sex,SBirthDay,Sdept,

Cno,ScoreFROMSCRIGHTJOINStudentONSC.Sno=Student.Sno結(jié)果完全一樣,如下圖所示。4.外連接SnoSnameSexSBirthDaySdeptCnoScoreS01王建平男1984-1-12自動(dòng)化C0192S01王建平男1984-1-12自動(dòng)化C0384S02劉華女1984-7-1自動(dòng)化C0190S02劉華女1984-7-1自動(dòng)化C0294S02劉華女1984-7-1自動(dòng)化C0382S03范林軍女1983-6-30計(jì)算機(jī)C0172S03范林軍女1983-6-30計(jì)算機(jī)C0290S04李偉男1985-4-1數(shù)學(xué)C0375S05黃彥男1985-4-1數(shù)學(xué)NULLNULLS06何淳男1985-6-30數(shù)學(xué)NULLNULL4.3.4使用SQL函數(shù)查詢1.字符串函數(shù)ASCII()函數(shù):返回字符表達(dá)式最左端字符的ASCII碼值。CHAR()函數(shù):用于將ASCII碼轉(zhuǎn)換為字符。如果沒(méi)有輸入0-255之間的ASCII碼值,則返回一個(gè)NULL值。LOWER()函數(shù):將字符串全部轉(zhuǎn)換為小寫。UPPER()函數(shù):將字符串全部轉(zhuǎn)換為大寫。STR()函數(shù):將數(shù)值型數(shù)據(jù)轉(zhuǎn)換為字符型數(shù)據(jù)。LTRIM()函數(shù):將字符串頭部的空格去掉。RTRIM()函數(shù):將字符串尾部的空格去掉。LEFT()函數(shù):返回從字符串左邊開(kāi)始的指定個(gè)數(shù)的字符。RIGHT()函數(shù):返回從字符串右邊開(kāi)始的指定個(gè)數(shù)的字符。SUBSTRING()函數(shù):返回字符串表達(dá)式的一部分。2.日期函數(shù)GETDATE()函數(shù):以DATETIME的默認(rèn)格式返回系統(tǒng)當(dāng)前的日期和時(shí)間。DAY()函數(shù):返回指定日期的天的整數(shù)。MONTH()函數(shù):返回指定日期月份的整數(shù)。YEAR()函數(shù):返回指定日期的年份的整數(shù)。DATEADD(,,)函數(shù):返回兩個(gè)日期之間的時(shí)間和。DATEDIFF(,,)函數(shù):返回兩個(gè)日期之間的時(shí)間間隔。3.分組函數(shù)分組函數(shù)又稱為聚集函數(shù),SQLServer2000提供了許多聚集函數(shù),增強(qiáng)了基本檢索能力。常用的聚集函數(shù)函數(shù)名稱功能AVG按列計(jì)算平均值SUM按列計(jì)算值的總和MAX求一列中的最大值MIN求一列中的最小值COUNT按列值計(jì)個(gè)數(shù)例:求學(xué)號(hào)為S1學(xué)生的總分和平均分。SELECTSUM(SCORE)ASTotalScore,AVG(SCORE)ASAveScore

FROMSCWHERE(SNO='S1')注意:函數(shù)SUM和AVG只能對(duì)數(shù)值型字段進(jìn)行計(jì)算。單獨(dú)使用聚集函數(shù)時(shí)(Select子句中的列名都是聚集函數(shù)形式),表示對(duì)所有記錄進(jìn)行聚集。3.分組函數(shù)例:求選修C1號(hào)課程的最高分、最低分及之間相差的分?jǐn)?shù)

SELECTMAX(SCORE)ASMaxScore,MIN(SCORE)AS

MinScore,MAX(SCORE)-MIN(SCORE)ASDiffFROMSCWHERE(CNO='C1')

例:求學(xué)生總數(shù)

SELECTCOUNT(SNO)FROMStudent3.分組函數(shù)3.分組函數(shù)例:求參加學(xué)修課程的學(xué)生總數(shù)

SELECTCOUNT(distinctSNO)FROMSC注意:加入關(guān)鍵字DISTINCT后表示消去重復(fù)行,COUNT函數(shù)對(duì)空值不計(jì)算,但對(duì)零進(jìn)行計(jì)算。例:統(tǒng)計(jì)有成績(jī)同學(xué)的人數(shù)SELECTCOUNT(SCORE)FROMSC上例中成績(jī)?yōu)榱愕耐瑢W(xué)計(jì)算在內(nèi),沒(méi)有成績(jī)(即為空值)的不計(jì)算。3.分組函數(shù)例:求學(xué)生總數(shù)

SELECTCOUNT(*)FROMStudentCOUNT(*)用來(lái)統(tǒng)計(jì)元組的個(gè)數(shù)不消除重復(fù)行,不允許使用DISTINCT關(guān)鍵字。4.3.5分組查詢GROUPBY子句:結(jié)果集按某一列或多列的值分組,值相等的為一組,一個(gè)分組以一個(gè)元組的形式出現(xiàn),聚集函數(shù)一般與分組操作一起使用。例:查詢每位學(xué)生的學(xué)號(hào)以及該學(xué)生選修課程的門數(shù)。SELECTSno,COUNT(*)ASC_NUMFROMSCGROUPBYSno運(yùn)行結(jié)果分析:GROUPBY子句按Sno的值分組,所有具有相同Sno值的元組為一組,對(duì)每一組使用函數(shù)COUNT進(jìn)行計(jì)算,統(tǒng)計(jì)出各位學(xué)生選修課程的門數(shù)。注意,在SELECT子句中,除聚集函數(shù)外的屬性名必須全部出現(xiàn)在GroupBy子句中。SnoC_NUMS012S023S032S0412.HAVING子句HAVING子句:用于篩選分組的最終輸出結(jié)果,只有滿足HAVING子句指定條件的組才輸出。在使用HAVING子句進(jìn)行分組篩選時(shí),需注意以下三點(diǎn):HAVING子句針對(duì)聚集函數(shù)的結(jié)果值進(jìn)行篩選(選擇),它作用于分組計(jì)算結(jié)果集,并跟在GroupBy子句的后面,與GroupBy子句成對(duì)出現(xiàn)。Having子句構(gòu)造的條件是聚集函數(shù)的比較式,且聚集函數(shù)的比較式也只能通過(guò)Having子句給出。Having中的聚集函數(shù)可與SELECT中的不同。2.HAVING子句例:查詢選修兩門以上課程的學(xué)生學(xué)號(hào)和選課門數(shù)

SELECTSNO,COUNT(*)ASSC_NUMFROMSCGROUPBYSNOHAVINGCOUNT(*)>=2GROUPBY子句按SNO的值分組,所有具有相同SNO的元組為一組,對(duì)每一組使用函數(shù)COUNT進(jìn)行計(jì)算,統(tǒng)計(jì)出每位學(xué)生選課的門數(shù)。HAVING子句去掉不滿足COUNT(*)>=2的組。說(shuō)明Having子句中必須聚集函數(shù)的比較式,且聚集函數(shù)的比較式也只能通過(guò)Having子句給出。Having中的聚集函數(shù)可與Select中的不同。例:查詢至少選修2門課的學(xué)生的學(xué)號(hào)及平均成績(jī)

SelectSno,AVG(Score)FromSCGroupBySNoHavingCOUNT(*)>2說(shuō)明當(dāng)在一個(gè)SQL查詢中同時(shí)使用WHERE子句,GROUPBY子句和HAVING子句時(shí),其順序是

WHERE-GROUPBY-HAVINGWHERE與HAVING子句的根本區(qū)別在于作用對(duì)象不同。1)Where決定哪些元組被選擇參加運(yùn)算,作用于關(guān)系中的元組2)Having決定哪些分組符合要求,作用于分組3)聚合函數(shù)的條件關(guān)系必須用Having,Where中不應(yīng)出現(xiàn)聚合函數(shù)4.3.6嵌套查詢?cè)赪HERE子句中包含一個(gè)形如SELECT-FROM-WHERE的查詢塊,此查詢塊稱為子查詢或嵌套查詢,包含子查詢的語(yǔ)句稱為父查詢或外部查詢。嵌套查詢可以將一系列簡(jiǎn)單查詢構(gòu)成復(fù)雜查詢,增強(qiáng)查詢能力。嵌套查詢?cè)趫?zhí)行時(shí)由里向外處理,每個(gè)子查詢是在上一級(jí)外部查詢處理之前完成,父查詢要用到子查詢的結(jié)果。4.3.6嵌套查詢以層層嵌套的方式來(lái)構(gòu)造程序正是SQL中“結(jié)構(gòu)化”的含義所在,一般嵌套查詢分為以下兩類:不相關(guān)子查詢:查詢條件不依賴于父查詢,由里向外逐層處理。即每個(gè)子查詢?cè)谏弦患?jí)查詢處理之前求解,子查詢的結(jié)果用于建立其父查詢的查找條件。相關(guān)子查詢:查詢條件依賴于父查詢,首先取外層查詢中表的第一個(gè)元組,根據(jù)它與內(nèi)層查詢相關(guān)的屬性值處理內(nèi)層查詢,若WHERE子句返回值為真,則取此元組放入結(jié)果表,然后再取外層表的下一個(gè)元組。重復(fù)這一過(guò)程,直至外層表全部檢查完為止。在嵌套查詢中,使用以下謂詞引出子查詢:IN謂詞、比較運(yùn)算符、ANY或ALL謂詞、EXISTS謂詞。下面分別介紹各類子查詢。1.使用比較操作符的嵌套查詢當(dāng)用戶能確切知道子查詢返回單值時(shí),可用比較運(yùn)算符(=,>,<,>=,<=,!=)連接父查詢與子查詢。例:找出和學(xué)號(hào)“S04”的學(xué)生同一系的所有學(xué)生。 SELECT*FROMStudent WHERESdept=(SELECTSdeptFROMStudentWHERESno=‘S04’)此查詢相當(dāng)于分成兩個(gè)查詢塊來(lái)執(zhí)行。先執(zhí)行子查詢,再執(zhí)行父查詢。SnoSnameSexSBirthDaySdeptS04李偉男1985-4-1數(shù)學(xué)S05黃彥男1985-4-1數(shù)學(xué)S06何淳男1985-6-30數(shù)學(xué)2.使用IN操作符的嵌套查詢例:查詢選修了“C02”課程的學(xué)生姓名和所在系。此查詢要求可以分以下三個(gè)步驟來(lái)完成:確定選修“C02”課程的學(xué)生的學(xué)號(hào)。

SELECTSnoFROMSCWHERECno=‘C02’返回結(jié)果,學(xué)號(hào)分別為“S02”,及“S03”。查找學(xué)號(hào)為“S02”,及“S03”學(xué)生的姓名和所在系。

SELECTSname,SdeptFROMStudentWHERESnoIN(‘S02’,‘S03’)構(gòu)造嵌套查詢,將第一步查詢結(jié)果嵌入第二步查詢條件中。SELECTSname,SdeptFROMStudentWHERESnoIN(SELECTSnoFROMSCWHERECno=‘C02’)此查詢?yōu)椴幌嚓P(guān)子查詢,DBMS在求解該類查詢時(shí),也是分步去做的,先執(zhí)行子查詢,即先查找選修課程“C02”的學(xué)生的學(xué)號(hào),然后再查詢這些學(xué)生的姓名及所在系。3.使用ANY或ALL操作符的嵌套查詢?nèi)绻硬樵兊姆祷刂挡恢挂粋€(gè),而是一個(gè)集合時(shí),則不能直接使用比較運(yùn)算符,可以在比較運(yùn)算符和子查詢之間插入ANY或ALL。謂詞注釋謂詞注釋>ANY大于子查詢結(jié)果中任意值<=ANY小于等于子查詢結(jié)果中的任意值>ALL大于子查詢結(jié)果中所有值<=ALL小于等于子查詢結(jié)果中的任意值<ANY小于子查詢結(jié)果中任意值=ANY等于子查詢結(jié)果中的任意值<ALL小于子查詢結(jié)果中所有值=ALL等于子查詢結(jié)果中的所有值>=ANY大于等于子查詢結(jié)果中任意值<>ANY不等于子查詢結(jié)果中的任意值>=ALL大于等于子查詢結(jié)果中所有值<>ALL不等于子查詢結(jié)果中的所有值3.使用ANY或ALL操作符的嵌套查詢查詢不超過(guò)自動(dòng)化系所有學(xué)生年齡的、非自動(dòng)化系的學(xué)生的學(xué)號(hào)、姓名。SELECTSno,SnameFROMStudentWHERESdept<>‘自動(dòng)化’ANDSBirthDay<=ALL(SELECTSBirthDayFROMStudentWHERESdept=‘自動(dòng)化’)結(jié)果為:SnoSnameS03范林軍S04李偉S05黃彥3.使用ANY或ALL操作符的嵌套查詢DBMS執(zhí)行此查詢時(shí),首先處理子查詢,查到自動(dòng)化系中所有學(xué)生的年齡,構(gòu)成一個(gè)集合,然后處理父查詢,查找出所有不是自動(dòng)化系且年齡不超過(guò)該集合的學(xué)生。本查詢也可以使用聚集函數(shù)來(lái)實(shí)現(xiàn),其SQL語(yǔ)句為:SELECTSno,SnameFROMStudentWHERESdept<>‘自動(dòng)化’ANDSBirthDay<=(SELECTMIN(SBirthDay)FROMStudentWHERESdept=‘自動(dòng)化’)一般來(lái)說(shuō),利用謂詞ANY或ALL的子查詢也可以聚集函數(shù)來(lái)實(shí)現(xiàn),而且,應(yīng)用聚集函數(shù)實(shí)現(xiàn)子查詢通常比直接用謂詞ANY或ALL查詢效率要高。謂詞ANY或ALL與聚集函數(shù)、謂詞IN在條件表達(dá)式上的等價(jià)對(duì)應(yīng)關(guān)系。3.使用ANY或ALL操作符的嵌套查詢謂詞ANY或ALL聚集函數(shù)或謂詞IN謂詞ANY或ALL聚集函數(shù)或謂詞IN>ANY>MIN<=ANY<=MAX>ALL>MAX<=ALL<=MIN<ANY<MAX=ANYIN<ALL<MIN=ALL沒(méi)有等價(jià)的聚集函數(shù)>=ANY>=MIN<>ANY沒(méi)有等價(jià)的聚集函數(shù)>=ALL>=MAX<>ALLNOTIN4.使用[NOT]EXISTS操作符的嵌套查詢[NOT]EXISTS謂詞相當(dāng)于存在量詞“”。帶有EXISTS謂詞的子查詢不返回任何數(shù)據(jù),只產(chǎn)生邏輯值真(True)或邏輯值假(False),即若內(nèi)層子查詢結(jié)果非空則返回真值,否則返回假值。由于帶EXISTS的子查詢只返回真或假值,給出列名無(wú)意義,所有由EXISTS引出的子查詢的目標(biāo)列表達(dá)式通常使用通配符“*”。這類查詢稱為相關(guān)子查詢,其特點(diǎn)是子查詢的查詢條件依賴外層父查詢的某個(gè)屬性值,即子查詢不能夠單獨(dú)運(yùn)行。與EXISTS謂詞對(duì)應(yīng)的是NOTEXISTS謂詞,即若內(nèi)層子查詢結(jié)果非空則返回假值,否則返回真值。4.使用[NOT]EXISTS操作符的嵌套查詢例:查詢所有選修了“C01”課程的學(xué)生姓名。思路分析:本查詢涉及Student和SC關(guān)系,首先在Student中依次取每個(gè)元組的Sno值,用此值去檢查SC關(guān)系,若SC中存在這樣的元組,即SC表中學(xué)號(hào)是Student.Sno,且課程號(hào)是‘C01’的記錄,則Student表中該條記錄作為結(jié)果集出現(xiàn)。

SELECTSnameFROMStudentWHEREEXISTS(SELECT*FROMSCWHERESno=Student.SnoAND

Cno=‘C01’)結(jié)果為:Sname王建平劉華范林軍4.使用[NOT]EXISTS操作符的嵌套查詢SQL語(yǔ)言只有存在量詞“”,沒(méi)有表示全稱量詞“”,但可以用命題邏輯的等價(jià)公式把帶有全稱量詞的謂詞轉(zhuǎn)換為等價(jià)的帶存在量詞的謂詞:。例:查詢選修了所有課程的學(xué)生姓名和所在系。由于沒(méi)有全稱量詞,可將題目的意思轉(zhuǎn)化為等價(jià)為:查詢這樣的學(xué)生,沒(méi)有一門功課是他不選修的。SELECTSname,SdeptFROMStudentWHERENOTEXISTS(SELECT*FROMCourseWHERENOTEXISTS(SELECT*FROMSCWHERESno=Student.SnoANDCno=Course.Cno))查詢的排序當(dāng)需要對(duì)查詢結(jié)果排序時(shí),應(yīng)該使用ORDERBY子句,ORDERBY子句必須出現(xiàn)在其他子句之后,排序方式可以指定,DESC為降序,ASC為升序,缺省時(shí)為升序例:查詢選修C1的學(xué)生學(xué)號(hào)和成績(jī),并按成績(jī)降序排列。SELECTSNO,SCOREFROMSCWHERECNO='C1'ORDERBYSCOREDESC舉例例:求選課在三門以上且各門課程均及格的學(xué)生的學(xué)號(hào)及其總成績(jī),查詢結(jié)果按總成績(jī)降序列出。SELECTSNO,SUM(SCORE)ASTotalScore

FROMSCWHERESCORE>=60GROUPBYSNOHAVINGCOUNT(*)>=3ORDERBYSUM(SCORE)DESC4.3.7集合查詢1.使用UNION操作符的集合查詢:一般商用數(shù)據(jù)庫(kù)支持并操作、交操作和差操作,不過(guò)T-SQL僅支持并操作。并操作使用UNION操作符將多個(gè)查詢結(jié)果合并起來(lái),系統(tǒng)會(huì)自動(dòng)去掉重復(fù)的元組,語(yǔ)法格式為:<查詢塊>UNION<查詢塊>注意:參加UNION操作的各結(jié)果表的列數(shù)必須相同。對(duì)應(yīng)項(xiàng)的數(shù)據(jù)類型也必須相同。例:查詢自動(dòng)化系的學(xué)生及年齡不大于19歲的學(xué)生。SELECT*FROMStudentWHERESdept=‘自動(dòng)化’UNIONSELECT*FROMStudentWHERE(YEAR(GETDATE())-YEAR(SBirthDay))<=192.使用MINUS操作符的集合查詢標(biāo)準(zhǔn)SQL語(yǔ)言提供了集合差的操作,交操作使用MINUS操作符對(duì)兩個(gè)查詢結(jié)果求差,語(yǔ)法格式為:<查詢塊>MINUS<查詢塊>例:查詢自動(dòng)化系的與年齡不大于19歲的學(xué)生的差集。SELECT*FROMStudentWHERESdept=‘自動(dòng)化’MINUSSELECT*FROMStudentWHERE(YEAR(GETDATE())-YEAR(SBirthDay))<=192.使用MINUS操作符的集合查詢?cè)赟QLServer2000支持的T-SQL中,并不支持MINUS操作符,但是可以使用其他方式來(lái)實(shí)現(xiàn)。如對(duì)于上例,可以在T-SQL中使用如下SQL命令,達(dá)到相同的效果:SELECTDISTINCT*FROMStudentWHERESdept=‘自動(dòng)化’AND(YEAR(GETDATE())-YEAR(SBirthDay))>20SnoSnameSexSdeptSmonSBirthDayS01王建平男自動(dòng)化04011984-1-12S02劉華女自動(dòng)化04011984-7-13.使用INTERSECT操作符的集合查詢標(biāo)準(zhǔn)SQL語(yǔ)言提供了集合交的操作,交操作使用INTERSECT操作符對(duì)多個(gè)查詢結(jié)果求取交集,語(yǔ)法格式為:<查詢塊>INTERSECT<查詢塊>例:查詢自動(dòng)化系的且年齡不大于19歲的學(xué)生。SELECT*FROMStudentWHERESdept=‘自動(dòng)化’INTERSECTSELECT*FROMStudentWHERE(YEAR(GETDATE())-YEAR(SBirthDay))<=194.2數(shù)據(jù)更新SQL語(yǔ)言的數(shù)據(jù)更新語(yǔ)句DML主要包括插入數(shù)據(jù)、修改數(shù)據(jù)和刪除數(shù)據(jù)三種語(yǔ)句。插入數(shù)據(jù)記錄:插入數(shù)據(jù)是把新的記錄插入到一個(gè)存在的表中。學(xué)號(hào)姓名性別年齡S1張力男214.4.1插入數(shù)據(jù)插入數(shù)據(jù)使用語(yǔ)句INSERTINTO,可分為以下幾種情況。1、插入一行新記錄,語(yǔ)法格式為:INSERTINTO<表名>[(<屬性列1>[,<屬性列2>…])]VALUES(<值1>[,<值2>…])其中:<表名>是指要插入新記錄的表。<列名>是可選項(xiàng),指定待添加數(shù)據(jù)的列。VALUES子句指定待添加數(shù)據(jù)的具體值。該命令的功能是增加一個(gè)新元組,并將“值1”賦值給“屬性列1”,“值2”賦值給“屬性列2”,以此類推。INTO子句中沒(méi)有出現(xiàn)的屬性列,其新元組在這些列上取空值。

4.4.1插入數(shù)據(jù)在使用該命令插入單個(gè)元組時(shí),需注意以下事項(xiàng):1)必須用逗號(hào)將各個(gè)數(shù)據(jù)分開(kāi),字符型數(shù)據(jù)要用單引號(hào)引起來(lái)。2)屬性列的順序不一定要和表定義時(shí)的順序一致,但VALUES子句值的排列順序必須和列名表中的屬性列順序一致,個(gè)數(shù)相等,數(shù)據(jù)類型一一對(duì)應(yīng)。3)如果INTO子句中沒(méi)有指定列名,則新插入的記錄必須在每個(gè)屬性列上均有值,且VALUES子句中值的排列順序要和表定義時(shí)的順序一致,個(gè)數(shù)相等,數(shù)據(jù)類型一一對(duì)應(yīng)。4.4.1插入數(shù)據(jù)例:在學(xué)生表Student中插入一條學(xué)生記錄

(學(xué)號(hào):S7;姓名:鄭冬;性別:女;年齡:21)。學(xué)號(hào)姓名性別年齡S1張力男21

INSERTINTOStudent(學(xué)號(hào),姓名,性別,年齡)VALUES(‘s7’,‘鄭冬’,‘女’,21)注意:必須用逗號(hào)將各個(gè)數(shù)據(jù)分開(kāi),字符型數(shù)據(jù)要用單引號(hào)括起來(lái)。4.4.1插入數(shù)據(jù)INTO子句中沒(méi)有指定列名,則新插入的記錄必須在每個(gè)屬性列上均有值,且VALUES子句中值的排列順序要和表中各屬性列的排列順序一致。

INSERTINTOStudentVALUES(‘s7’,‘鄭冬’,‘女’,21)學(xué)號(hào)姓名性別年齡S1張力男21

INSERTINTOStudent(學(xué)號(hào),姓名,性別,年齡)VALUES(‘s7’,‘鄭冬’,‘女’,21)2.插入子查詢結(jié)果集利用子查詢進(jìn)行數(shù)據(jù)的插入,主要用于表間數(shù)據(jù)的拷貝,即從基本表中提取某些數(shù)據(jù)插入到另一表中,其語(yǔ)法格式為:INSERTINTO<表名>[(<列名1>[,<列名2>…])]子查詢例:求出各位同學(xué)的學(xué)號(hào)、平均成績(jī),及總分,并把結(jié)果存放在新表AVGSCORE中。1)首先建立新表AVGSCORE,用來(lái)存放學(xué)生的學(xué)號(hào)、平均成績(jī)與總成績(jī)。CREATETABLEAVGSCORE(SnoVARCHAR(10),AVGGRDDECIMAL(4,2),SUMGRDDECIMAL(5,1))2.插入子查詢結(jié)果集然后利用子查詢求出SC表中各個(gè)學(xué)生的平均成績(jī)及總成績(jī),把結(jié)果存放在新表AVGSCORE中。INSERTINTOAVGSCORESELECTSno,AVG(Score),SUM(Score)FROMSCGROUPBYSno

執(zhí)行SELECT*FROMAVGSCORE,結(jié)果為:SnoAVGGRDSUMGRDS0188176S0288.67266S0381162S04C03754.4.2修改數(shù)據(jù)SQL語(yǔ)言可以使用UPDATE語(yǔ)句對(duì)表中的一行或多行記錄的某些列值進(jìn)行修改,其語(yǔ)法格式為:UPDATE<表名>SET<列名>=<表達(dá)式>[,<列名>=<表達(dá)式>]…[WHERE<條件>]其中:<表名>是指要修改的表;SET子句給出要修改的列及其修改后的值;WHERE子句指定待修改的記錄應(yīng)當(dāng)滿足的條件,WHERE子句省略時(shí),則修改表中的所有記錄。1.修改基本表數(shù)據(jù)例:把學(xué)號(hào)為“S02”的學(xué)生的專業(yè)改為計(jì)算機(jī)系。UPDATEStudentSETSdept=‘計(jì)算機(jī)’WHERESno=‘S02’該語(yǔ)句執(zhí)行后,執(zhí)行SELECT*FROMStudent,結(jié)果為:SnoSnameSexSdeptSmonSBirthDayS01王建平男自動(dòng)化04011984-1-12S02劉華女計(jì)算機(jī)04011984-7-1S03范林軍女計(jì)算機(jī)03011983-6-30S04李偉男數(shù)學(xué)05011985-4-1S05黃彥男數(shù)學(xué)05011985-4-1S06何淳男數(shù)學(xué)05011985-6-302.用子查詢提供要修改的值例:把所有教師的工資提高到平均工資的1.2倍。UPDATETeacherSETSalary=(SELECT1.2*AVG(Salary)FROMTeacher)3.用子查詢選擇要修改的行例:將計(jì)算機(jī)系所有學(xué)生的成績(jī)置零。UPDATESCSETScore=0WHERESnoIN(SELECTSnoFROMStudentWHE

溫馨提示

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