




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第三章 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL 3.1 SQL概述 3.2 數(shù)據(jù)定義 3.3 數(shù)據(jù)查詢 3.4 數(shù)據(jù)操縱 3.5 視圖 3.6 數(shù)據(jù)控制3.1 SQL概述 結(jié)構(gòu)化查詢語(yǔ)言SQL(Structured Query Language):是一種介于關(guān)系代數(shù)與關(guān)系演算之間的語(yǔ)言,其功能包括查詢、操縱、定義和控制四個(gè)方面,是一個(gè)通用的、功能極強(qiáng)的關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言,目前已成為關(guān)系數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言。 SQL的歷史:SQL語(yǔ)言最初是由IBM公司在七十年代中期在原型的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)SYSTEM R上開(kāi)發(fā)的語(yǔ)言。1979年,ORACLE公司首家推出商業(yè)上可執(zhí)行的SQL。如今,SQL成為工業(yè)上標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù)存取語(yǔ)
2、言。 SQL語(yǔ)言集數(shù)據(jù)查詢(data query)、數(shù)據(jù)操縱(data manipulation)、數(shù)據(jù)定義(data definition)和數(shù)據(jù)控制(data control)功能于一體,充分體現(xiàn)了關(guān)系數(shù)據(jù)語(yǔ)言的特點(diǎn)和優(yōu)點(diǎn) 。3.1.1 SQL語(yǔ)言特點(diǎn)語(yǔ)言特點(diǎn) 綜合統(tǒng)一的一體化 SQL語(yǔ)言集數(shù)據(jù)定義語(yǔ)言DDL、數(shù)據(jù)操縱語(yǔ)言DML、數(shù)據(jù)控制語(yǔ)言DCL的功能于一體,語(yǔ)言風(fēng)格統(tǒng)一,可以獨(dú)立完成數(shù)據(jù)庫(kù)生命周期中的全部活動(dòng),包括定義關(guān)系模式、插入數(shù)據(jù)建立數(shù)據(jù)庫(kù)、查詢、更新、維護(hù)、數(shù)據(jù)庫(kù)重構(gòu)、數(shù)據(jù)庫(kù)安全性控制等一系列操作要求 高度非過(guò)程化 SQL語(yǔ)言進(jìn)行數(shù)據(jù)操作,用戶只需提出“做什么”,而不必指明“怎
3、么做”,因此用戶無(wú)需了解存取路徑,存取路徑的選擇以及SQL語(yǔ)句的操作過(guò)程由系統(tǒng)自動(dòng)完成。 面向集合的操作方式 SQL語(yǔ)言采用集合操作方式,不僅一次插入、刪除、更新操作的對(duì)象是元組的集合,而且操作的結(jié)果也是元組的集合。 以同一種語(yǔ)法結(jié)構(gòu)提供兩種使用方式 SQL語(yǔ)言既是自含式語(yǔ)言,又是嵌入式語(yǔ)言。 語(yǔ)言簡(jiǎn)潔,易學(xué)易用 SQL語(yǔ)言功能極強(qiáng),但由于設(shè)計(jì)巧妙,語(yǔ)言十分簡(jiǎn)潔,完成數(shù)據(jù)定義、數(shù)據(jù)操縱、數(shù)據(jù)控制的核心功能只用了9個(gè)動(dòng)詞:CREATE、DROP、SELECT、INSERT、UPDATE、DELETE、GRANT、REVOKE SQL語(yǔ)言語(yǔ)法簡(jiǎn)單,接近英語(yǔ)口語(yǔ),因此容易學(xué)習(xí),容易使用 3.1.2
4、SQL數(shù)據(jù)庫(kù)的體系結(jié)構(gòu) 按支持SQL的數(shù)據(jù)庫(kù)管理系統(tǒng)可稱其SQL數(shù)據(jù)庫(kù),其結(jié)構(gòu)基本上采用三級(jí)結(jié)構(gòu),但所用術(shù)語(yǔ)與傳統(tǒng)關(guān)系模型的術(shù)語(yǔ)有些不同。 說(shuō)明: 一個(gè)SQL數(shù)據(jù)庫(kù)是表的匯集,它用一個(gè)或若干個(gè)SQL模式定義; 一個(gè)SQL表由行集構(gòu)成,一行是列的序列,每列對(duì)應(yīng)一個(gè)數(shù)據(jù)項(xiàng); 一個(gè)表或者是一個(gè)基本表,或者是一個(gè)視圖; 每個(gè)存儲(chǔ)文件與外部存儲(chǔ)上一個(gè)物理文件對(duì)應(yīng); 用戶可以用SQL語(yǔ)句對(duì)視圖和基本表進(jìn)行查詢操作; SQL用戶可以應(yīng)用程序,也可以是終端用戶。3.2 數(shù)據(jù)定義 SQL語(yǔ)言的數(shù)據(jù)定義功能包括三部分: 定義基本表 定義視圖 定義索引 3.2.1 定義基本表 關(guān)系數(shù)據(jù)庫(kù)中的基本表與日常事務(wù)中的二維
5、表相似,而基本表的結(jié)構(gòu)決定了表中數(shù)據(jù)的構(gòu)成。因此基本表的定義通常包括: 定義基本表名; 定義基本表中各列的特征:列名、數(shù)據(jù)類(lèi)型、長(zhǎng)度以及能否取空值。 一般格式如下: CREATE TABLE ( 列級(jí)完整性約束條件 , 列級(jí)完整性約束條件. ,); 其中是所要定義的基本表的名字,它可以由一個(gè)或多個(gè)屬性(列)組成。 下面我們以 “學(xué)生課程”數(shù)據(jù)庫(kù)為例進(jìn)行說(shuō)明 “學(xué)生課程”數(shù)據(jù)庫(kù)中包括三個(gè)表: (1) “學(xué)生”表Student由學(xué)號(hào)(Sno)、姓名(Sname)、性別(Ssex)、年齡(Sage)、所在系(Sdept)5個(gè)屬性組成 可記為: Student(Sno,Sname,Ssex,Sage,
6、Sdept)。 (2) “課程”表Course由課程號(hào)(Cno)、課程名(Cname)、先修課號(hào)(Cpno)、學(xué)分(Ccredit)4個(gè)屬性組成 可記為: Course(Cno,Cname,Cpno,Ccredit)。 (3) “學(xué)生選課”表SC由學(xué)號(hào)(Sno)、課程號(hào)(Cno)、成績(jī)(Grade)3個(gè)屬性組成 可記為: SC(Sno,Cno,Grade) (SNO, CNO, Grade)。 例1 建立一個(gè)“學(xué)生”表Student,它由學(xué)號(hào)Sno、姓名Sname、性別Ssex、年齡Sage、所在系Sdept五個(gè)屬性組成,其中學(xué)號(hào)屬性不能為空,并且其值是唯一的。 CREATE TABLE St
7、udent (Sno CHAR(5), Sname CHAR(20) NOT NULL UNIQUE, Ssex CHAR(1), Sage INT, Sdept CHAR(15), primary key(sno,sname); 定義外鍵: foreign key(cpno) references course(cno)3.2.2 修改基本表 一般格式為: ALTER TABLE ADD 完整性約束 DROP MODIFY ; 其中指定需要修改的基本表,ADD子句用于增加新列和新的完整性約束條件,DROP子句用于刪除指定的完整性約束條件,MODIFY子句用于修改原有的列定義。 例2 向Stu
8、dent表增加“入學(xué)時(shí)間”列,其數(shù)據(jù)類(lèi)型為日期型。 ALTER TABLE Student ADD Scome DATE ; 3.2.3 刪除基本表 一般格式為: DROP TABLE CASCADE:無(wú)限制 RESTRICT: 有限制的刪除基本表 例5 刪除Student表。 DROP TABLEStudent RESTRICT3.2.4 建立索引 索引的概念 在數(shù)據(jù)庫(kù)SQL語(yǔ)言中,提供了建立索引的語(yǔ)句。表的索引就像書(shū)的目錄一樣。當(dāng)需要在表中查找某些數(shù)據(jù)時(shí),可能的話,SQL首先并不直接去掃描表,而是查找與該表有關(guān)的索引,當(dāng)查找到索引后,根據(jù)索引提供的信息,確定這些數(shù)據(jù)(行)存儲(chǔ)位置,然后直接
9、從該位置上取出所需要的數(shù)據(jù)(行)。由于索引遠(yuǎn)遠(yuǎn)比表結(jié)構(gòu)緊湊,所含的數(shù)據(jù)少,因此,查找索引是很快的。如果沒(méi)有索引,則SQL只有掃描整個(gè)表,把這個(gè)表中的行依次比較,以找出所需要的數(shù)據(jù)(行)。建立一個(gè)或多個(gè)索引,可以提供多種存取路徑,加快查找速度。 一般格式為: CREATE UNIQUE CLUSTER INDEX ON (,.); 其中: 指定要建索引的基本表的名字。索引可以建在該表的一列或多列上,各列名之間用逗號(hào)分隔。每個(gè)后面還可以用指定索引值的排列次序,包括ASC(升序)和DESC(降序)兩種,缺省值為ASC。 說(shuō)明: UNIQUE:表明此索引的每一個(gè)索引值只對(duì)應(yīng)唯一的數(shù)據(jù)記錄。 CLUST
10、ER:表示要建立的索引是聚簇索引。所謂聚簇索引是指索引項(xiàng)的順序與表中記錄的物理順序一致的索引組織。 例6 為學(xué)生-課程數(shù)據(jù)庫(kù)中的Student、Couse、SC三個(gè)表建立索引。其中Student表按學(xué)號(hào)升序建唯一索引,Couse表按課程號(hào)升序建唯一索引,SC表按學(xué)號(hào)升序和課程號(hào)降序建唯一索引。 CREATE UNIQUE INDEX Stusno ON Student(Sno); CREATE UNIQUE INDEX Coucno ON Couse(Cno); CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC); 3.2.4 刪除索引 一般格式為
11、: DROP INDEX ; 例7 刪除Student表的Stusname索引 DROP INDEX Stusname; 3.3 數(shù)據(jù)查詢 查詢是數(shù)據(jù)庫(kù)操作中最常見(jiàn)的操作。 對(duì)于已定義的表,用戶可以通過(guò)查詢操作得到所需要的信息??梢哉f(shuō),SQL語(yǔ)言的核心是數(shù)據(jù)庫(kù)查詢語(yǔ)句。 SQL查詢語(yǔ)句只有SELECT句型一種。 一般格式為: SELECT ALL|DISTINCT ,. FROM , . WHERE GROUP BY HAVING ORDER BY ASC|DESC; 3.3.1單表查詢 1. 選擇表中的若干列 查詢指定列 例1 查詢?nèi)w學(xué)生的學(xué)號(hào)與姓名。 SELECT Sno, Sname
12、FROM Student; 例2 查詢?nèi)w學(xué)生的姓名、學(xué)號(hào)、所在系。 SELECT Sname, Sno, Sdept FROM Student; 查詢?nèi)苛?例3 查詢?nèi)w學(xué)生的詳細(xì)記錄。 SELECT * FROM Student; 查詢經(jīng)過(guò)計(jì)算的值 SELECT子句的不僅可以是表中的屬性列,也可以是表達(dá)式,即可以將查詢出來(lái)的屬性列經(jīng)過(guò)一定的計(jì)算后列出結(jié)果。 例4 查全體學(xué)生的姓名及其出生年份 SELECT Sname, 2003-Sage FROM Student; 用戶可以通過(guò)指定別名來(lái)改變查詢結(jié)果的列標(biāo)題,這對(duì)于含算術(shù)表達(dá)式、常量、函數(shù)名的目標(biāo)列表達(dá)式尤為有用。例如對(duì)于上例,可以如下
13、定義列別名。 SELECT Sname NAME, Year of Birth: BIRTH, 2003-Sage BIRTHDAY, ISLOWER(Sdept) DEPARTMENT FROM Student; 結(jié)果為: NAME BIRTH BIRTHDAY DEPARTMENT 李勇 Year of Birth: 1983 cs 劉晨 Year of Birth: 1984 is 王名 Year of Birth: 1985 ma 張立 Year of Birth: 1984 is 2. 選擇表中的若干元組 消除取值重復(fù)的行 例 查尋所有選修了課程的學(xué)生的學(xué)號(hào)。 SELECT DIST
14、INCT Sno FROM SC; 查詢滿足條件的元組 查詢滿足指定條件的元組可以通過(guò)WHERE子句實(shí)現(xiàn)。WHERE子句常用的查詢條件如表4.5所示。 比較大小 例7 查計(jì)算機(jī)系全體學(xué)生的名單。 SELECT Sname FROM Student WHERE Sdept = CS; 例8 查所有年齡在20歲以下的學(xué)生姓名及其年齡。 SELECT Sname, Sage FROM Student WHERE Sage = 20; 例9 查詢考試成績(jī)有不及格的學(xué)生的學(xué)號(hào)。 SELECT DISTINCT Sno FROM SC WHERE Grade 60; 這里使用了DISTINCT短語(yǔ),當(dāng)一個(gè)
15、學(xué)生有多門(mén)課程不及格,他的學(xué)號(hào)也只列一次。 確定范圍 例10 查詢年齡在20至23歲之間的學(xué)生的姓名、系別、和年齡。 SELECT Sname, Sdept, Sage FROM Student WHERE Sage BETWEEN 20 AND 23; 與BETWEEN.AND.相對(duì)的謂詞是NOT BETWEEN.AND。 例11 查詢年齡不在20至23歲之間的學(xué)生姓名、系別和年齡。 SELECT Sname, Sdept, Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23; 確定集合 例12 查信息系(IS)、數(shù)學(xué)系(MA)和計(jì)算機(jī)科學(xué)系
16、(CS)的學(xué)生的姓名和性別。 SELECT Sname, Ssex FROM Student WHERE Sdept IN (IS, MA, CS) 與IN相對(duì)的謂詞是NOT IN,用于查找屬性值不屬于指定集合的元組。 例13 查既不是信息系、數(shù)學(xué)系,也不是計(jì)算機(jī)科學(xué)系的學(xué)生的姓名和性別。 SELECT Sname, Ssex FROM Student WHERE Sdept NOT IN (IS, MA, CS) 字符匹配 謂詞LIKE可以用來(lái)進(jìn)行字符串的匹配。其一般語(yǔ)法格式如下: NOT LIKE ESCAPE 其含義是查找指定的屬性列值與相匹配的元組。可以是一個(gè)完整的字符串,也可以含有通
17、配符%和_。 %(百分號(hào)):代表任意長(zhǎng)度(長(zhǎng)度可以為0)的字符串。 _(下橫線):代表任意單個(gè)字符。 例14 查所有姓劉的學(xué)生的姓名、學(xué)號(hào)和性別。 SELECT Sname, Sno, Ssex FROM Student WHERE Sname LIKE 劉%; 例15 查姓“歐陽(yáng)”且全名為三個(gè)漢字的學(xué)生的姓名。 SELECT Sname FROM Student WHERE Sname LIKE 歐陽(yáng)_ _; 注意,由于一個(gè)漢字占兩個(gè)字符的位置,所以匹配串歐陽(yáng)后面需要跟個(gè)_。 例16 查名字中第二字為“陽(yáng)”字的學(xué)生的姓名和學(xué)號(hào)。 SELECT Sname, Sno FROM Student
18、WHERE Sname LIKE _ _陽(yáng)%; 例17 查所有不姓劉的學(xué)生姓名。 SELECT Sname, Sno, Ssex FROM Student WHERE Sname NOT LIKE 劉%; 如果用戶要查詢的匹配字符串本身就含有%或_,比如要查名字為DB_Design的課程的學(xué)分,應(yīng)如何實(shí)現(xiàn)呢?這時(shí)就要使用ESCAPE 短語(yǔ)對(duì)通配符進(jìn)行轉(zhuǎn)義了。 例18 查DB_ Design課程的課程號(hào)和學(xué)分。 SELECT Cno, Ccredit FROM Course WHERE Cname LIKE DB_Design ESCAPE ESCAPE 短語(yǔ)表示 為換碼字符,這樣匹配串中緊跟在
19、 后面的字符“_”不再具有通配符的含義,而是取其本身含義,被轉(zhuǎn)義為普通的“_”字符。 例19 查以“DB_”開(kāi)頭,且倒數(shù)第三個(gè)字符為i的課程的詳細(xì)情況。 SELECT * FROM Course WHERE Cname LIKE DB_%i _ _ ESCAPE ; 涉及空值的查詢 某些學(xué)生選修某門(mén)課程后沒(méi)有參加考試,所以有選課記錄,但沒(méi)有考試成績(jī)。 例20 查詢一下缺少成績(jī)的學(xué)生的學(xué)號(hào)和相應(yīng)的課程號(hào)。 SELECT Sno, Cno FROM SC WHERE Grade IS NULL; 注意這里的IS不能用等號(hào)(=) 代替。 例21 查詢所有有成績(jī)記錄的學(xué)生的學(xué)號(hào)和課程號(hào)。 SELECT
20、 Sno, Cno FROM SC WHERE Grade IS NOT NULL; 多重條件查詢 邏輯運(yùn)算符AND和OR可用來(lái)聯(lián)結(jié)多個(gè)查詢條件。如果這兩個(gè)運(yùn)算符同時(shí)出現(xiàn)在同一個(gè)WHERE條件子句中,則AND的優(yōu)先級(jí)高于OR,但用戶可以用括號(hào)改變優(yōu)先級(jí)。 例22 查詢CS系年齡在20歲以下的學(xué)生姓名。 SELECT Sname FROM Student WHERE Sdept=CS AND Sage20; 例12 中的IN謂詞實(shí)際上是多個(gè)OR運(yùn)算符的縮寫(xiě),因此例12中的查詢也可以用OR運(yùn)算符寫(xiě)成如下等價(jià)形式: SELECT Sname, Ssex FROM Student WHERE Sdep
21、t=IS OR Sdept=MA OR Sdept=CS; 3. 對(duì)查詢結(jié)果排序 如果沒(méi)有指定查詢結(jié)果的顯示順序,DBMS將按其最方便的順序(通常是元組在表中的先后順序)輸出查詢結(jié)果。用戶也可以用ORDER BY子句指定按照一個(gè)或多個(gè)屬性列的升序(ASC)或降序(DESC)重新排列查詢結(jié)果,其中升序ASC為缺省值。 用ORDER BY子句對(duì)查詢結(jié)果按成績(jī)排序時(shí),若按升序排,成績(jī)?yōu)榭罩档脑M將最后顯示,若按降序排,成績(jī)?yōu)榭罩档脑M將最先顯示。 例23 查詢選修了3號(hào)課程的學(xué)生的學(xué)號(hào)及其成績(jī),查詢結(jié)果按分?jǐn)?shù)的降序排列。 SELECT Sno, Grade FROM SC WHERE Cno=3 O
22、RDER BY Grade DESC; 例24 查詢?nèi)w學(xué)生情況,查詢結(jié)果按所在系升序排列,對(duì)同一系中的學(xué)生按年齡降序排列。 SELECT * FROM Student ORDER BY Sdept, Sage DESC; 4. 使用集函數(shù) 為了進(jìn)一步方便用戶,增強(qiáng)檢索功能,SQL提供了許多集函數(shù),主要包括: COUNT(DISTINCT|ALL *) 統(tǒng)計(jì)元組個(gè)數(shù) COUNT(DISTINCT|ALL ) 統(tǒng)計(jì)一列中值的個(gè)數(shù) SUM(DISTINCT|ALL ) 計(jì)算一列值的總和(此列必須是數(shù)值型) AVG(DISTINCT|ALL ) 計(jì)算一列值的平均值(此列必須是數(shù)值型) MAX(DIS
23、TINCT|ALL ) 求一列值中的最大值 MIN(DISTINCT|ALL ) 求一列值中的最小值 如果指定DISTINCT短語(yǔ),則表示在計(jì)算時(shí)要取消指定列中的重復(fù)值。如果不指定DISTINCT短語(yǔ)或指定ALL短語(yǔ)(ALL為缺省值),則表示不取消重復(fù)值。 例25 查詢學(xué)生總?cè)藬?shù)。 SELECT COUNT(*) FROM Student; 例26 查詢選修了課程的學(xué)生人數(shù)。 SELECT COUNT(DISTINCT Sno) FROM SC; 學(xué)生每選修一門(mén)課,在SC中都有一條相應(yīng)的記錄,而一個(gè)學(xué)生一般都要選修多門(mén)課程,為避免重復(fù)計(jì)算學(xué)生人數(shù),必須在COUNT函數(shù)中用DISTINCT短語(yǔ)。
24、 例27 計(jì)算1號(hào)課程的平均成績(jī)。 SELECT AVG(Grade) FROM SC WHERE Cno=1; 例28 查詢學(xué)習(xí)1號(hào)課程的最高分?jǐn)?shù)。 SELECT MAX(Grade) FROM SC WHERE Cno=1; ); 5. 對(duì)查詢結(jié)果分組 GROUP BY子句可以將查詢結(jié)果表的各行按一列或多列取值相等的原則進(jìn)行分組。 例29 查詢各門(mén)課程的課程號(hào)及相應(yīng)的選課人數(shù)。 SELECT Cno, COUNT(Sno) FROM SC GROUP BY Cno; 該SELECT語(yǔ)句對(duì)SC表按Cno的取值進(jìn)行分組,所有具有相同Cno值的元組為一組,然后對(duì)每一組作用集函數(shù)COUNT以求得該
25、組的學(xué)生人數(shù)。查詢結(jié)果為: Cno COUNT(Sno) 1 22 2 34 3 44 4 33 5 48 如果分組后還要求按一定的條件對(duì)這些組進(jìn)行篩選,最終只輸出滿足指定條件的組,則可以使用HAVING短語(yǔ)指定篩選條件。 例30 查詢信息系選修了3門(mén)以上課程的學(xué)生的學(xué)號(hào)。 SELECT Sno FROM SC WHERE Sdept=IS GROUP BY Sno HAVING COUNT(*)3; cccccccccccccccccccccc3.3.2連接查詢 一個(gè)數(shù)據(jù)庫(kù)中的多個(gè)表之間一般都存在某種內(nèi)在聯(lián)系,它們共同提供有用的信息。前面的查詢都是針對(duì)一個(gè)表進(jìn)行的。 若一個(gè)查詢同時(shí)涉及兩個(gè)以
26、上的表,則稱之為連接查詢。連接查詢主要包括等值連接、非等值連接查詢、自身連接查詢、外連接查詢和復(fù)合條件連接查詢。 1. 等值與非等值連接查詢 連接謂詞:用來(lái)連接兩個(gè)表的條件稱為連接條件或連接謂詞,其一般格式為: . . 其中比較運(yùn)算符主要有:=、=、=、!= 此外連接謂詞還可以使用下面形式: . BETWEEN . AND . 當(dāng)連接運(yùn)算符為=時(shí),稱為等值連接。使用其它運(yùn)算符稱為非等值連接。 連接謂詞中的列名稱為連接字段。連接條件中的各連接字段類(lèi)型必須是可比的,但不必是相同的。 例如,可以都是字符型,或都是日期型;也可以一個(gè)是整型,另一個(gè)是實(shí)型,整型和實(shí)型都是數(shù)值型,因此是可比的。但若一個(gè)是字
27、符型,另一個(gè)是整數(shù)型就不允許了,因?yàn)樗鼈兪遣豢杀鹊念?lèi)型。 從概念上講DBMS執(zhí)行連接操作的過(guò)程是: 首先在表1中找到第一個(gè)元組,然后從頭開(kāi)始順序掃描或按索引掃描表2,查找滿足連接條件的元組,每找到一個(gè)元組, 就將表1中的第一個(gè)元組與該元組拼接起來(lái),形成結(jié)果表中一個(gè)元組。 表2全部掃描完畢后,再到表1中找第二個(gè)元組,然后再?gòu)念^開(kāi)始順序掃描或按索引掃描表2,查找滿足連接條件的元組,每找到一個(gè)元組, 就將表1中的第二個(gè)元組與該元組拼接起來(lái),形成結(jié)果表中一個(gè)元組。 重復(fù)上述操作,直到表1全部元組都處理完畢為止。 例32 查詢每個(gè)學(xué)生及其選修課程的情況。 SELECT Student.*, SC.* F
28、ROM Student, SC WHERE Student.Sno=SC.Sno; 連接運(yùn)算中有兩種特殊情況,一種稱為廣義笛卡兒積連接,另一種稱為自然連接。 廣義笛卡兒積:是不帶連接謂詞的連接。兩個(gè)表的廣義笛卡兒積即是兩表中元組的交叉乘積,也即其中一表中的每一元組都要與另一表中的每一元組作拼接,因此結(jié)果表往往很大。 自然連接:如果是按照兩個(gè)表中的相同屬性進(jìn)行等值連接,且目標(biāo)列中去掉了重復(fù)的屬性列,但保留了所有不重復(fù)的屬性列,則稱之為自然連接 例33 自然連接Student和SC表。 SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
29、 FROM Student, SC WHERE Student.Sno=SC.Sno; 2. 自身連接 連接操作不僅可以在兩個(gè)表之間進(jìn)行,也可以是一個(gè)表與其自己進(jìn)行連接,這種連接稱為表的自身連接。 例34 查詢每一門(mén)課的間接先修課(即先修課的先修課)。 SELECT FIRST.Cno, SECOND. Pcno FROM Course FIRST, Course SECOND WHERE FIRST.Pcno=SECOND.Cno; 3.復(fù)合條件連接 上面各個(gè)連接查詢中,WHERE子句中只有一個(gè)條件,即一個(gè)連接謂詞。WHERE子句中有多個(gè)條件的連接操作,稱為復(fù)合條件連接。 例35 查詢選修2
30、號(hào)課程且成績(jī)?cè)?0分以上的所有學(xué)生。 SELECT Student.Sno, Sname FROM Student, SC WHERE Student.Sno=SC.Sno AND SC.Cno=2 AND SC.Grade90; 連接操作除了可以是兩表連接,一個(gè)表與其自身連接外,還可以是兩個(gè)以上的表進(jìn)行連接,后者通常稱為多表連接。 例36 查詢每個(gè)學(xué)生及其選修的課程名其及成績(jī)。 SELECT Student.Sno, Sname, Course.Cname, SC.Grade FROM Student, SC, Course WHERE Student.Sno=SC.Sno and SC.C
31、no=Course.Cno; 在SQL語(yǔ)言中,一個(gè)SELECT-FROM-WHERE語(yǔ)句稱為一個(gè)查詢塊。將一個(gè)查詢塊嵌套在另一個(gè)查詢塊的WHERE子句或HAVING短語(yǔ)的條件中的查詢稱為嵌套查詢或子查詢。例如: SELECT Sname FROM Student WHERE Sno IN SELECT Sno FROM SC WHERE Cno=2; 在這個(gè)例子中,下層查詢塊 SELECT Sno FROM SC WHERE Cno=2是嵌套在上層查詢塊 SELECT Sname FROM Student WHERE Sno IN 的WHERE條件中的。上層的查詢塊又稱為外層查詢或父查詢或主查
32、詢,下層查詢塊又稱為內(nèi)層查詢或子查詢。SQL語(yǔ)言允許多層嵌套查詢。即一個(gè)子查詢中還可以嵌套其它子查詢。需要特別指出的是,子查詢的SELECT語(yǔ)句中不能使用ORDER BY子句,ORDER BY子句永遠(yuǎn)只能對(duì)最終查詢結(jié)果排序。 嵌套查詢的求解方法是由里向外處理。即每個(gè)子查詢?cè)谄渖弦患?jí)查詢處理之前求解,子查詢的結(jié)果用于建立其父查詢的查找條件。 嵌套查詢使得可以用一系列簡(jiǎn)單查詢構(gòu)成復(fù)雜的查詢,從而明顯地增強(qiáng)了SQL的查詢能力。以層層嵌套的方式來(lái)構(gòu)造程序正是 SQL(Structurred Query Language)中“結(jié)構(gòu)化”的含義所在 1. 帶有IN謂詞的子查詢 帶有IN謂詞的子查詢是指父查詢
33、與子查詢之間用IN進(jìn)行連接,判斷父查詢的某個(gè)屬性列值是否在子查詢的結(jié)果中。 由于在嵌套查詢中,子查詢的結(jié)果往往是一個(gè)集合,所以謂詞IN是嵌套查詢中最經(jīng)常使用的謂詞。 例37 查詢與“劉晨”在同一個(gè)系學(xué)習(xí)的學(xué)生。 查詢與“劉晨”在同一個(gè)系學(xué)習(xí)的學(xué)生,可以首先確定“劉晨”所在系名,然后再查找所有在該系學(xué)習(xí)的學(xué)生??梢苑植絹?lái)完成此查詢: 確定“劉晨”所在系名 SELECT Sdept FROM Student WHERE Sname=劉晨; 結(jié)果為: Sdept IS 查找所有在IS系學(xué)習(xí)的學(xué)生。 SELECT Sno, Sname, Sdept FROM Student WHERE Sdept=I
34、S; 結(jié)果為: Sno Sname Sdept 95001 劉晨 IS 95004 張立 IS 分步書(shū)寫(xiě)查詢畢竟比較麻煩,上述查詢實(shí)際上可以用子查詢來(lái)實(shí)現(xiàn),即將第一步查詢嵌入到第二步查詢中,用以構(gòu)造第二步查詢的條件。SQL語(yǔ)句如下: SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN SELECT Sdept FROM Student WHERE Sname=劉晨; 本例中的查詢也可以用我們前面學(xué)過(guò)的表的自身連接查詢來(lái)完成: SELECT Sno, Sname, Sdept FROM Student S1, Student S2 WHERE S
35、1.Sdept = S2.Sdept AND S2.Sname=劉晨; 例38 查詢選修了課程名為信息系統(tǒng)的學(xué)生學(xué)號(hào)和姓名。 SELECT Sno, Sname FROM Student WHERE Sno IN SELECT Sno FROM SC WHERE Cno IN SELECT Cno FROM Course WHERE Cname=信息系統(tǒng) Sno Sname 95001 李勇 95002 劉晨 本查詢同樣可以用連接查詢實(shí)現(xiàn): SELECT Sno, Sname FROM Student, SC, Course WHERE Student.Sno=SC.Sno AND SC.Cn
36、o=Course.Cno AND Course.Cname=信息系統(tǒng); 2. 帶有比較運(yùn)算符的子查詢 帶有比較運(yùn)算符的子查詢是指父查詢與子查詢之間用比較運(yùn)算符進(jìn)行連接。當(dāng)用戶能確切知道內(nèi)層查詢返回的是單值時(shí),可以用、 =、=、!=或等比較運(yùn)算符。 例如: 在例37中,由于一個(gè)學(xué)生只可能在一個(gè)系學(xué)習(xí),也就是說(shuō)內(nèi)查詢劉晨所在系的結(jié)果是一個(gè)唯一值,因此該查詢也可以用比較運(yùn)算符來(lái)實(shí)現(xiàn),其SQL語(yǔ)句如下: SELECT Sno, Sname, Sdept FROM Student WHERE Sdept = ( SELECT Sdept FROM Student WHERE Sname=劉晨); 需要注
37、意的是,子查詢一定要跟在比較符運(yùn)算之后,下列寫(xiě)法是錯(cuò)誤的: SELECT Sno, Sname, Sdept FROM Student WHERE (SELECT Sdept FROM Student WHERE Sname=劉晨) = Sdept; 3.4數(shù)據(jù)操縱 數(shù)據(jù)操縱命令將導(dǎo)致數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變。SQL語(yǔ)言的數(shù)據(jù)操縱形式包括:INSERT(向表中插入數(shù)據(jù))、UPDATE(修改表中已存在行中的數(shù)據(jù))、DELETE(刪除表中的數(shù)據(jù))。 3.4.1插入數(shù)據(jù) 通過(guò)INSERT語(yǔ)句,可以向基本表中插入數(shù)據(jù)。但要求在數(shù)據(jù)之前,基本表是已經(jīng)存在的。 INSERT語(yǔ)句用于向表中插入一行或者多行數(shù)據(jù)。
38、1. 插入單個(gè)元組 插入單個(gè)元組的插入單個(gè)元組的INSERT語(yǔ)句的格式為:語(yǔ)句的格式為: INSERT INTO (,.) VALUES ( ,.) 如果某些屬性列在如果某些屬性列在INTO子句中沒(méi)有出現(xiàn),則新記錄在這些子句中沒(méi)有出現(xiàn),則新記錄在這些列上將取空值。但必須注意的是,在表定義時(shí)說(shuō)明了列上將取空值。但必須注意的是,在表定義時(shí)說(shuō)明了NOT NULL的屬性列不能取空值。否則會(huì)出錯(cuò)。的屬性列不能取空值。否則會(huì)出錯(cuò)。 如果如果INTO子句中沒(méi)有指明任何列名,則新插入的記錄必須子句中沒(méi)有指明任何列名,則新插入的記錄必須在每個(gè)屬性列上均有值。在每個(gè)屬性列上均有值。 例1 將一個(gè)新學(xué)生記錄(學(xué)號(hào):
39、95020;姓名:陳冬;性別:男;所在系:IS;年齡:18歲)插入Student表中。 INSERT INTO Student VALUES (95020, 陳冬, 男, 18,IS); 例2 插入一條選課記錄(95020,1) 。 INSERT INTO SC(Sno, Cno) VALUES (95020, 1 ); 新插入的記錄在Grade列上取空值。 2. 插入子查詢結(jié)果 子查詢不僅可以嵌套在SELECT語(yǔ)句中,用以構(gòu)造父查詢的條件(如4.3.3節(jié)所述),也可以嵌套在INSERT語(yǔ)句中,用以生成要插入的數(shù)據(jù)。 這也稱為表間拷貝,即從一個(gè)表中抽取若干行數(shù)據(jù)插入到另一個(gè)表中。 插入子查詢結(jié)
40、果的INSERT語(yǔ)句的格式為: INSERT INTO ( ,.) 子查詢; 例3 對(duì)每一個(gè)系,求學(xué)生的平均年齡,并把結(jié)果存入數(shù)據(jù)庫(kù)。 對(duì)于這道題,首先要在數(shù)據(jù)庫(kù)中建立一個(gè)有兩個(gè)屬性列的新表,其中一列存放系名,另一列存放相應(yīng)系的學(xué)生平均年齡。 CREATE TABLE Deptage (Sdept CHAR(15) Avgage int); 然后對(duì)數(shù)據(jù)庫(kù)的Student表按系分組求平均年齡,再把系名和平均年齡存入新表中。 INSERT INTO Deptage(Sdept, Avgage) SELECT Sdept, AVG(Sage) FROM Student GROUP BY Sdept;
41、 3.4.2修改數(shù)據(jù) 修改操作又稱為更新操作,使用UPDATE語(yǔ)句修改基本表中某些指定列的數(shù)據(jù)(字段值)。其語(yǔ)句的一般格式為: UPDATE SET =,=. WHERE ; 其功能是修改指定表中滿足WHERE子句條件的元組。其中SET子句用于指定修改方法,即用的值取代相應(yīng)的屬性列值。如果省略WHERE子句,則表示要修改表中的所有元組。修改某一個(gè)元組的值 例4 將學(xué)生95001的年齡改為22歲。 UPDATE Student SET Sage=22 WHERE Sno=95001; 修改多個(gè)元組的值 例5 將所有學(xué)生的年齡增加1歲。 UPDATE Student SET Sage=Sage+1
42、; 修改操作與數(shù)據(jù)庫(kù)的一致性 UPDATE語(yǔ)句一次只能操作一個(gè)表。這會(huì)帶來(lái)一些問(wèn)題。例如,學(xué)號(hào)為95007的學(xué)生因病休學(xué)一年,復(fù)學(xué)后需要將其學(xué)號(hào)改為96089,由于Student表和SC表都有關(guān)于95007的信息,因此兩個(gè)表都需要修改,這種修改只能通過(guò)兩條UPDATE語(yǔ)句進(jìn)行。 第一條UPDATE語(yǔ)句修改Student表: UPDATE Student SET Sno=96089 WHERE Sno=95007; 第二條UPDATE語(yǔ)句修改SC表: UPDATE SC SET Sno=96089 WHERE Sno=95007; 在執(zhí)行了第一條UPDATE語(yǔ)句之后,數(shù)據(jù)庫(kù)中的數(shù)據(jù)已處于不一致?tīng)?/p>
43、態(tài),因?yàn)檫@時(shí)實(shí)際上已沒(méi)有學(xué)號(hào)為95007的學(xué)生了,但SC表中仍然記錄著關(guān)于95007學(xué)生的選課信息,即數(shù)據(jù)的參照完整性受到破壞。只有執(zhí)行了第二條UPDATE語(yǔ)句之后,數(shù)據(jù)才重新處于一致?tīng)顟B(tài)。 但如果執(zhí)行完一條語(yǔ)句之后,機(jī)器突然出現(xiàn)故障,無(wú)法再繼續(xù)執(zhí)行第二條UPDATE語(yǔ)句,則數(shù)據(jù)庫(kù)中的數(shù)據(jù)將永遠(yuǎn)處于不一致?tīng)顟B(tài)。因此必須保證這兩條UPDATE語(yǔ)句要么都做,要么都不做。 為解決這一問(wèn)題,數(shù)據(jù)庫(kù)系統(tǒng)通常都引入了事務(wù)(Transaction)的概念 3.4.3刪除數(shù)據(jù) 刪除語(yǔ)句的一般格式為: DELETE FROM WHERE ; DELETE語(yǔ)句的功能是從指定表中刪除滿足WHERE子句條件的所有元組
44、。 如果省略WHERE子句,表示刪除表中全部元組,但表的定義仍在字典中。 也就是說(shuō),DELETE語(yǔ)句刪除的是表中的數(shù)據(jù),而不是關(guān)于表的定義。 1. 刪除某一個(gè)元組的值 例7 刪除學(xué)號(hào)為95019的學(xué)生記錄。 DELETE FROM Student WHERE Sno=95019; DELETE操作也是一次只能操作一個(gè)表,因此同樣會(huì)遇到UPDATE操作中提到的數(shù)據(jù)不一致問(wèn)題。比如95019學(xué)生被刪除后,有關(guān)他的選課信息也應(yīng)同時(shí)刪除,而這必須用一條獨(dú)立的DELETE語(yǔ)句完成。 2. 刪除多個(gè)元組的值 例8 刪除所有的學(xué)生選課記錄。 DELETE FROM SC; 這條DELETE語(yǔ)句將使SC成為空
45、表,它刪除了SC的所有元組。 3.5 視圖 視圖和基本表不同,視圖是一個(gè)虛表,即視圖所對(duì)應(yīng)的數(shù)據(jù)不實(shí)際存在數(shù)據(jù)庫(kù)中,數(shù)據(jù)庫(kù)中只存儲(chǔ)視圖的定義(存放在數(shù)據(jù)字典中),因此不占用存儲(chǔ)空間。3.5.1視圖的定義 視圖是從一個(gè)或幾個(gè)基本表導(dǎo)出的表。 因?yàn)槿魏我粋€(gè)查詢結(jié)果其本身就是一個(gè)表,所以一個(gè)查詢可被用于定義一個(gè)視圖。1. 創(chuàng)建視圖 SQL語(yǔ)言用CREATE VIEW命令建立視圖,其一般格式為: CREATE VIEW (,.) AS WITH CHECK OPTION; 其中子查詢可以是任意復(fù)雜的SELECT語(yǔ)句,但通常不允許含有ORDER BY子句和DISTINCT短語(yǔ)。 WITH CHECK O
46、PTION表示對(duì)視圖進(jìn)行UPDATE、 INSERT和DELETE操作時(shí)要保證更新、插入或刪除的行滿足視圖定義中的謂詞條件(即子查詢中的條件表達(dá)式)。 說(shuō)明: 如果CREATE VIEW語(yǔ)句僅指定了視圖名,省略了組成視圖的各個(gè)屬性列名,則隱含該視圖由子查詢中SELECT子句目標(biāo)列中的諸字段組成。但在下列三種情況下必須明確指定組成視圖的所有列名: 其中某個(gè)目標(biāo)列不是單純的屬性名,而是集函數(shù)或列表達(dá)式; 多表連接時(shí)選出了幾個(gè)同名列作為視圖的字段; 需要在視圖中為某個(gè)列啟用新的更合適的名字。 需要說(shuō)明的是,組成視圖的屬性列名必須依照上面的原則,或者全部省略或者全部指定,沒(méi)有第三種選擇。 例1 建立信
47、息系學(xué)生的視圖。 CREATE VIEW IS_Student AS SELECT Sno, Sname, Sage FROM Student WHERE Sdept=IS; 實(shí)際上,DBMS執(zhí)行CREATE VIEW語(yǔ)句的結(jié)果只是把對(duì)視圖的定義存入數(shù)據(jù)字典,并不執(zhí)行其中的SELECT語(yǔ)句。只是在對(duì)視圖查詢時(shí),才按視圖的定義從基本表中將數(shù)據(jù)查出。 例2 建立信息系學(xué)生的視圖,并要求進(jìn)行修改和插入操作時(shí)仍須保證該視圖只有信息系的學(xué)生。 CREATE VIEW IS_Student AS SELECT Sno, Sname, Sage FROM Student WHERE Sdept=IS WIT
48、H CHECK OPTION; 由于在定義IS_Student視圖時(shí)加上了WITH CHECK OPTION子句,以后對(duì)該視圖進(jìn)行插入、修改和刪除操作時(shí),DBMS會(huì)自動(dòng)加上Sdept=IS的條件。 例3 建立信息系選修了1號(hào)課程的學(xué)生的視圖。 CREATE VIEW IS_S1(Sno, Sname, Grade) AS SELECT Student.Sno, Sname, Grade FROM Student, SC WHERE Sdept=IS AND Student.Sno=SC.Sno AND SC.Cno=1; 視圖不僅可以建立在一個(gè)或多個(gè)基本表上,也可以建立在一個(gè)或多個(gè)已定義好的視
49、圖上,或同時(shí)建立在基本表與視圖上。 例4 建立信息系選修了1號(hào)課程且成績(jī)?cè)?0分以上的學(xué)生的視圖。 CREATE VIEW IS_S2 AS SELECT Sno, Sname, Grade FROM IS_S1 WHERE Grade=90; 這里的視圖IS_S2就是建立在視圖IS_S1之上的。 定義基本表時(shí),為了減少數(shù)據(jù)庫(kù)中的冗余數(shù)據(jù),表中只存放基本數(shù)據(jù),由基本數(shù)據(jù)經(jīng)過(guò)各種計(jì)算派生出的數(shù)據(jù)一般是不存儲(chǔ)的。但由于視圖中的數(shù)據(jù)并不實(shí)際存儲(chǔ),所以定義視圖時(shí)可以根據(jù)應(yīng)用的需要,設(shè)置一些派生屬性列。這些派生屬性由于在基本表中并不實(shí)際存在,所以有時(shí)也稱他們?yōu)樘摂M列。帶虛擬列的視圖我們稱為帶表達(dá)式的視圖
50、。 例5 定義一個(gè)反映學(xué)生出生年份的視圖。 CREATE VIEW BT_S(Sno, Sname, Sbirth) AS SELECT Sno, Sname, 1996Sage FROM Student; 由于BT_S視圖中的出生年份值是通過(guò)一個(gè)表達(dá)式計(jì)算得到的,不是單純的屬性名,所以定義視圖時(shí)必須明確定義該視圖的各個(gè)屬性列名。BT_S視圖是一個(gè)帶表達(dá)式的視圖。 我們還可以用帶有集函數(shù)和GROUP BY子句的查詢來(lái)定義視圖。這種視圖稱為分組視圖。 例6 將學(xué)生的學(xué)號(hào)及他的平均成績(jī)定義為一個(gè)視圖。 我們假設(shè)SC表中“成績(jī)”列Grade為數(shù)值型,否則無(wú)法求平均值。 CREATE VIEW S_G
51、(Sno, Gavg) AS SELECT Sno, AVG(Grade) FROM SC GROUP BY Sno; 例7 將Student表中所有女生記錄定義為一個(gè)視圖。 CREATE VIEW F_Student(stdnum,name,sex,age,dept) AS SELECT * FROM Student WHERE Ssex=女; 這里視圖F_Student是由子查詢“SELECT *”建立的。由于該視圖一旦建立后,Student表就構(gòu)成了視圖定義的一部分,如果以后修改了基本表Student的結(jié)構(gòu),則Student表與F_Student視圖的映像關(guān)系受到破壞,因而該視圖就不能正
52、確工作了。 為避免出現(xiàn)這類(lèi)問(wèn)題,可以采用下列兩種方法: 建立視圖時(shí)明確指明屬性列名,而不是簡(jiǎn)單地用SELECT *。即: CREATE VIEW F_Student(stdnum,name,sex,age,dept) AS SELECT Sno, Sname, Ssex, Sage, Sdept FROM Student WHERE Ssex=女; 這樣,如果為Student表增加新列后,原視圖仍能正常工作,只是新增的列不在視圖中而已。 在修改基本表之后刪除原來(lái)的視圖,然后重建視圖。這是最保險(xiǎn)的方法。 3.5.2視圖的刪除 如果某個(gè)視圖已無(wú)用了,可用DROP VIEW語(yǔ)句刪除。 語(yǔ)句的格式為:
53、 DROP VIEW ; 一個(gè)視圖被刪除后,由此視圖導(dǎo)出的其他視圖也將失效,用戶應(yīng)該使用DROP VIEW語(yǔ)句將他們一一刪除。 例8 刪除視圖IS_S1。 DROP VIEW IS_S1; 執(zhí)行此語(yǔ)句后,IS_S1視圖的定義將從數(shù)據(jù)字典中刪除。由IS_S1視圖導(dǎo)出的IS_S2視圖的定義雖仍在數(shù)據(jù)字典中,但該視圖已無(wú)法使用了,因此應(yīng)該同時(shí)刪除。 需要注意的是,與基本表不同,視圖不能修改。如果想修改視圖,只能先把它刪除,然后重新定義。 3.5.3視圖的查詢 視圖定義后,用戶就可以象對(duì)基本表進(jìn)行查詢一樣對(duì)視圖進(jìn)行查詢了。 DBMS執(zhí)行對(duì)視圖的查詢時(shí),首先進(jìn)行有效性檢查,檢查查詢涉及的表、視圖等是否在
54、數(shù)據(jù)庫(kù)中存在,如果存在,則從數(shù)據(jù)字典中取出查詢涉及的視圖的定義,把定義中的子查詢和用戶對(duì)視圖的查詢結(jié)合起來(lái),轉(zhuǎn)換成對(duì)基本表的查詢,然后再執(zhí)行這個(gè)經(jīng)過(guò)修正的查詢。 將對(duì)視圖的查詢轉(zhuǎn)換為對(duì)基本表的查詢的過(guò)程稱為視圖的消解(View Resolution)。如圖所示。 例1 在信息系學(xué)生的視圖中找出年齡小于20歲的學(xué)生。 SELECT Sno, Sage FROM IS_Student WHERE Sage20; DBMS執(zhí)行此查詢時(shí),將其與IS_Student視圖定義中的子查詢 SELECT Sno, Sname, Sage FROM Student WHERE Sdept=IS ; 結(jié)合起來(lái),轉(zhuǎn)
55、換成對(duì)基本表Student的查詢,修正后的查詢語(yǔ)句為: SELECT Sno, Sage FROM Student WHERE Sdept=IS AND Sage20; 視圖是定義在基本上的虛表,它可以和其他基本表一起使用,實(shí)現(xiàn)連接查詢或嵌套查詢。 這也就是說(shuō),在關(guān)系數(shù)據(jù)庫(kù)的三級(jí)模式結(jié)構(gòu)中,外模式不僅包括視圖,而且還可以包括一些基本表。 例2 查詢信息系選修了1號(hào)課程的學(xué)生。 SELECT Sno, Sname FROM IS_Student, SC WHERE IS_Student.Sno=SC.Sno AND SC.Cno=1; 本查詢涉及虛表IS_Student和基本表SC,通過(guò)這兩個(gè)表
56、的連接來(lái)完成用戶請(qǐng)求。 3.5.4視圖的更新 更新視圖包括插入INSERT、刪除DELETE和修改UPDATE三類(lèi)操作。 由于視圖是不實(shí)際存儲(chǔ)數(shù)據(jù)的虛表,因此對(duì)視圖的更新,最終要轉(zhuǎn)換為對(duì)基本表的更新。 為防止用戶通過(guò)視圖對(duì)數(shù)據(jù)進(jìn)行增刪改時(shí),無(wú)意或故意操作不屬于視圖范圍內(nèi)的基本表數(shù)據(jù),可在定義視圖時(shí)加上WITH CHECK OPTION子句,這樣在視圖上增刪改數(shù)據(jù)時(shí),DBMS會(huì)進(jìn)一步檢查視圖定義中的條件,若不滿足條件,則拒絕執(zhí)行該操作。 例1 將信息系學(xué)生視圖IS_Student中學(xué)號(hào)為95002的學(xué)生姓名改為“劉辰”。 UPDATE IS_Student SET Sname=劉辰 WHERE
57、Sno=95002; 與查詢視圖類(lèi)似,DBMS執(zhí)行此語(yǔ)句時(shí),首先進(jìn)行有效性檢查,檢查所涉及的表、視圖等是否在數(shù)據(jù)庫(kù)中存在,如果存在,則從數(shù)據(jù)字典中取出該語(yǔ)句涉及的視圖的定義,把定義中的子查詢和用戶對(duì)視圖的更新操作結(jié)合起來(lái),轉(zhuǎn)換成對(duì)基本表的更新,然后再執(zhí)行這個(gè)經(jīng)過(guò)修正的更新操作。 轉(zhuǎn)換后的更新語(yǔ)句為: UPDATE Student SET Sname=劉辰 WHERE Sno=95002 AND Sdept=IS; 例2 向信息系學(xué)生視圖IS_S中插入一個(gè)新的學(xué)生記錄,其中學(xué)號(hào)為95029,姓名為趙新,年齡為20歲。 INSERT INTO IS_Student VALUES(95029, 趙新
58、, 20); DBMS將其轉(zhuǎn)換為對(duì)基本表的更新: INSERT INTO Student(Sno,Sname,Sage,Sdept) VALUES(95029, 趙新, 20, IS); 這里系統(tǒng)自動(dòng)將系名IS放入VALUES子句中。 例3 刪除計(jì)算機(jī)系學(xué)生視圖CS_S中學(xué)號(hào)為95029的記錄。 DELETE FROM IS_Student WHERE Sno=95029; DBMS將其轉(zhuǎn)換為對(duì)基本表的更新: DELETE FROM Student WHERE Sno=95029 AND Sdept=IS; 關(guān)于更新的限制: 在關(guān)系數(shù)據(jù)庫(kù)中,并不是所有的視圖都是可更新的,因?yàn)橛行┮晥D的更新不能
59、唯一地有意義地轉(zhuǎn)換成對(duì)相應(yīng)基本表的更新。 例如DB2規(guī)定: 若視圖是由兩個(gè)以上基本表導(dǎo)出的,則此視圖不允許更新。 若視圖的字段來(lái)自字段表達(dá)式或常數(shù),則不允許對(duì)此視圖執(zhí)行INSERT和UPDATE操作,但允許執(zhí)行DELETE操作。 若視圖的字段來(lái)自集函數(shù),則此視圖不允許更新。 若視圖定義中含有GROUP BY子句,則此視圖不允許更新。 若視圖定義中含有DISTINCT短語(yǔ),則此視圖不允許更新。 若視圖定義中有嵌套查詢,并且內(nèi)層查詢的FROM子句中涉及的表也是導(dǎo)出該視圖的基本表,則此視圖不允許更新。 一個(gè)不允許更新的視圖上定義的視圖也不允許更新。 3.5.5視圖的特點(diǎn) 視圖能夠簡(jiǎn)化用戶的操作 視圖
60、使用戶能以多種角度看待同一數(shù)據(jù) 視圖對(duì)重構(gòu)數(shù)據(jù)庫(kù)提供了一定程度的邏輯獨(dú)立性 視圖能夠?qū)C(jī)密數(shù)據(jù)提供安全保護(hù) 3.6 數(shù)據(jù)控制 SQL數(shù)據(jù)控制功能是指控制用戶對(duì)數(shù)據(jù)的存取權(quán)力。 3.6.1數(shù)據(jù)控制概述 由DBMS提供統(tǒng)一的數(shù)據(jù)控制功能是數(shù)據(jù)庫(kù)系統(tǒng)的特點(diǎn)之一。 數(shù)據(jù)控制亦稱為數(shù)據(jù)保護(hù),包括數(shù)據(jù)的安全性控制、完整性控制、并發(fā)控制和恢復(fù)。這里主要介紹SQL的數(shù)據(jù)控制功能。 SQL語(yǔ)言提供了數(shù)據(jù)控制功能,能夠在一定程度上保證數(shù)據(jù)庫(kù)中數(shù)據(jù)的安全性、完整性,并提供了一定的并發(fā)控制及恢復(fù)能力。 數(shù)據(jù)庫(kù)的完整性是指數(shù)據(jù)庫(kù)中數(shù)據(jù)的正確性與相容性。 SQL語(yǔ)言定義完整性約束條件的功能主要體現(xiàn)在CREATE TABL
溫馨提示
- 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è)開(kāi)戶銀行合同范本
- 個(gè)體老板合同范本
- vr公司合同范本
- 2025年煙臺(tái)駕駛資格證模擬考試
- 化妝店轉(zhuǎn)租上海合同范本
- 獸醫(yī)診所轉(zhuǎn)讓合同范本
- 副業(yè)兼職合同范本
- 二手車(chē)行業(yè)勞動(dòng)合同范本
- 軍旅衣服租賃合同范本
- 農(nóng)村房屋場(chǎng)地出租合同范本
- 綜合應(yīng)用能力事業(yè)單位考試(綜合管理類(lèi)A類(lèi))試卷及解答參考(2025年)
- Unit1Lesson2HowDoWeLikeTeachers'Feedback-課件高中英語(yǔ)北師大版選擇性
- 香港(2024年-2025年小學(xué)二年級(jí)語(yǔ)文)人教版摸底考試試卷(含答案)
- 民法典物權(quán)編詳細(xì)解讀課件
- DL∕T 5136-2012 火力發(fā)電廠、變電站二次接線設(shè)計(jì)技術(shù)規(guī)程
- 《推力和拉力》課件
- 西師版小學(xué)數(shù)學(xué)二年級(jí)(下)表格式全冊(cè)教案
- 娛樂(lè)場(chǎng)所安全承諾聲明
- 2025屆廣東省廣州市番禺區(qū)數(shù)學(xué)高一下期末檢測(cè)試題含解析
- 2024年鎮(zhèn)江市高等專(zhuān)科學(xué)校單招職業(yè)適應(yīng)性測(cè)試題庫(kù)完美版
- 珠海市高級(jí)技工學(xué)校校企合作管理辦法修訂
評(píng)論
0/150
提交評(píng)論