第2章 SQL語言與關(guān)系數(shù)據(jù)理論_第1頁
第2章 SQL語言與關(guān)系數(shù)據(jù)理論_第2頁
第2章 SQL語言與關(guān)系數(shù)據(jù)理論_第3頁
第2章 SQL語言與關(guān)系數(shù)據(jù)理論_第4頁
第2章 SQL語言與關(guān)系數(shù)據(jù)理論_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、教材:數(shù)據(jù)庫技術(shù)及應(yīng)用 2006年4月寧可、吳菁、胡海編著本章要點(diǎn) 關(guān)系數(shù)據(jù)庫 結(jié)構(gòu)化查詢語言 數(shù)據(jù)庫設(shè)計(jì)理論 目 錄2.1 關(guān)系數(shù)據(jù)庫 2.1.1 關(guān)系數(shù)據(jù)結(jié)構(gòu) 2.1.2 關(guān)系操作 2.1.3 關(guān)系的完整性 2.2 SQL語言 2.2.1 SQL概述及特點(diǎn) 2.2.2 SQL數(shù)據(jù)定義 2.2.3 SQL數(shù)據(jù)查詢 2.2.4 SQL數(shù)據(jù)操縱 2.2.5 數(shù)據(jù)控制 2.3 關(guān)系數(shù)據(jù)理論 2.3.1 關(guān)系模式可能存在的問題 2.3.2 函數(shù)依賴及規(guī)范化小結(jié)2.1 關(guān)系關(guān)系數(shù)據(jù)庫數(shù)據(jù)庫 關(guān)系數(shù)據(jù)庫系統(tǒng)是支持關(guān)系模型的數(shù)據(jù)庫系統(tǒng)。關(guān)系模型由關(guān)系數(shù)據(jù)結(jié)構(gòu)、關(guān)系操作集合和關(guān)系完整性約束三部分組成。 關(guān)系

2、數(shù)據(jù)庫是表的集合,數(shù)據(jù)庫中的表,數(shù)學(xué)家稱為關(guān)系。關(guān)系數(shù)據(jù)庫中還定義了關(guān)系操作和完整性約束,關(guān)系操作就是對(duì)表中的數(shù)據(jù)的處理、查詢,完整性約束就是表中的數(shù)據(jù)要滿足的條件,這些條件由數(shù)據(jù)庫系統(tǒng)自動(dòng)維護(hù),產(chǎn)生違反這些約束條件的對(duì)數(shù)據(jù)的操作會(huì)被拒絕執(zhí)行。 2.1.1 關(guān)系數(shù)據(jù)關(guān)系數(shù)據(jù)結(jié)構(gòu)結(jié)構(gòu) 在關(guān)系模型中,無論是實(shí)體還是實(shí)體之間的聯(lián)系均由單一的結(jié)構(gòu)即關(guān)系(表)來表示。關(guān)系模型是建立在集合代數(shù)的基礎(chǔ)上的。 1 關(guān)系的定義 在用戶觀點(diǎn)下,關(guān)系模型中數(shù)據(jù)的邏輯結(jié)構(gòu)是一張二維表。二維表的每一列稱為屬性。每個(gè)屬性有一個(gè)取值范圍,稱為值域。每個(gè)屬性對(duì)應(yīng)一個(gè)值域。下面是二維表的一個(gè)實(shí)例。 學(xué)號(hào)學(xué)號(hào)姓名姓名性性別別1張

3、三男2李四男2 關(guān)系中的基本名詞(1) 關(guān)鍵字 能唯一標(biāo)識(shí)一行記錄或元組的一個(gè)或一組屬性。(2) 候選關(guān)鍵字(Candidate key)和主關(guān)鍵字(Primary key) 能作為關(guān)鍵字的屬性可能有很多,這些屬性稱為候選關(guān)鍵字。為數(shù)據(jù)管理方便,若一個(gè)關(guān)系有多個(gè)候選關(guān)鍵字時(shí),指定其中一個(gè)為主關(guān)鍵字。(3) 主屬性(Primary Attribute)和非主屬性(Non-key Attribute) 候選關(guān)鍵字中的屬性為主屬性。不包含在任何候選關(guān)鍵字中的屬性為非主屬性。3 數(shù)據(jù)庫中關(guān)系的類型 關(guān)系可以有三種類型:基本關(guān)系(通常稱為基本表或基表)查詢表和視圖表。 (1) 基本表 基本表是關(guān)系數(shù)據(jù)庫

