第2章 SQL語(yǔ)言初步_第1頁(yè)
第2章 SQL語(yǔ)言初步_第2頁(yè)
第2章 SQL語(yǔ)言初步_第3頁(yè)
第2章 SQL語(yǔ)言初步_第4頁(yè)
第2章 SQL語(yǔ)言初步_第5頁(yè)
已閱讀5頁(yè),還剩105頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第2章SQL語(yǔ)言初步2.1SQL的基本概念2.2基本表、索引的創(chuàng)建、刪除和修改操作2.3SQL的查詢(xún)語(yǔ)句——SELECT2.4含有子查詢(xún)的數(shù)據(jù)更新2.5視圖2.1SQL的基本概念

SQL支持?jǐn)?shù)據(jù)庫(kù)的三級(jí)模式結(jié)構(gòu),如圖2―1所示。從圖中可以看出,模式與基本表相對(duì)應(yīng),外模式與視圖相對(duì)應(yīng),內(nèi)模式對(duì)應(yīng)于存儲(chǔ)文件?;颈砗鸵晥D都是關(guān)系。圖2―1SQL支持的數(shù)據(jù)庫(kù)模式1.基本表(BaseTable)

基本表是模式的基本內(nèi)容。每個(gè)基本表都是一個(gè)實(shí)際存在的關(guān)系。2.視圖(View)

視圖是外模式的基本單位,用戶(hù)通過(guò)視圖使用數(shù)據(jù)庫(kù)中基于基本表的數(shù)據(jù)(基本表也可作為外模式使用)。一個(gè)視圖雖然也是一個(gè)關(guān)系,但是它與基本表有著本質(zhì)的區(qū)別。任何一個(gè)視圖都是從已有的若干關(guān)系導(dǎo)出的關(guān)系,它只是邏輯上的定義,實(shí)際并不存在。在導(dǎo)出時(shí),給出一個(gè)視圖的定義(從哪幾個(gè)關(guān)系中,根據(jù)什么標(biāo)準(zhǔn)選取數(shù)據(jù),組成一個(gè)什么名稱(chēng)的關(guān)系等),此定義存放在數(shù)據(jù)庫(kù)(數(shù)據(jù)字典)中,但沒(méi)有真正執(zhí)行此定義(并未真正生成此關(guān)系)。當(dāng)使用某一視圖查詢(xún)時(shí),將實(shí)時(shí)從數(shù)據(jù)字典中調(diào)出此視圖的定義;根據(jù)此定義以及現(xiàn)場(chǎng)查詢(xún)條件,從規(guī)定的若干關(guān)系中取出數(shù)據(jù),組織成查詢(xún)結(jié)果,展現(xiàn)給用戶(hù)。因此,視圖是虛表,實(shí)際并不存在,只有定義存放在數(shù)據(jù)字典中。當(dāng)然,用戶(hù)可在視圖上再定義視圖,就像在基本表上定義視圖一樣,因?yàn)橐晥D也是關(guān)系。因而對(duì)于用戶(hù)來(lái)說(shuō),使用一個(gè)視圖和使用一個(gè)基本表的感覺(jué)是一樣的。只是對(duì)視圖進(jìn)行修改時(shí),有時(shí)會(huì)產(chǎn)生一些麻煩(將在具體介紹視圖操作時(shí)講述)。3.存儲(chǔ)文件存儲(chǔ)文件是內(nèi)模式的基本單位。每一個(gè)存儲(chǔ)文件存儲(chǔ)一個(gè)或多個(gè)基本表的內(nèi)容。一個(gè)基本表可有若干索引,索引也存儲(chǔ)在存儲(chǔ)文件中。存儲(chǔ)文件的存儲(chǔ)結(jié)構(gòu)對(duì)用戶(hù)是透明的。下面將介紹SQL的基本語(yǔ)句。各廠(chǎng)商的RDBMS實(shí)際使用的SQL語(yǔ)言,與標(biāo)準(zhǔn)SQL語(yǔ)言都有所差異及擴(kuò)充。因此,具體使用時(shí),應(yīng)參閱實(shí)際系統(tǒng)的有關(guān)手冊(cè)。2.2基本表、索引的創(chuàng)建、刪除和修改操作2.2.1創(chuàng)建基本表——CREATETABLE

一、語(yǔ)句格式

CREATETABLE<表名>(<列定義清單>[<,表級(jí)完整性約束>])其中,一對(duì)方括號(hào)內(nèi)的內(nèi)容為可選項(xiàng)。二、說(shuō)明(1)<表名>:規(guī)定所創(chuàng)建的基本表的名稱(chēng)。在一個(gè)數(shù)據(jù)庫(kù)中,不允許有兩個(gè)基本表同名(應(yīng)該更嚴(yán)格的說(shuō),任何兩個(gè)關(guān)系都不能同名,這就把視圖也包括了)。(2)<列定義清單>:規(guī)定了該表中所有屬性列的結(jié)構(gòu)情況。每一列的內(nèi)容有:<列名><類(lèi)型>[<該列的完整性約束>]兩列內(nèi)容之間用西文逗號(hào)隔開(kāi)。(3)<列名>:規(guī)定了該列(屬性)的名稱(chēng)。一個(gè)表中不能有兩列同名。(4)<類(lèi)型>:規(guī)定了該列的數(shù)據(jù)類(lèi)型。各具體DBMS所提供的數(shù)據(jù)類(lèi)型是不同的。但下面的數(shù)據(jù)類(lèi)型幾乎都是支持的:

INT或INTEGER

全字長(zhǎng)二進(jìn)制整數(shù)

SMALLINT

半字長(zhǎng)二進(jìn)制整數(shù)

DEC(p[,q])或壓縮十進(jìn)制數(shù),共p位,其中小數(shù)點(diǎn)后有q位,DECIMAL(p[,q])0<=q<=p<=15,q=0時(shí)可省略

FLOAT

雙字長(zhǎng)的浮點(diǎn)數(shù)

CHAR(n)或CHARTER(n)長(zhǎng)度為n的定長(zhǎng)字符串

VARCHAR(n)

最大長(zhǎng)度為n的變長(zhǎng)字符串

DATE

日期型,格式為YYYY―MM―DDTIME

時(shí)間型,格式為HH.MM.SSTIMESTAMP

日期加時(shí)間(5)<該列的完整性約束>:該列上數(shù)據(jù)必須符合的條件。最常見(jiàn)的有:

NOTNULL

該列值不能為空

NULL

該列值可以為空

UNIQUE

該列值不能有相同者

DEFAULT

該列上某值未定義時(shí)的默認(rèn)值(6)<表級(jí)完整性約束>:對(duì)整個(gè)表的一些約束條件,常見(jiàn)的有定義主碼(外碼),各列上數(shù)據(jù)必須符合的關(guān)聯(lián)條件等。

SQL只要求語(yǔ)句的語(yǔ)法正確就可以,對(duì)格式不作特殊規(guī)定。一條語(yǔ)句可以放在多行上,字和符號(hào)間有一個(gè)或多個(gè)空格分隔。一般每個(gè)列定義單獨(dú)占一行(或數(shù)行),每個(gè)列定義中相似的部分對(duì)齊(這不是必須的),從而增加可讀性,一目了然。例2.1創(chuàng)建職工表。

CREATETABLEEmployee(EnoCHAR(4)NOTNULLUNIQUEEnameCHAR(8),

SexCHAR(2),

AgeINT,

MarryCHAR(1),

TitleCHAR(6),DnoCHAR(2));執(zhí)行后,數(shù)據(jù)庫(kù)中就新建立了一個(gè)名為Employee的表,此表尚無(wú)元組(即為空表)。此表的定義及各約束條件都自動(dòng)存放進(jìn)數(shù)據(jù)字典。請(qǐng)學(xué)生自行建立表2―1所示的前三個(gè)表:Employee、Item、ItemEmp。表(四)及表(五)為該數(shù)據(jù)庫(kù)中的另外兩個(gè)表。表2―1數(shù)據(jù)庫(kù)表2.2.2表結(jié)構(gòu)的修改——ALTERTABLE

基本表的結(jié)構(gòu)是可以隨環(huán)境的變化而修改的,即根據(jù)需要增加、修改或刪除其中一列(或完整性約束條件,增加或刪除表級(jí)完整性約束等)。一、語(yǔ)句格式

ALTERTABLE<表名>[ADDCOLUMN<列名><數(shù)據(jù)類(lèi)型>[完整性約束]][DROPCOLUMN<列名>][MODIFYCOLUMN<列名><數(shù)據(jù)類(lèi)型>[完整性約束]][ADDCONSTRAINT<表級(jí)完整性約束>][DROPCONSTRAINT<表級(jí)完整性約束>]二、說(shuō)明(1)ADDCOLUMN:為表增加一新列,具體規(guī)定與CREATETABLE的相當(dāng),但新列必須允許為空(除非有默認(rèn)值)。(2)DROPCOLUMN:在表中刪除一個(gè)原有的列。(3)MODIFYCOLUMN:修改表中原有列的定義。(4)ADDCONSTRAINT:增加表級(jí)約束。(5)DROPCONSTRAINT:刪除原有的表級(jí)約束。例2.2在Item-Emp表中增加一列REno(聯(lián)系人)。

ALTERTABLEItem-Emp

(ADDCOLUMNRenoCHAR(8))2.2.3表中增加元組的基本方法——INSERTINSERT語(yǔ)句和下面兩小節(jié)介紹的UPDATE、DELETE都有很強(qiáng)的功能,這里僅介紹它們的基本功能。

INSERT語(yǔ)句既可以為表插入一條記錄,也可一次插入一組紀(jì)錄。這里介紹的是插入一條記錄的語(yǔ)句格式。一、語(yǔ)句格式

INSERTINTO<表名>[(<屬性名清單>)]

VALUES(<常量清單>);本語(yǔ)句在指定表中插入一條新記錄。二、說(shuō)明(1)若有<屬性名清單>,則<常量清單>中各常量為新記錄中這些屬性的對(duì)應(yīng)值(根據(jù)語(yǔ)句中的位置一一對(duì)應(yīng))。但該表定義時(shí),說(shuō)明為NOTNULL、且無(wú)默認(rèn)值的列必須在<屬性名清單>中,否則將出錯(cuò)。(2)如無(wú)<屬性名清單>,則<常量清單>順序?yàn)槊總€(gè)屬性列賦值(每個(gè)屬性列上都應(yīng)有值)。

例2.3在Employee表中插入一職工記錄。

INSERT

INTOEmployeeVALUES(′2002′,′胡一兵′,′男′,38,′1′,′工程師′,′01′);2.2.4修改表中數(shù)據(jù)的基本方法——UPDATE

要修改表中已有記錄的數(shù)據(jù)時(shí),可用UPDATE語(yǔ)句。一、語(yǔ)句格式

UPDATE<表名>

SET<列名>=<表達(dá)式>[,<列名>=<表達(dá)式>]n[WHERE<條件>];本語(yǔ)句把指定<表名>內(nèi),符合<條件>記錄中規(guī)定<列名>的值更新為該<列名>后<表達(dá)式>的值。二、說(shuō)明(1)[,<列名>=<表達(dá)式>]n的含義為最少0個(gè)的此類(lèi)內(nèi)容,也即本語(yǔ)句可修改符合<條件>記錄中一個(gè)或多個(gè)列的值。(2)若無(wú)WHERE<條件>項(xiàng),則修改全部記錄。例2.4對(duì)工資表中,所有基本工資小于600的記錄,基本工資都增加50。