4、中實(shí)際存在的表,它是實(shí)際存儲(chǔ)數(shù)據(jù)的邏輯表。 (2) 查詢表 它是從基本表中查詢得到的,一般是臨時(shí)表。 (3) 視圖表 視圖表是由基本表或其它視圖表導(dǎo)出的表,它是為數(shù)據(jù)處理方便以及數(shù)據(jù)安全要求而設(shè)計(jì)的虛表,它一般是不存儲(chǔ)數(shù)據(jù)的,而只是存儲(chǔ)提取數(shù)據(jù)的條件,它的數(shù)據(jù)依賴于基本表。 4 基本關(guān)系的性質(zhì)基本關(guān)系具有如下六條性質(zhì):(1) 列是同性質(zhì)的,即同一列中的分量是同一類型的數(shù)據(jù)。 (2) 關(guān)系中的列又稱為屬性,并賦予屬性名。不同列的屬性名不同。不同列可以取相同的數(shù)據(jù)類型。 (3) 列的次序可以任意交換。 (4) 任意兩個(gè)元組不能完全相同。 (5) 行的次序可以任意交換。 (6) 列具有原子性,即每一

5、列值是不可分的數(shù)據(jù)項(xiàng)5 關(guān)系模式 關(guān)系模式是對(duì)關(guān)系的描述,可以理解為表的結(jié)構(gòu)定義。 關(guān)系實(shí)際上就是關(guān)系模式在某一時(shí)刻的狀態(tài)或內(nèi)容。也就是說,關(guān)系模式是型,關(guān)系是它的值。 6 關(guān)系數(shù)據(jù)庫 在關(guān)系模型中,實(shí)體以及實(shí)體間的聯(lián)系都是用關(guān)系來表示。在一個(gè)給定應(yīng)用中,所有實(shí)體及實(shí)體之間聯(lián)系的集合構(gòu)成一個(gè)關(guān)系數(shù)據(jù)庫。關(guān)系數(shù)據(jù)庫也有型和值之分。 2.1.2 關(guān)系操作關(guān)系操作 關(guān)系模型給出了關(guān)系操作的能力,但不對(duì)具體的RDBMS給出具體的語法要求。關(guān)系操作語言靈活方便,表達(dá)能力和功能強(qiáng)大。關(guān)系模型的數(shù)據(jù)操作采用集合操作方式,即操作對(duì)象和結(jié)果都是集合。 關(guān)系模型中常用的關(guān)系操作包括數(shù)據(jù)查詢、數(shù)據(jù)維護(hù)和數(shù)據(jù)控制三大

6、功能。數(shù)據(jù)查詢指數(shù)據(jù)檢索、統(tǒng)計(jì)、排序等功能;數(shù)據(jù)維護(hù)指數(shù)據(jù)的增加、刪除、修改等數(shù)據(jù)的更新功能;數(shù)據(jù)控制是為了保證數(shù)據(jù)的安全性和完整性而采用的數(shù)據(jù)存儲(chǔ)控制及并發(fā)控制等功能。 2.1.3 關(guān)系的完整性關(guān)系的完整性 1 實(shí)體完整性 現(xiàn)實(shí)世界中的實(shí)體是可區(qū)分的,即它們具有某種唯一性標(biāo)識(shí)。相應(yīng)地,關(guān)系模型中以主鍵(主關(guān)鍵字)作為唯一性標(biāo)識(shí)。主鍵中的屬性即主屬性不能取空值。所謂空值就是“不知道”或“無意義”的值。2 參照完整性 現(xiàn)實(shí)世界中的實(shí)體之間往往存在某種聯(lián)系,在關(guān)系模型中實(shí)體及實(shí)體間的聯(lián)系都是用關(guān)系來描述的。這樣就自然存在著關(guān)系與關(guān)系間的引用。 3. 用戶定義的完整性 用戶定義的完整性是針對(duì)某一具體

7、關(guān)系數(shù)據(jù)庫的約束條件,它反映某一具體應(yīng)用所涉及的數(shù)據(jù)必須滿足的語義要求。例如:某個(gè)屬性的取值不能為空,學(xué)生考試的成績(jī)?nèi)≈捣秶?到100之間。 2.2 SQL語言語言 SQL全稱是“Structured Query Language”,即結(jié)構(gòu)化查詢語言,它目前是關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)語言,它是在1974年由Boyce和Chamberlin提出的。經(jīng)過不斷修改、擴(kuò)充和完善,SQL語言最終發(fā)展成為關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)語言。由于它功能豐富、語言簡(jiǎn)潔、易學(xué)易用,所以深受用戶和計(jì)算機(jī)工業(yè)界的歡迎,被各計(jì)算機(jī)公司和軟件公司廣泛采用。 SQL標(biāo)準(zhǔn)的影響超出了數(shù)據(jù)庫領(lǐng)域,SQL成為國(guó)際標(biāo)準(zhǔn)后,它在數(shù)據(jù)庫以外的其他領(lǐng)域也