UPDATESalarySETBasepay=Basepay+50

WHEREBasepay<600;2.2.5刪除記錄——DELETE有時(shí)需要?jiǎng)h去一些記錄,則可用DELETE語(yǔ)句。一、語(yǔ)句格式

DELETE<表名>[WHERE<條件>]本語(yǔ)句將在指定<表名>中刪除所有符合<條件>的記錄。二、說(shuō)明當(dāng)無(wú)WHERE<條件>項(xiàng)時(shí),將刪除<表名>中的所有記錄。但是,該表還在,只是沒(méi)有了記錄,是個(gè)空表而已。例2.5從職工表中刪除Eno(職工號(hào))為1003的記錄。

DELETE

FROMEmployeeWHEREEno=′1003′;2.2.6更新操作與數(shù)據(jù)庫(kù)的一致性上述增刪改語(yǔ)句一次只能對(duì)一個(gè)表進(jìn)行操作。但有些操作必須在幾個(gè)表中同時(shí)進(jìn)行,否則就會(huì)產(chǎn)生數(shù)據(jù)的不一致性。例如,要修改項(xiàng)目(Item)中某記錄的項(xiàng)目號(hào)(Ino),則其他項(xiàng)目表中所有原項(xiàng)目號(hào)相同的記錄也必須同時(shí)修改為同一新項(xiàng)目號(hào)。但這只能用兩條語(yǔ)句完成:UPDATEItemSETIno=′200102′

WHERESno=′200001′;以及:

UPDATEItem-emp

SETIno=′200102′

WHEREIno=′200001′;第一條語(yǔ)句執(zhí)行后,第二條語(yǔ)句尚未完成前,數(shù)據(jù)庫(kù)中數(shù)據(jù)處于不一致?tīng)顟B(tài)。若此時(shí)突然斷電,第二條語(yǔ)句無(wú)法繼續(xù)完成,則問(wèn)題就嚴(yán)重了。為此,SQL中引入了事務(wù)概念,把這兩條語(yǔ)句作為一個(gè)事務(wù),要么全部都做,要么全部不做。有關(guān)事務(wù)的內(nèi)容,將在第3章3.5節(jié)中介紹。2.2.7刪除基本表——DROPTABLE

一、語(yǔ)句格式

DROPTABLE<表名>二、說(shuō)明此語(yǔ)句一執(zhí)行,指定的表即從數(shù)據(jù)庫(kù)中刪除(表被刪除,表在數(shù)據(jù)字典中的定義也被刪除),此表上建立的索引和視圖也被自動(dòng)刪除(有些系統(tǒng)對(duì)建立在此表上的視圖的定義并不刪除,但也無(wú)法使用了)。例2.6刪除職工表。

DROPTABLEEmployee2.2.8建立索引——CREATEINDEX

在一個(gè)基本表上,可建立若干索引。有了索引,可以加快查詢(xún)速度。索引的建立和刪除工作由DBA或表的屬主(建表人)負(fù)責(zé)。用戶(hù)在查詢(xún)時(shí)并不能選擇索引,選擇索引的工作由DBMS自動(dòng)進(jìn)行。一、語(yǔ)句格式

CREATE[UNIQUE][CLUSTER]INDEX<索引名>

ON<表名>(<列名清單>)本語(yǔ)句為規(guī)定<表名>建立一索引,索引名為<索引名>。二、說(shuō)明(1)<列名清單>中,每個(gè)列名后都可指定ASC(升序)或DESC(降序)。若不指定,默認(rèn)為升序。(2)本語(yǔ)句建立索引的排列方式為:首先以<列名清單>中的第一個(gè)列的值排序;該列值相同的記錄,按下一列名的值排序;以此類(lèi)推。(3)UNIQUE:規(guī)定索引的每一個(gè)索引值只對(duì)應(yīng)于表中唯一的記錄。(4)CLUSTER:規(guī)定此索引為聚簇索引。一個(gè)表最多只能有一個(gè)聚簇索引。有了聚簇索引后,表中記錄的物理順序?qū)⑴c聚簇索引中的一致。在最常查詢(xún)的列上建立聚簇索引可以加快查詢(xún)速度;在經(jīng)常更新的列上建立聚簇索引,則DBMS維護(hù)索引的代價(jià)太大。例2.7為職工表建立一索引,首先以部門(mén)值排序,部門(mén)相同時(shí),再以職工號(hào)降序排序。

CREATEINDEXIX-Emp1

ONEmployee(DnoASC,EnoDESC);2.2.9刪除索引——DROPINDEX

索引太多,索引的維護(hù)開(kāi)銷(xiāo)也將增大。因此,不必要的索引應(yīng)及時(shí)刪除。一、語(yǔ)句格式

DROPINDEX<索引名>二、說(shuō)明本語(yǔ)句將刪除規(guī)定的索引。該索引在數(shù)據(jù)字典中的描述也將被刪除。例2.8刪除IX-Emp1索引。

DROPINDEXIX-Emp1;2.3SQL的查詢(xún)語(yǔ)句——SELECT查詢(xún)是數(shù)據(jù)庫(kù)應(yīng)用的核心內(nèi)容。SQL只提供一條查詢(xún)語(yǔ)句——SELECT,但該語(yǔ)句功能豐富,使用方法靈活,可以滿(mǎn)足用戶(hù)的任何要求。使用SELECT語(yǔ)句時(shí),用戶(hù)不需指明被查詢(xún)關(guān)系的路徑,只需要指出關(guān)系名,查詢(xún)什么,有何附加條件即可。

SELECT既可以在基本表關(guān)系上查詢(xún),也可以在視圖關(guān)系上查詢(xún)。因此,下面介紹語(yǔ)句中的關(guān)系既可以是基本表,也可以是視圖。讀者目前可把關(guān)系專(zhuān)指為基本表,到介紹視圖操作時(shí),再把它與視圖聯(lián)系起來(lái)。2.3.1SELECT語(yǔ)句的基本格式一、語(yǔ)句格式