8、得到了重視和采用。在未來一段相當(dāng)長(zhǎng)的時(shí)間,SQL將是數(shù)據(jù)庫語言領(lǐng)域中的一個(gè)主流語言。 2.2.1 SQL概述及特點(diǎn)概述及特點(diǎn) 1. SQL概述 SQL是一種結(jié)構(gòu)化查詢語言,其功能并不象名稱所顯示的那樣僅僅是查詢,而是一個(gè)通用的、功能強(qiáng)大的關(guān)系數(shù)據(jù)庫語言。SQL從主要功能上可以分為4個(gè)部分:數(shù)據(jù)定義、數(shù)據(jù)查詢、數(shù)據(jù)操縱和數(shù)據(jù)控制。它是一個(gè)綜合的、通用的關(guān)系數(shù)據(jù)庫查詢語言。它的特點(diǎn)如下: (1) 功能一體化 (2) 高度非過程化 (3) 以同一種語法結(jié)構(gòu)提供兩種使用方式 (4) 語言簡(jiǎn)潔,易學(xué)易用 2. SQL語言的基本概念 SQL支持三級(jí)模式結(jié)構(gòu),外模式對(duì)應(yīng)于視圖和部分基本表,模式對(duì)應(yīng)于基本表,

9、內(nèi)模式對(duì)應(yīng)于存儲(chǔ)文件。 基本表是獨(dú)立存在的表,一個(gè)關(guān)系就是一個(gè)表。基本表是按數(shù)據(jù)全局邏輯模式建立的。全體基本表構(gòu)成了數(shù)據(jù)庫的模式。一個(gè)SQL模式(Schema)是表和約束的集合。 視圖是從基本表或其他視圖中導(dǎo)出的表,它本身不獨(dú)立存儲(chǔ)在數(shù)據(jù)庫中,也就是說數(shù)據(jù)庫中只存放視圖的定義而不存放視圖的數(shù)據(jù),這些數(shù)據(jù)仍存放在導(dǎo)出視圖的基本表中。因此,視圖是一個(gè)虛表。 2.2.2 SQL數(shù)據(jù)定義數(shù)據(jù)定義 SQL的數(shù)據(jù)定義功能包括定義表、定義視圖、定義索引和定義數(shù)據(jù)庫。SQL的數(shù)據(jù)定義語句見下表。 操作對(duì)操作對(duì)象象創(chuàng)建語句創(chuàng)建語句刪除語句刪除語句修改語句修改語句基本表CREATE TABLEDROP TABLE

10、ALTER TABLE索引CREATE INDEXDROP INDEXALTER INDEX視圖CREATE VIEWDROP VIEWALTER VIEW數(shù)據(jù)庫CREATE DATABASEDROP DATABASEALTER DATABASE 1. 基本表的定義和維護(hù) SQL基本表的定義和維護(hù)功能包括表的定義、修改和刪除。(1) 定義基本表( CREATE TABLE) 例2-2 建立一個(gè)“學(xué)生”表,它由學(xué)號(hào)、姓名、性別、年齡、所在系五個(gè)屬性組成,年齡是整型數(shù)據(jù),其它為字符型。 CREATE TABLE 學(xué)生 (學(xué)號(hào) CHAR(5), 姓名 CHAR(20), 年齡 INT, 性別 CHA

11、R(2), 所在系 CHAR(20), ) (2)修改基本表( ALTER TABLE) 例2-6 刪除“學(xué)生”表中“入學(xué)時(shí)間”列。 ALTER TABLE 學(xué)生 DROP COLUMN 入學(xué)時(shí)間; (3) 刪除基本表 例2-7 刪除學(xué)生表 DROP TABLE學(xué)生 2. 索引的定義和維護(hù) 當(dāng)你閱讀一本厚書時(shí),如果你想快速找到特定的內(nèi)容,你就需要查看目錄,找到你所關(guān)心的內(nèi)容在書中的準(zhǔn)確位置頁碼,然后直接翻到這個(gè)位置。索引對(duì)于表,就相當(dāng)于書的目錄。索引可以提高數(shù)據(jù)查詢速度。 可以對(duì)頻繁查詢的表增加索引。只有按有索引的列查詢,索引才有作用。 (1)建立索引 (CREATE INDEX ) 例2-8

12、 為學(xué)生表建立索引,按學(xué)號(hào)升序建唯一索引。 CREATE UNIQUE INDEX Stusno ON 學(xué)生 (學(xué)號(hào))(2) 刪除索引 ( DROP INDEX ) 例2-9 DROP INDEX 學(xué)生. Stusno 2.2.3 SQL數(shù)據(jù)查詢數(shù)據(jù)查詢 數(shù)據(jù)庫查詢是數(shù)據(jù)庫的核心操作,查詢就是從數(shù)據(jù)庫中挑選、提取所需要的數(shù)據(jù)。SQL提供了SELECT語句進(jìn)行數(shù)據(jù)庫的查詢,該語句使用方式靈活、功能強(qiáng)大。 SELECT語句的語法格式為:SELECT ALL | DISTINCT,. FROM , . WHERE GROUP BY HAVING ORDER BY ASC|DESC; 1. 簡(jiǎn)單查詢

13、簡(jiǎn)單查詢是指從一個(gè)表中進(jìn)行查詢,也叫單表查詢。如選擇一個(gè)表中的某些列、某些行。(1) 查詢指定列例2-10 查詢?nèi)w學(xué)生的姓名與學(xué)號(hào)。 學(xué)生表中有很多列:學(xué)號(hào),姓名,年齡,性別,所在系,而下列語句只選擇學(xué)號(hào)和姓名兩列,即查詢的結(jié)果是一個(gè)只包含兩列的新關(guān)系。 SELECT 學(xué)號(hào),姓名 FROM 學(xué)生;(2) 查詢?nèi)苛欣?-11 查詢學(xué)生表的全部列: SELECT * FROM 學(xué)生 也可以寫為: SELECT學(xué)號(hào),姓名,年齡,性別,所在系(3) 查詢經(jīng)過計(jì)算的值 SELECT子句可以包含表達(dá)式,運(yùn)算對(duì)象可以是常量或?qū)傩浴@?-12 查詢5年之后學(xué)生的年齡。假如數(shù)據(jù)庫中學(xué)生的年齡是今年的年齡。

14、SELECT 學(xué)號(hào),姓名,年齡+5 FROM 學(xué)生(4) 消除取值重復(fù)的行 一個(gè)表中兩個(gè)本來不完全相同的行,選擇部分列后,可能完全相同了。例2-13 查詢選修了課程的學(xué)號(hào)。 SELECT 學(xué)號(hào) FROM 選課 如果要去掉重復(fù)行,必須指定短語DISTINCT: SELECT DISTINCT 學(xué)號(hào) FROM 選課 取消了重復(fù)行,結(jié)果就是選了課的學(xué)生學(xué)號(hào)。 (5) 查詢滿足條件的行 WHERE子句通過條件表達(dá)式描述表中行的選擇條件。DBMS系統(tǒng)根據(jù)選擇條件掃描表中的每一行,把不符合條件的行篩選掉。WHERE子句常用的查詢條件,如下表所示: 查詢條件查詢條件常用謂詞常用謂詞比較=,=,=,! ,!;

15、NOT + 上述比較運(yùn)算符確定范圍B E T W E E N A N D , N O T BETWEEN AND確定集合IN,NOT IN字符匹配LIKE,NOT LIKE空 值IS NULL,IS NOT NULL多重條件AND,OR 比較 例2-14 查詢信息系學(xué)生的名單 SELECT 姓名 FROM 學(xué)生 WHERE 所在系=信息系例2-15 查詢所有20歲以下的學(xué)生姓名和年齡 SELECT 姓名,年齡 FROM 學(xué)生 WHERE 年齡20例2-16 查詢有成績(jī)不及格的學(xué)生的學(xué)號(hào) SELECT DISTINCT 學(xué)號(hào) FROM 選課 WHERE 成績(jī)60 確定范圍例2-17 查詢年齡在2

16、0到23歲(包括20和23)之間的學(xué)生姓名、年齡、所在系。 SELECT 姓名,年齡,所在系 FROM 學(xué)生 WHERE 年齡BETWEEN 20 AND 23 確定集合例2-18 查詢數(shù)學(xué)系或化學(xué)系學(xué)生的姓名、性別、所在系。 SELECT 姓名,性別,所在系 FROM 學(xué)生 WHERE 所在系 IN (數(shù)學(xué)系,化學(xué)系) 字符串的匹配。 例2-19 查詢姓劉的學(xué)生的姓名、性別、所在系。 SELECT 姓名,性別,所在系 FROM 學(xué)生 WHERE姓名 LIKE 劉% 涉及空值的查詢例2-22 查詢選修了課程而沒參加考試的學(xué)生名單及課程號(hào)。 SELECT 學(xué)號(hào),課程號(hào) FROM 選課 WHERE

17、成績(jī) IS NULL 多重條件查詢 如果查詢條件多于兩個(gè),則要使用邏輯運(yùn)算符AND和OR連接多個(gè)條件,AND的優(yōu)先級(jí)高于OR,但可使用括號(hào)改變運(yùn)算順序。例2-23 查詢計(jì)算機(jī)系姓趙的學(xué)生。 SELECT 姓名 FROM 學(xué)生 WHERE所在系=計(jì)算機(jī)系 AND 姓名 LIKE 趙%(6) 對(duì)查詢結(jié)果排序 如果沒有指定查詢結(jié)果的顯示順序,DBMS通常按其數(shù)據(jù)錄入的先后順序(物理存儲(chǔ)順序)輸出查詢結(jié)果。用戶也可以用ORDER BY子句指定按照一個(gè)或多個(gè)屬性列的升序(ASC)或降序(DESC)重新排列查詢結(jié)果,其中升序ASC為缺省值。例2-24 查詢選修了3號(hào)課程的學(xué)生的學(xué)號(hào)及其成績(jī),查詢結(jié)果按成績(jī)