SELECT語(yǔ)句的基本格式為:

SELECT[DISTINCT/ALL]<目標(biāo)列表達(dá)式[別名]清單>

FROM<關(guān)系名[別名]清單>[WHERE<查詢(xún)條件表達(dá)式>];

本語(yǔ)句從<關(guān)系名清單>所規(guī)定的若干關(guān)系中首先找出符合WHERE子句中<查詢(xún)條件表達(dá)式>的元組(無(wú)此子句時(shí),查詢(xún)出所有元組);再根據(jù)<目標(biāo)列表達(dá)式清單>的規(guī)定,組合這些元組的屬性值,形成一個(gè)新的查詢(xún)結(jié)果關(guān)系;最后輸出這個(gè)結(jié)果關(guān)系。二、說(shuō)明(1)DISTINCT/ALL。若從一關(guān)系中查詢(xún)出符合條件的元組,但輸出部分屬性值,結(jié)果關(guān)系中就可能有重復(fù)元組存在。選擇DISTINCT,則每組重復(fù)元組只輸出一條元組;選擇ALL,則所有重復(fù)元組全部輸出。兩個(gè)都不選,默認(rèn)為ALL。(2)<目標(biāo)列表達(dá)式>。一般地,每個(gè)目標(biāo)列表達(dá)式本身將作為結(jié)果關(guān)系列名,表達(dá)式的值作為結(jié)果關(guān)系中該列的值。一個(gè)目標(biāo)列表達(dá)式的一般格式為:①[<關(guān)系名>.]<屬性名表達(dá)式>(如:Salary.Basepay+50)若被查詢(xún)諸關(guān)系中,只有此關(guān)系有該屬性,則關(guān)系名可省略,此例中,結(jié)果關(guān)系該列的列名即為此表達(dá)式,各元組在該列的分量即為原基本工資加50后的值。②[<關(guān)系名>.]*(如Employee.*)

若結(jié)果關(guān)系的各列正好是某被查詢(xún)的關(guān)系的所有屬性時(shí),則可用此格式。本例的義是:結(jié)果關(guān)系各列正好是關(guān)系Employee的各列。若被查詢(xún)關(guān)系只有一個(gè),則上述關(guān)系名也可省略。③不含有任何被查詢(xún)關(guān)系中屬性名的表達(dá)式。最極端時(shí),該表達(dá)式只由一個(gè)常量組成,則該列的列名和各元組的分量都為此常量。但是,這種情況一般都是在表達(dá)式中含有某個(gè)集函數(shù)。各實(shí)際RDBMS提供的集函數(shù)不盡相同,但一般都提供以下幾個(gè):COUNT([DISTINCT/ALL]*)

統(tǒng)計(jì)結(jié)果中元組個(gè)數(shù)

COUNT([DISTINCT/ALL]<列名>)統(tǒng)計(jì)一列上元組個(gè)數(shù)

MAX(<列名>)給出一列上的最大值

MIN(<列名>)給出一列上的最小值

SUM([DISTINCT/ALL]<列名>)給出一列上值的總和(只對(duì)數(shù)值型)

AVG([DISTINCT/ALL]<列名>)給出一列上值的平均值(只對(duì)數(shù)值型)例如:

SELECTCOUNT(*)

求結(jié)果關(guān)系的元組總數(shù)

SELECTCOUNT(DISTINCTBasepay)

求結(jié)果關(guān)系中不同基本工資的個(gè)數(shù)

SELECTAVG(Basepay)

求結(jié)果關(guān)系中所有基本工資的平均值(3)目標(biāo)列表達(dá)式的[別名]。沒(méi)有此別名時(shí),一個(gè)目標(biāo)列表達(dá)式即為結(jié)果關(guān)系中此列的列名。當(dāng)此目標(biāo)列表達(dá)式是一個(gè)被查詢(xún)關(guān)系的某列名時(shí),這是沒(méi)問(wèn)題的。但當(dāng)此目標(biāo)列表達(dá)式是一個(gè)有著+,-,*,/符號(hào)的表達(dá)式時(shí),此列名將會(huì)使列的含義含糊。特別地,當(dāng)此目標(biāo)列表達(dá)式包含有函數(shù)時(shí),情況更是如此。為此,SQL提供了由用戶(hù)另外為目標(biāo)列表達(dá)式規(guī)定列名的手段,就是這里的[別名]。當(dāng)沒(méi)有此[別名]時(shí),目標(biāo)列表達(dá)式即為結(jié)果關(guān)系中該列的列名;當(dāng)給出一個(gè)[別名]時(shí),結(jié)果關(guān)系中該列的列名即為此[別名](但結(jié)果關(guān)系中各元組在此列上的分量仍為該目標(biāo)列表達(dá)式的值)。(4)FROM<關(guān)系名[別名]清單>。此子句指明了被查詢(xún)的各關(guān)系的關(guān)系名。有時(shí),一個(gè)關(guān)系會(huì)被兩次查詢(xún),這時(shí)就需要把先后查詢(xún)的同一關(guān)系區(qū)分開(kāi)來(lái)。使用[別名]即可達(dá)到此目的。例:

FROMItem-EmpFIRST,Item-EmpSECOND

但此時(shí),在SELECT子句和WHERE子句中出現(xiàn)的屬性名,必須指明是FIRST關(guān)系的還是SECOND關(guān)系的。(5)WHERE<查詢(xún)條件表達(dá)式>。本子句給出查詢(xún)條件。其格式有以下幾種:①<屬性名>θ<屬性名>,<屬性名>θ常量其中θ為比較操作符=,<,>,<=,>=,<>等,如:

WHERE姓名=′李勇′;