18、的降序排列。 SELECT 學(xué)號(hào),成績(jī) FROM 選課 WHERE 課程號(hào)3 ORDER BY 成績(jī) DESC (7) 使用集合函數(shù) 為了進(jìn)一步方便用戶,增強(qiáng)檢索功能,SQL提供了許多集函數(shù),常用的集函數(shù)見下表。函數(shù)名函數(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(DISTINCT | ALL 列名)求一列值中的最大值MIN(DISTINC

19、T | ALL 列名)求一列值中的最大值例2-25 查詢學(xué)生總?cè)藬?shù)。 SELECT COUNT(*) FROM 學(xué)生例2-26 查詢選修了課程的學(xué)生人數(shù)。 SELECT COUNT(DISTINCT 學(xué)號(hào)) FROM 選課 學(xué)生每選修一門課,在選課中都有一條相應(yīng)的記錄,而一個(gè)學(xué)生一般都要選修多門課,為避免重復(fù)計(jì)算學(xué)生人數(shù),必須在COUNT函數(shù)中用DISTINCT限定詞。(8) 對(duì)查詢結(jié)果分組 GROUP BY子句可以將查詢結(jié)果表的各行按一列或多列的值分組,值相等的為一組。對(duì)查詢結(jié)果分組的目的是為了細(xì)化集函數(shù)的作用對(duì)象。如果未對(duì)查詢結(jié)果分組,集函數(shù)將作用于整個(gè)查詢結(jié)果,即整個(gè)查詢結(jié)果只有一個(gè)函數(shù)

20、值,如上面的例題,否則,集函數(shù)將作用于每一個(gè)組,即每一組都有一個(gè)函數(shù)值。例2-28 查詢各個(gè)課程號(hào)與相應(yīng)的選課人數(shù)。 SELECT 課程號(hào),COUNT(學(xué)號(hào)) FROM 選課 GROUP BY 課程號(hào) 該SELECT語句對(duì)課程表按課程號(hào)的取值進(jìn)行分組,所有具有相同課程號(hào)的行為一組,然后對(duì)每一組作用集函數(shù)COUNT以求得該組的學(xué)生人數(shù)。 2. 連接查詢 一個(gè)數(shù)據(jù)庫中的多個(gè)表之間一般都存在某種內(nèi)在聯(lián)系,它們共同提供有用的信息。前面的查詢都是針對(duì)一個(gè)表進(jìn)行的。若一個(gè)查詢同時(shí)涉及兩個(gè)以上的表,則稱之為連接查詢。連接查詢實(shí)際上是關(guān)系數(shù)據(jù)庫中最主要的查詢,主要包括等值連接查詢、非等值連接查詢、自身連接查詢

21、、外連接查詢和復(fù)合條件連接查詢。 例2-31 查詢每個(gè)學(xué)生及其選修課程的情況。 學(xué)生選課情況存放在選課表中,所以本查詢實(shí)際上同時(shí)涉及學(xué)生表和選課表兩個(gè)表中的數(shù)據(jù)。這兩個(gè)表之間的聯(lián)系是通過兩個(gè)表都具有的公共屬性學(xué)號(hào)實(shí)現(xiàn)的。要查詢學(xué)生及其選修課程的情況就必須將這兩個(gè)表中學(xué)號(hào)相同的元組連接起來。 這是一個(gè)等值連接。完成本查詢的SQL語句為: SELECT 學(xué)生.*,選課.* FROM 學(xué)生,選課 WHERE 學(xué)生.學(xué)號(hào)選課.學(xué)號(hào)3. 嵌套查詢 在SQL語言中,一個(gè)SELECTFROMWHERE語句稱為一個(gè)查詢塊。將一個(gè)查詢塊嵌套在另一個(gè)查詢塊的WHERE子句或HAVING短語的條件中的查詢稱為嵌套查

22、詢或子查詢。 在嵌套查詢中,上層的查詢塊又稱為外層查詢或父查詢或主查詢,下層查詢塊又稱為內(nèi)層查詢或子查詢。SQL語言允許多層嵌套查詢。即一個(gè)子查詢中還可以嵌套其它子查詢。 嵌套查詢使得可以用一系列簡(jiǎn)單查詢構(gòu)成復(fù)雜的查詢,從而明顯地增強(qiáng)了SQL的查詢能力。(1) 帶有IN謂詞的子查詢 帶有IN渭詞的子查詢是指父查詢與子查詢之間用IN進(jìn)行連接,判斷某個(gè)屬性列值是否在子查詢的結(jié)果中。由于在嵌套查詢中,子查詢的結(jié)果往往是一個(gè)集合,所以謂詞IN是嵌套查詢中最經(jīng)常使用的謂詞。例2-32 查詢選修了“數(shù)學(xué)”課的學(xué)生姓名。 學(xué)生名和課程名分別在“學(xué)生”和“課程”表中,因此不能通過簡(jiǎn)單的查詢一個(gè)表而得到結(jié)果。實(shí)

23、際上連接學(xué)生和課程的是“選課”表,因此這個(gè)查詢涉及到三個(gè)表:學(xué)生、課程、選課。查詢步驟如下: 在課程表中查詢“數(shù)學(xué)”課的課程號(hào)。 在選課表中找到選修了上一步得到的課程號(hào)的課程的學(xué)生學(xué)號(hào)。 在學(xué)生表中找到學(xué)號(hào)包含在上一步所得到的學(xué)號(hào)集合中的學(xué)生姓名。 SELECT 學(xué)號(hào),姓名 FROM 學(xué)生 WHERE 學(xué)號(hào) IN (SELECT 學(xué)號(hào) FROM 選課 WHERE 課程號(hào) IN (SELECT 課程號(hào) FROM 課程 WHERE 課程=數(shù)學(xué)) (2) 帶有比較運(yùn)算符的子查詢 帶有比較運(yùn)算符的子查詢是指父查詢與子查詢之間用比較運(yùn)算符進(jìn)行連接。當(dāng)用戶能確切知道內(nèi)層查詢返回的是單值時(shí),可以用、2或等比

24、較運(yùn)算符。例2-33 查詢與“劉剛”同一個(gè)系的學(xué)生。這個(gè)查詢分兩步: 首先在學(xué)生表找到“劉剛”所在的系。 然后在學(xué)生表中查詢所在系與上一不的查詢結(jié)果相等的學(xué)生名單。SELECT 姓名FROM 學(xué)生WHERE 所在系=(SELECT所在系 FROM 學(xué)生 WHERE 姓名=劉剛) 2.2.4 SQL數(shù)據(jù)操縱數(shù)據(jù)操縱 在對(duì)數(shù)據(jù)庫進(jìn)行操作時(shí),除了經(jīng)常查詢數(shù)據(jù)庫外,還要更新數(shù)據(jù)。SQL中數(shù)據(jù)更新包括插入數(shù)據(jù)(INSERT)、修改數(shù)據(jù)(UPDATE)和刪除數(shù)據(jù)(DELETE)三條語句。1. 插入語句(INSERT INTO )例2-34 將一個(gè)新學(xué)生記錄(學(xué)號(hào):95005;姓名:陳??;性別:男;所在系:

25、計(jì)算機(jī);年齡:18歲)插入學(xué)生表中。 INSERT INTO 學(xué)生 VALUES(95020,陳俊,男,18,計(jì)算機(jī)系); 2. 刪除語句 (DELETE )例2-35 刪除學(xué)號(hào)為95001的學(xué)生記錄。 DELETE FROM 學(xué)生 WHERE 學(xué)號(hào)=95001;3. 修改語句(UPDATE )例2-36 將學(xué)號(hào)為95001的學(xué)生年齡改為22歲。 UPDATE 學(xué)生 SET 年齡=22 WHERE 學(xué)號(hào)=95001 2.2.5 SQL數(shù)據(jù)控制數(shù)據(jù)控制 這里所討論的數(shù)據(jù)控制主要是指SQL語言的安全性控制功能,通過對(duì)數(shù)據(jù)庫用戶的使用權(quán)限加以限制而保證數(shù)據(jù)安全的重要措施。SQL語言的的數(shù)據(jù)控制語句包

26、括授權(quán)(Grant)、收權(quán)或刪除權(quán)限(Revoke)、拒絕訪問(Deny)三種,權(quán)限的設(shè)置對(duì)象可以是數(shù)據(jù)庫用戶或用戶組。1. 授權(quán) 例2-37 將查詢成績(jī)的權(quán)限授予所有人。 GRANT SELECT ON TABLE 成績(jī) TO PUBLIC2. 收權(quán)語句 數(shù)據(jù)庫管理員DBA、數(shù)據(jù)庫擁有者DBO或數(shù)據(jù)庫對(duì)象的擁有者DBOO可以通過REVOKE語句將其他用戶的數(shù)據(jù)操作權(quán)限收回。 例2-38 將用戶wp修改學(xué)生學(xué)號(hào)的權(quán)限收回。 REVOKE UPDATE(學(xué)號(hào)) ON 學(xué)生 FROM wp 2.3 關(guān)系數(shù)據(jù)理論關(guān)系數(shù)據(jù)理論 針對(duì)一個(gè)具體的問題,應(yīng)該如何構(gòu)造一個(gè)適合于它的數(shù)據(jù)模式。這是數(shù)據(jù)庫設(shè)計(jì)問題

27、,確切地講是數(shù)據(jù)庫邏輯設(shè)計(jì)問題。 關(guān)系模型有嚴(yán)格的數(shù)學(xué)理論基礎(chǔ),基于這種理論上的優(yōu)勢(shì),關(guān)系模型可以設(shè)計(jì)的更加科學(xué),關(guān)系數(shù)據(jù)庫中的問題可以更好地解決。關(guān)系數(shù)據(jù)庫規(guī)范化理論就是數(shù)據(jù)庫邏輯設(shè)計(jì)工具。關(guān)系數(shù)據(jù)庫的規(guī)范化理論就是解決如何設(shè)計(jì)出合理的關(guān)系數(shù)據(jù)庫模式,也就是一個(gè)數(shù)據(jù)庫中要定義哪些表,每個(gè)表有哪些屬性,表之間有哪些聯(lián)系,而盡量地減少數(shù)據(jù)冗余,消除插入、刪除等存在的問題。2.3.1 關(guān)系模式可能存在的問題關(guān)系模式可能存在的問題 例如,要設(shè)計(jì)一個(gè)教學(xué)管理數(shù)據(jù)庫,希望在該數(shù)據(jù)庫中保存學(xué)生的學(xué)號(hào)、姓名、性別、年齡、系名、系主任和該學(xué)生選修的課程及成績(jī)信息。若據(jù)此設(shè)計(jì)一個(gè)關(guān)系保存所有的數(shù)據(jù),關(guān)系模式為:

28、 教學(xué)(學(xué)號(hào),姓名,性別,年齡,系名,系主任,課程名,成績(jī)) 這個(gè)關(guān)系模式存在以下的問題: 數(shù)據(jù)冗余大 插入異常 刪除異常。 更新異常 由于上述的問題,它是一個(gè)不合理的設(shè)計(jì)。一個(gè)合理的設(shè)計(jì)應(yīng)該盡量減少以上的問題。只有找到問題存在的原因,才能找到解決辦法。那么出現(xiàn)上述問題的原因是什么呢?這是因?yàn)檫@個(gè)關(guān)系模式中的數(shù)據(jù)之間的依賴關(guān)系所造成的。如果把這個(gè)單一的關(guān)系模式,分解成如下三個(gè)關(guān)系模式: 學(xué)生(學(xué)號(hào),姓名,性別,年齡,所在系); 系(系名,系主任); 選課(學(xué)號(hào),課程名,成績(jī)) 2.3.2 函數(shù)依賴及規(guī)范化函數(shù)依賴及規(guī)范化 為了使數(shù)據(jù)庫模式的設(shè)計(jì)更合理,人們研究了規(guī)范化理論。而函數(shù)依賴?yán)碚撌顷P(guān)系