WHEREPrice=60;②<屬性名>[NOT]BETWEEN<常量1>AND<常量2>其中,<常量1>為下限,<常量2>為上限。無(wú)[NOT]時(shí),在<常量1>和<常量2>之間的值有效,否則無(wú)效;有[NOT]時(shí),則相反。例如:

WHEREOutlayBETWEEN10AND20③<屬性名>[NOT]IN(<常量清單>)無(wú)[NOT]時(shí),<屬性名>值在<常量清單>中有效,否則無(wú)效;有[NOT]時(shí),則相反。例如:

WHEREEnoNOTIN(1002,1010,1022)④<屬性名>[NOT]LIKE<含有通配符的字符串>通配符有“%”和“-”兩種:“%”表示任意長(zhǎng)度的字符串,“-”表示任意單個(gè)字符。無(wú)[NOT]時(shí),值與該字符串匹配時(shí)有效,否則無(wú)效;有[NOT]時(shí),則相反。例如:

WHEREInoLIKE"1998%"

若通配符本身就是字符串內(nèi)容,則可增加短語(yǔ)ESCAPE解釋之。如:WHEREInameLIKE′C\-%′ESCAPE′\′,則緊跟在\后的-不是通配符,僅是一個(gè)字符而已。⑤<屬性名>IS[NOT]NULL

無(wú)[NOT]時(shí),<屬性名>值為NULL有效,否則無(wú)效;有[NOT]時(shí),則相反。如:

WHEREChek-dateISNOTNULL⑥<條件表達(dá)式>[AND|OR<條件表達(dá)式>]n

其中,各<條件表達(dá)式>本身為邏輯值(真或假),n的意義與2.2.4節(jié)中的n相同。如:

WHEREIno=′1998′ANDEno=′1016′⑦特別注意,WHERE子句中不能用集函數(shù)作為條件表達(dá)式。三、舉例例2.9SELECTDISTINCTEno

FROMItem-Emp

WHEREInoLIKE′1998%′

從Item-Emp表中查找Ino的前4位為′1998′的元組,顯示Eno列值(相同值只需顯示一次)。例2.10SELECT*

FROMSalaryWHEREBasepayBETWEEN500AND700

從Salary表中查找Basepay在500和700間的元組,顯示符合條件元組的所有屬性。例2.11SELECTEmployee.Eno,Ename,Ino

FROMEmployee,Item-Emp

WHEREEmployee.Eno=Item-Emp.Eno

查詢(xún)參加項(xiàng)目職工的職工號(hào)、職工名和項(xiàng)目號(hào)。把職工表與參加表聯(lián)接成一個(gè)新表,新表由兩表各部分屬性組成(見(jiàn)SELECT子句)。但只有職工表中Eno與參加表中Eno相等的元組連接。注:如果沒(méi)有WHERE子句的話(huà),當(dāng)Employee表有m條記錄,Item-Emp表有n條記錄時(shí),輸出關(guān)系有m*n條記錄。例2.12SELECTFIRST.Eno,SECOND.REno

FROMItem-EmpFIRST,Item-EmpSECONDWHEREFIRST.REno=SECOND.Eno

這是一個(gè)自身連接的例子。根據(jù)Item-Emp,求出參加某項(xiàng)目者的間接聯(lián)系人。例2.13SELECTSalary.Eno,Ename,Basepay+Service+Price+Rest-Insure-FundWAGEFROMSalary,Employee

WHERESalary.Eno=Employee.Eno例2.14SELECT*

FROMSalaryWHERE(BasepayBETWEEN600AND700)AND(ServiceIN(6.0,7.0,13.0,25.0))ANDEnoLIKE′100-′

從Salary中選取符合下列條件的元組:①基本工資在600與700之間;②工齡工資為6,7,13,25;③職工號(hào)前三位為100(共有4位)。例2.15SELECT*FROMItemWHERECheck-dateISNULL從項(xiàng)目表中選取鑒定日期是空值的記錄2.3.2SELECT語(yǔ)句的高級(jí)使用格式一、語(yǔ)句格式

SELECT語(yǔ)句的高級(jí)使用格式與基本格式相似,即

SELECT[DISTINCT/ALL]<目標(biāo)列表達(dá)式[別名]清單>

FROM<關(guān)系名[別名]清單>

WHERE<查詢(xún)條件表達(dá)式>高級(jí)使用格式與基本使用格式的差別在于,高級(jí)使用格式的WHERE子句肯定存在,且<查詢(xún)條件表達(dá)式>中嵌套有另外的查詢(xún)。二、說(shuō)明(1)一個(gè)SELECT―FROM―WHERE語(yǔ)句稱(chēng)為一個(gè)查詢(xún)塊,WHERE子句中的查詢(xún)塊稱(chēng)為嵌套查詢(xún)。在此,外層的查詢(xún)稱(chēng)為外層查詢(xún)或父查詢(xún),內(nèi)層的查詢(xún)稱(chēng)為內(nèi)層查詢(xún)或子查詢(xún)。(2)一個(gè)查詢(xún)還可以再嵌套子查詢(xún),這就是多層查詢(xún),層層嵌套,這就是結(jié)構(gòu)化。(3)求解嵌套查詢(xún)的一般方法是由里向外,逐層處理。即,子查詢(xún)?cè)谒母覆樵?xún)處理前先求解,子查詢(xún)的結(jié)果作為其父查詢(xún)查找條件的一部分。(4)有了嵌套查詢(xún)后,SQL的查詢(xún)功能就變得更豐富多采。復(fù)雜的查詢(xún)可以用多個(gè)簡(jiǎn)單查詢(xún)嵌套來(lái)解決,一些原來(lái)無(wú)法實(shí)現(xiàn)的查詢(xún)也因有了多層嵌套查詢(xún)而迎刃而解。嵌套查詢(xún)時(shí)WHERE中<查詢(xún)條件表達(dá)式>的格式有以下幾種:①<屬性名>θ[ANY/ALL](SELECT語(yǔ)句)

ANY只要與子查詢(xún)中一個(gè)值符合即可,ALL要與子查詢(xún)中所有值相符合。如:

WHEREDno=ANY

(SELECTDno

FROMEmployeeWHEREEno=′1002′OREno=′1003′)

職工表中,當(dāng)職工號(hào)為1002或1003元組所在部門(mén),與外層查詢(xún)中的部門(mén)相同時(shí),才符合查詢(xún)條件,其他都不符合條件。為便于理解,將ANY和ALL的確切含義歸納如下:>ANY只要大于其中一個(gè)即可>ALL必須大于所有結(jié)果<ANY只要小于其中一個(gè)即可<ALL必須小于所有的結(jié)果>=ANY只要大于等于其中一個(gè)即可>=ALL必須大于等于所有結(jié)果<=ANY只要小于等于其中一個(gè)即可<=ALL必須小于等于所有的結(jié)果=ANY只要等于其中一個(gè)即可<>ANY只要與其中一個(gè)不等即可<>ALL必須與所有結(jié)果都不等②<屬性名>[NOT]IN(SELECT語(yǔ)句)無(wú)[NOT]時(shí),只要屬性值在SELECT子查詢(xún)結(jié)果中即可,否則無(wú)效;有[NOT]時(shí),則相反。如:

WHEREEnoIN(SELECTEno

FROMItem-Emp

WHEREInoLIKE′199%′)

凡是與某參加90年代項(xiàng)目職工的職工號(hào)相等即符合條件。③[NOT]EXISTS(SELECT語(yǔ)句),如:

SELECTEno,Ename

FROMEmployeeWHEREEXISTS(SELECT*

FROMItem-Emp

WHEREEno=Employee.Eno);

EXISTS代表存在量詞。在此格式中,子查詢(xún)(SELECT語(yǔ)句)不返回任何數(shù)據(jù),只產(chǎn)生邏輯值:無(wú)[NOT]時(shí),子查詢(xún)查到元組,返回值為真(TURE),否則為假;有[NOT]時(shí),則相反。此格式的子查詢(xún)中,<目標(biāo)列表達(dá)式清單>一般都用“*”號(hào)(是其他的屬性名也可以,但無(wú)實(shí)際意義。因此,為了用戶(hù)方便起見(jiàn),一般用*)。這類(lèi)子查詢(xún)的求解方式與前面是不同的(重復(fù)一遍,一般來(lái)說(shuō),子查詢(xún)都在其父查詢(xún)處理前求解)。在這里,子查詢(xún)的查詢(xún)條件往往依賴(lài)于其父查詢(xún)的某屬性值。這類(lèi)查詢(xún)稱(chēng)為相關(guān)子查詢(xún)。這就是為什么本格式上述舉例時(shí),不能單獨(dú)取出父查詢(xún)的WHERE子句的緣故。求執(zhí)行相關(guān)子查詢(xún)的過(guò)程為:從外查詢(xún)的關(guān)系(Employee)中依次取一個(gè)元組,根據(jù)它的值在內(nèi)查詢(xún)進(jìn)行檢查,若WHERE子句為真,將此元組放入結(jié)果表(為假,則舍去)。這樣反復(fù)處理,直至外查詢(xún)關(guān)系的元組全部處理完為止。④[NOT]BETWEEN<上限>AND<下限>中的<下限>和<上限>也可以是子查詢(xún)。這種情況下,子查詢(xún)結(jié)果作為邊界。三、舉例例2.16SELECT*

FROMEmployeeWHEREEno=ANY(SELECTEno

FROMItem-Emp

WHEREIno=′2000%′);在職工表中取出所有參加2000年度項(xiàng)目的職工。例2.17SELECTEno,Ename,Dno,Title

FROMEmployee

WHEREinoIN(SELECTInoFROMItem-Emp

WHEREEno=′1004′);

從Employee關(guān)系中取出所有與1004號(hào)職工共同參加項(xiàng)目的職工的元組。但僅輸出屬性職工號(hào)、姓名、部門(mén)和職稱(chēng)的值。例2.18SELECTEno,Ename,Dno

FROMEmployeeWHEREEXISTS(SELECT*

FROMItem-Emp

WHEREEno=Employee.EnoANDIno=′199801′);

從Employee關(guān)系中取出所有參加了199801項(xiàng)目的元組,只輸出職工號(hào),姓名,部門(mén)三屬性值。例2.19SELECTFIRST.Eno

FROMSalaryFIRSTWHEREBasepayBETWEEN(SELECTBasepay

FROMSalarySENCONDWHERESENCORD.Eno=′1010′)AND800;

在工資表中,把基本工資介于職工號(hào)‘1010’工資和800元之間的職工號(hào)查詢(xún)出來(lái)。2.3.3SELECT語(yǔ)句的完整使用格式一、語(yǔ)句格式

SELECT[ALL/DISTINCT]<目標(biāo)列清單[別名]清單>

FROM<關(guān)系名[別名]清單>

WHERE<查詢(xún)條件表達(dá)式>[ORDERBY<列名[ASC/DESC]清單>][GROUPBY<列名清單>[HAVING<條件表達(dá)式>]]

SELECT語(yǔ)句的完整格式比前面的格式多了ORDERBY子句以及GROUPBY子句兩個(gè)可選項(xiàng)。二、說(shuō)明(1)ORDERBY<列名[ASC/DESC]清單>有了ORDER子句后,SELECT語(yǔ)句的查詢(xún)結(jié)果表中各元組將排序輸出:首先按第一個(gè)<列名>值排序;前一個(gè)<列名>值相同者,再按下一個(gè)<列名>值排序,以此類(lèi)推。若某列名后有DESC,則以該列名值排序時(shí)為降序排列,否則,為升序排列。例如:

ORDERBYService,BasepayDESC