29、規(guī)范化的理論基礎(chǔ)。函數(shù)依賴反映了同一關(guān)系中屬性間一一對(duì)應(yīng)的約束。 1. 關(guān)系模式的簡(jiǎn)化表示法 一般把關(guān)系模式看做一個(gè)三元組: R(U,F(xiàn)) 其中,R是關(guān)系名,U是一組屬性,F(xiàn)是屬性組U上的一組數(shù)據(jù)依賴關(guān)系的集合。當(dāng)且僅當(dāng)U上的一個(gè)關(guān)系 r 滿足 F 時(shí),r稱為關(guān)系模式R(U,F(xiàn))的一個(gè)關(guān)系。 2. 函數(shù)依賴 函數(shù)依賴是數(shù)據(jù)依賴的一種,函數(shù)依賴反映了同一關(guān)系中屬性間的一一對(duì)應(yīng)約束。它是現(xiàn)實(shí)世界屬性間相互聯(lián)系的抽象,是數(shù)據(jù)內(nèi)在的性質(zhì),是語義的體現(xiàn)。它是數(shù)據(jù)庫規(guī)范化理論的基礎(chǔ)。 函數(shù)依賴普遍存在于現(xiàn)實(shí)生活中。例如在描述學(xué)生的關(guān)系中,可能的屬性有學(xué)號(hào),姓名,所在系等。由于一個(gè)學(xué)號(hào)只對(duì)應(yīng)于一個(gè)學(xué)生,一個(gè)