結(jié)果首先以工齡工資升序排序,工齡工資相等的元組再以基本工資降序排列。子查詢(xún)的SELECT語(yǔ)句不能使用ORDERBY子句,此子句只能作用于最終查詢(xún)結(jié)果。排序時(shí),空值作為最大值處理。(2)GROUPBY<列名清單>[HAVING<條件表達(dá)式>]把查詢(xún)所得元組根據(jù)GROUPBY中<列名清單>進(jìn)行分組。在這些列上,對(duì)應(yīng)值都相同的元組分在同一組;若無(wú)HAVING子句,則各組分別輸出;若有HAVING子句,只有符合條件的組才輸出。一般地,當(dāng)SELECT的<目標(biāo)列表達(dá)式[別名]清單>中有集函數(shù)(COUNT、SUM等)時(shí),才使用GROUP子句。例2.20SELECTDno,AVG(Age)Average-Age

FROMEmployeeGROUPBYDno

HAVINGCOUNT(*)>1;

把職工表中元組按部門(mén)分組,只有人數(shù)多于一人的組才輸出;輸出部門(mén)號(hào)和平均年齡兩列。

有了GROUPBY子句后,AVG函數(shù)對(duì)每一組求平均值,若無(wú)GROUPBY,AVG對(duì)整個(gè)輸出求平均值。這一點(diǎn),對(duì)所有的集函數(shù)都成立。

HAVING條件作用于結(jié)果組,選擇滿(mǎn)足條件的結(jié)果組。而WHERE條件作用于被查詢(xún)的關(guān)系,從中選擇滿(mǎn)足條件的元組。2.3.4多個(gè)SELECT語(yǔ)句的集合操作SQL提供了集合并操作手段UNION。

例2.21SELECT*

FROMItem-Emp

WHEREIno=′19981′UNIONSELECT*

FROMItem-Emp

WHEREIno=′200001′;本例把兩條SELECT語(yǔ)句各自得到的結(jié)果集并為一個(gè)集(兩集合中若有相同元組,只留一個(gè))。注意事項(xiàng):參加UNION的記錄結(jié)果集必須有相同的列數(shù),各對(duì)應(yīng)項(xiàng)的數(shù)據(jù)類(lèi)型也必須相同。SQL未直接提供集合交操作、集合差操作,但完全可用一般的SELECT語(yǔ)句代替之。請(qǐng)讀者自行考慮。2.4含有子查詢(xún)的數(shù)據(jù)更新在2.2.3~2.2.6節(jié)中已介紹了INSERT、UPDATE和DELETE的基本使用方法及注意事項(xiàng)。本節(jié)介紹他們與子查詢(xún)結(jié)合使用的方法。與子查詢(xún)結(jié)合后,三語(yǔ)句的功能更強(qiáng),使用手段也更加靈活。2.4.1INSERT與子查詢(xún)的集合一、語(yǔ)句格式

INSERTINTO<表名>[<屬性名清單>](子查詢(xún));把子查詢(xún)的結(jié)果插入指定的<表名>中。這樣的一條INSERT語(yǔ)句,可以一次插入多條元組。二、舉例例2.22假如部門(mén)號(hào)為‘01’的部門(mén)由于需要自己建立一個(gè)部門(mén)職工表,結(jié)構(gòu)與Employee相同(表名為Employee-01)。則該表的元組可用一條INSERT語(yǔ)句一次全部插入如下:

INSERTINTOEmployee-01

SELECT*

FROMEmployeeWHEREDno=′01′;2.4.2UPDATE與子查詢(xún)的結(jié)合一、語(yǔ)句格式

UPDATE<表名>

SET<列名>=<表達(dá)式>[,<列名>=<表達(dá)式>]n

[WHERE<帶有子查詢(xún)的條件表達(dá)式>]本語(yǔ)句執(zhí)行時(shí),將修改使<帶有子查詢(xún)的條件表達(dá)式>為真的所有元組。n的意義與2.2.4節(jié)中的n相同。二、舉例例2.23UPDATESalarySETRest=Rest+200

WHEREEnoIN(SELECTEno

FROMItem-EmpWHEREIno=′199802′);凡參加199802項(xiàng)目的職工,工資表中津貼的值都增加200。2.4.3DELETE與子查詢(xún)的結(jié)合一、語(yǔ)句格式

DELETEFROM<表名>[WHERE<帶有子查詢(xún)的條件表達(dá)式>]本語(yǔ)句將刪除使<帶有子查詢(xún)的條件表達(dá)式>為真的所有元組。二、舉例例2.24DELETE

FROMItem-Emp

WHEREEno=

(SELECTEno

FROMEmployeeWHERE姓名=′丁為國(guó)′);從項(xiàng)目人員中,刪除丁為國(guó)的所有元組。2.5視圖視圖是數(shù)據(jù)庫(kù)系統(tǒng)的一個(gè)重要機(jī)制。無(wú)論從方便用戶(hù)的角度,還是從加強(qiáng)數(shù)據(jù)庫(kù)安全的角度,視圖都有著極其重要的作用。一個(gè)視圖是從一個(gè)或多個(gè)關(guān)系(基本表或已有的視圖)導(dǎo)出的關(guān)系。導(dǎo)出后,數(shù)據(jù)庫(kù)中只存有此視圖的定義(在數(shù)據(jù)字典中),但并沒(méi)有實(shí)際生成此關(guān)系。因此視圖是虛表。用戶(hù)使用視圖時(shí),其感覺(jué)與使用基本表是時(shí)相同的。但是(1)由于視圖是虛表,所以SQL對(duì)視圖不提供建立索引的語(yǔ)句。(2)SQL一般也不提供修改視圖定義的語(yǔ)句(有此需要時(shí),只要把原定義刪除,重新定義一個(gè)新的即可,這樣不影響任何數(shù)據(jù))。(3)對(duì)視圖中數(shù)據(jù)做更新時(shí)是有些限制的。2.5.1定義視圖——CREATEVIEW