30、學(xué)生只能屬于一個(gè)系,因此學(xué)號(hào)確定之后,該學(xué)生的姓名和所在系也唯一的確定了。類似于自變量確定了,函數(shù)值也唯一確定了。起決定性的屬性相當(dāng)于自變量。函數(shù)依賴記為:學(xué)號(hào)姓名,學(xué)號(hào)所在系。 現(xiàn)在討論一個(gè)具體的關(guān)系模式。例如,要設(shè)計(jì)一個(gè)教學(xué)管理數(shù)據(jù)庫,希望該數(shù)據(jù)庫中包括的信息有學(xué)生學(xué)號(hào)、姓名、系名、系主任姓名,以及學(xué)生學(xué)習(xí)的課程和成績(jī)。于是得到一組屬性: U=學(xué)號(hào),姓名,系名,系主任,課程名,成績(jī) 根據(jù)經(jīng)驗(yàn)得知: 一個(gè)學(xué)號(hào)對(duì)應(yīng)一個(gè)學(xué)生,即一個(gè)學(xué)號(hào)對(duì)應(yīng)一個(gè)姓名,但可以有多個(gè)學(xué)生重名; 一個(gè)系有若干學(xué)生,但一個(gè)學(xué)生只屬于一個(gè)系; 一個(gè)系只有一名(正職)負(fù)責(zé)人; 一個(gè)學(xué)生可選修多門課程,每門課程有若干學(xué)生選修;

31、 學(xué)生學(xué)習(xí)每一門課程有一個(gè)成績(jī); 于是得到屬性組上的一組函數(shù)依賴: F=學(xué)號(hào)姓名,學(xué)號(hào)系名,系名系主任,(學(xué)號(hào),課程名)成績(jī) 定義:設(shè)R(U)是屬性集U上的關(guān)系模式。X,Y是U的子集。若對(duì)于R(U)的任意一個(gè)可能的關(guān)系r(一個(gè)滿足約束條件的數(shù)據(jù)組成的表),r中不可能存在兩個(gè)元組在X上的屬性值相等,而在Y上的屬性值不等,則稱X函數(shù)確定Y或Y函數(shù)依賴于X,記作XY。 定義:在R(U)中,,如果XY,YZ,且(Y X),Y X,則稱Z對(duì)X傳遞函數(shù)依賴。例如,在教學(xué)關(guān)系模式中,學(xué)號(hào)系名,系名系主任,所以系主任對(duì)學(xué)號(hào)傳遞依賴。 3. 范式 關(guān)系數(shù)據(jù)庫中的關(guān)系是要滿足一定要求的。滿足不同程度要求的為不同的

32、范式。范式是滿足一定函數(shù)依賴的關(guān)系模式的集合。有多種范式:第一范式、第二范式、第三范式、BCN范式等。滿足最低要求的叫第一范式,簡(jiǎn)稱1NF。在滿足第一范式的條件下,滿足進(jìn)一步條件的為第二范式,簡(jiǎn)稱2NF。其余依此類推。顯然各種范式之間存在關(guān)系: 1NF2NF 3NF BCNF 4NF 5NF 一個(gè)低一級(jí)的范式模式,通過模式分解可以轉(zhuǎn)換為若干個(gè)高一級(jí)范式的模式集合,這個(gè)過程叫規(guī)范化。 (1) 第一范式(1NF) 定義:如果一個(gè)關(guān)系模式R的所有屬性都是簡(jiǎn)單屬性,即每個(gè)屬性都是不可再分的基本數(shù)據(jù)項(xiàng),則稱R屬于第一范式,記作 R 1NF。 例如,教學(xué)模式中的所有屬性都是不可再分的簡(jiǎn)單屬性,即: 教學(xué)(

33、學(xué)號(hào),姓名,系名,系主任,課程名,成績(jī)) 1NF (2 ) 第二范式(2NF) 定義:若一個(gè)關(guān)系模式RlNF,且每一個(gè)非主屬性完全函數(shù)依賴于關(guān)鍵字,則R2NF。 將教學(xué)模式分為以下兩個(gè)模式: 學(xué)生_系(學(xué)號(hào),姓名,系,系主任); 選課(學(xué)號(hào),課程名,成績(jī)) 在“學(xué)生_系”關(guān)系中,“學(xué)號(hào)”是關(guān)鍵字,其它非主屬性都完全依賴于關(guān)鍵字,“選課”關(guān)系中,(學(xué)號(hào),課程名)是關(guān)鍵字,非主屬性也完全依賴于關(guān)鍵字,因此兩個(gè)關(guān)系中非主屬都完全函數(shù)依賴于關(guān)鍵字,服從2NF,即: 學(xué)生_系2NF,選課2NF。 (3 ) 第三范式(3NF) 定義:若關(guān)系模式R是第二范式,且沒有一個(gè)非主屬性傳遞函數(shù)依賴關(guān)鍵字,則R3NF。R3NF,則非主屬性對(duì)主屬性既不部分函數(shù)依賴于關(guān)鍵字,也不傳遞函數(shù)依賴于關(guān)鍵字。 考察“學(xué)生_系”關(guān)系,可以看出:學(xué)號(hào)系名,系名系主任,即“系主任”傳遞依賴于“學(xué)號(hào)”。“學(xué)號(hào)”是關(guān)鍵字,而“系主任”是非主屬性,它們

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(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)論