一、語(yǔ)句格式

CREATEVIEW<視圖名>[<列名清單>]

AS<子查詢(xún)>[WITHCHECKOPTION]二、說(shuō)明(1)<視圖名>給出所定義的視圖的名稱(chēng)。(2)若有<列名清單>,則此清單給出了此視圖的全部屬性的屬性名;否則,此視圖的所有屬性名即為子查詢(xún)中SELECT語(yǔ)句中的全部目標(biāo)列。(3)<子查詢(xún)>為任一合法SELECT語(yǔ)句(但一般不含有ORDERBY,UNION等語(yǔ)法成分)。(4)有[WITHCHECKOPTION]時(shí),則今后對(duì)此視圖進(jìn)行INSERT、UPDATE和DELETE操作時(shí),系統(tǒng)會(huì)自動(dòng)檢查視圖是否符合原定義視圖時(shí)子查詢(xún)中的<條件表達(dá)式>。本語(yǔ)句執(zhí)行后,此視圖的定義即進(jìn)入數(shù)據(jù)字典,對(duì)語(yǔ)句中的<子查詢(xún)>并未執(zhí)行,也即視圖并未真正生成。所以說(shuō),視圖是虛表。三、舉例例2.25CREATEVIEWEmployee-02ASSELECT*

FROMEmployeeWHEREDno=′02′;

從職工表中取出部門(mén)為‘02’的元組組成一個(gè)視圖。視圖可以從一個(gè)基本表或視圖導(dǎo)出,也可以是從多個(gè)基本表或多個(gè)視圖導(dǎo)出。一個(gè)視圖,如果只從單個(gè)基本表導(dǎo)出,且保留了原來(lái)的碼,只是去掉了原基本表的某些行和非碼屬性,該視圖稱(chēng)為行列子集視圖,如上述Employee-02視圖。定義視圖時(shí),若設(shè)置了一些派生屬性(這些屬性是原基本表沒(méi)有的,其值是用一個(gè)表達(dá)式對(duì)原基本表的運(yùn)算而得到的),則此視圖稱(chēng)為帶有表達(dá)式的視圖,這些派生屬性也稱(chēng)為虛擬列。定義視圖時(shí),若使用了集函數(shù)和GROUPBY子句的查詢(xún),則此視圖稱(chēng)為分組視圖。2.5.2刪除視圖——DROPVIEW

一、語(yǔ)句格式

DROPVIEW<視圖名>此語(yǔ)句將把指定視圖的定義從數(shù)據(jù)字典中刪除。一個(gè)關(guān)系(基本表或視圖)被刪除后,所有由該關(guān)系導(dǎo)出的視圖并不自動(dòng)刪除,它們?nèi)栽跀?shù)據(jù)字典中,但已無(wú)法使用。刪除視圖必須用DROPVIEW語(yǔ)句。二、舉例例2.26DROPVIEWEmployee-02

執(zhí)行此語(yǔ)句后,Employee-02視圖的定義就從數(shù)據(jù)字典中刪除了。2.5.3視圖的查詢(xún)一、用戶(hù)的工作對(duì)用戶(hù)來(lái)說(shuō),對(duì)視圖的查詢(xún)與對(duì)基本表的查詢(xún)是沒(méi)有區(qū)別的,都使用SELECT語(yǔ)句對(duì)有關(guān)的關(guān)系進(jìn)行查詢(xún)工作。在查詢(xún)時(shí),用戶(hù)不需區(qū)分是對(duì)基本表查詢(xún),還是對(duì)視圖查詢(xún)。SELECT語(yǔ)句中不需(也不可能)標(biāo)明被查詢(xún)的關(guān)系是基本表還是視圖。如:

SELECT*

FROMEmployee-02二、DBMS對(duì)視圖查詢(xún)的處理

DBMS對(duì)某SELECT語(yǔ)句進(jìn)行處理時(shí),若發(fā)現(xiàn)被查詢(xún)對(duì)象是視圖,則DBMS將進(jìn)行下述操作:

(1)從數(shù)據(jù)字典中取出視圖的定義。(2)把視圖定義的子查詢(xún)和本SELECT的查詢(xún)相結(jié)合,生成等價(jià)的對(duì)基本表的查詢(xún)(此過(guò)程稱(chēng)為視圖的消解)。(3)執(zhí)行對(duì)基本表的查詢(xún),把查詢(xún)結(jié)果(作為本次對(duì)視圖的查詢(xún)結(jié)果)向用戶(hù)顯示。三、特殊情況的處理一般情況下,對(duì)視圖的查詢(xún)是不會(huì)出現(xiàn)問(wèn)題的。但有時(shí),視圖消解過(guò)程不能給出語(yǔ)法正確的查詢(xún)條件。因此,對(duì)視圖查詢(xún)時(shí),若出現(xiàn)語(yǔ)法錯(cuò)誤,可能不是查詢(xún)語(yǔ)句本身有語(yǔ)法錯(cuò)誤,而是轉(zhuǎn)換后出現(xiàn)的語(yǔ)法錯(cuò)誤。此時(shí),用戶(hù)須自行把對(duì)視圖的查詢(xún)轉(zhuǎn)化為對(duì)基本表的查詢(xún)。2.5.4視圖的更新一、視圖更新的含義及執(zhí)行過(guò)程視圖是虛表,是沒(méi)有數(shù)據(jù)的。所謂視圖的更新,表面上是對(duì)視圖執(zhí)行INSERT、UPDATE和DELETE來(lái)更新視圖的數(shù)據(jù),其實(shí)質(zhì)是由DBMS自動(dòng)轉(zhuǎn)化成對(duì)導(dǎo)出視圖的基本表的更新,轉(zhuǎn)化成對(duì)基本表

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論