- SQL查詢的藝術(shù)
- 張權(quán) 郭天嬌
- 99字
- 2019-01-02 08:08:06
第1章 數(shù)據(jù)庫與SQL基礎(chǔ)
目前應(yīng)用最廣泛的數(shù)據(jù)庫系統(tǒng)是關(guān)系數(shù)據(jù)庫系統(tǒng),如SQL Server、Oracle、DB2等。關(guān)系數(shù)據(jù)庫系統(tǒng)是通過SQL對數(shù)據(jù)庫進(jìn)行查詢和更新的。本章主要介紹一些有關(guān)數(shù)據(jù)庫和SQL的基礎(chǔ)知識,為后面章節(jié)的學(xué)習(xí)打下基礎(chǔ)。
1.1 數(shù)據(jù)庫的基本概念
“數(shù)據(jù)庫”一詞起源于20世紀(jì)50年代,當(dāng)時美國為了戰(zhàn)爭的需要,把各種情報收集在一起,存儲在計(jì)算機(jī)里,稱為Data Base(簡稱為DB)。
數(shù)據(jù)庫的出現(xiàn),使得計(jì)算機(jī)應(yīng)用滲透到各個領(lǐng)域及各行各業(yè),事務(wù)處理系統(tǒng)、管理信息系統(tǒng)、辦公自動化系統(tǒng)、決策支持系統(tǒng)等都是使用了數(shù)據(jù)庫技術(shù)的計(jì)算機(jī)應(yīng)用系統(tǒng)。可以這樣說,數(shù)據(jù)庫系統(tǒng)是計(jì)算機(jī)信息系統(tǒng)的基礎(chǔ)和主要組成部分。
1.1.1 數(shù)據(jù)庫的由來
數(shù)據(jù)庫主要用于數(shù)據(jù)處理。數(shù)據(jù)處理是對各種形式的數(shù)據(jù)進(jìn)行收集、存儲、加工和傳播的一系列活動的集合。在使用計(jì)算機(jī)之后,數(shù)據(jù)處理速度及規(guī)模都有了巨大提高。隨著數(shù)據(jù)處理量的不斷增加,數(shù)據(jù)管理技術(shù)應(yīng)運(yùn)而生,其演變過程隨著計(jì)算機(jī)硬件和軟件的發(fā)展,大體經(jīng)歷了以下3個階段。
1.人工管理階段
20世紀(jì)50年代中期之前,計(jì)算機(jī)的軟硬件均不完善。由于這個階段還沒有軟件系統(tǒng)對數(shù)據(jù)進(jìn)行管理,程序員在程序中不僅要規(guī)定數(shù)據(jù)的邏輯結(jié)構(gòu),還要設(shè)計(jì)其物理結(jié)構(gòu),包括存儲結(jié)構(gòu)、存取方法、輸入/輸出方式等。當(dāng)數(shù)據(jù)的物理組織或存儲設(shè)備改變時,用戶程序就必須重新編寫。不同的計(jì)算機(jī)程序之間不能共享數(shù)據(jù),導(dǎo)致不同的應(yīng)用之間存在大量的重復(fù)數(shù)據(jù),很難保證應(yīng)用程序之間數(shù)據(jù)的一致性。人工管理階段程序與數(shù)據(jù)的關(guān)系如圖1-1所示。

圖1-1 人工管理階段程序與數(shù)據(jù)的關(guān)系
2.文件系統(tǒng)階段
20世紀(jì)50年代中期至60年代中期,操作系統(tǒng)的出現(xiàn)標(biāo)志著數(shù)據(jù)管理進(jìn)入了一個新階段。數(shù)據(jù)以文件為單位,與計(jì)算機(jī)程序脫離,由操作系統(tǒng)統(tǒng)一管理。用戶的程序與數(shù)據(jù)可分別存放在外存儲器上,各個應(yīng)用程序可以共享一組數(shù)據(jù),實(shí)現(xiàn)了以文件為單位的共享。
但是,因?yàn)閿?shù)據(jù)的組織仍然是面向程序的,所以存在大量的數(shù)據(jù)冗余,并且數(shù)據(jù)的邏輯結(jié)構(gòu)不能方便地修改和擴(kuò)充;同時,文件之間是相互孤立的,不能反映現(xiàn)實(shí)世界中事務(wù)之間的聯(lián)系。文件系統(tǒng)階段程序與數(shù)據(jù)的關(guān)系如圖1-2所示。

圖1-2 文件系統(tǒng)階段程序與數(shù)據(jù)的關(guān)系
3.數(shù)據(jù)庫系統(tǒng)階段
20世紀(jì)60年代以后,隨著計(jì)算機(jī)在數(shù)據(jù)管理領(lǐng)域的普遍應(yīng)用,用戶對數(shù)據(jù)管理技術(shù)提出了更高的要求,包括希望減少數(shù)據(jù)的冗余,提供更高的共享能力;要求程序和數(shù)據(jù)具有較高的獨(dú)立性,當(dāng)數(shù)據(jù)的邏輯結(jié)構(gòu)改變時,不涉及數(shù)據(jù)的物理結(jié)構(gòu),也不影響應(yīng)用程序,以降低應(yīng)用程序研制與維護(hù)費(fèi)用。數(shù)據(jù)庫技術(shù)正是在這樣一個需求的基礎(chǔ)上發(fā)展起來的,它具有如下特點(diǎn)。
? 以數(shù)據(jù)為中心,通過組織數(shù)據(jù)形成綜合性的數(shù)據(jù)庫,為各應(yīng)用共享。
?數(shù)據(jù)冗余小,易修改、易擴(kuò)充。不同的應(yīng)用程序根據(jù)自己的需求,從數(shù)據(jù)庫中獲取需要的數(shù)據(jù),減少了數(shù)據(jù)的重復(fù)存儲,同時也便于增加新的數(shù)據(jù)結(jié)構(gòu)。
? 采用一定的數(shù)據(jù)模型。數(shù)據(jù)模型不僅描述數(shù)據(jù)本身的特點(diǎn),而且描述了數(shù)據(jù)之間的聯(lián)系。
?程序和數(shù)據(jù)具有較高的獨(dú)立性。數(shù)據(jù)庫系統(tǒng)通過映像使數(shù)據(jù)的物理結(jié)構(gòu)獨(dú)立于全局邏輯結(jié)構(gòu),也使全局邏輯結(jié)構(gòu)獨(dú)立于應(yīng)用程序。
? 具有良好的用戶接口,用戶可以方便地開發(fā)和使用數(shù)據(jù)庫。
? 對數(shù)據(jù)進(jìn)行統(tǒng)一管理和控制,保證了數(shù)據(jù)的安全性、完整性。
在數(shù)據(jù)庫系統(tǒng)階段,程序與數(shù)據(jù)的關(guān)系如圖1-3所示。

圖1-3 數(shù)據(jù)庫系統(tǒng)階段程序與數(shù)據(jù)的關(guān)系
1.1.2 數(shù)據(jù)庫系統(tǒng)的概念
實(shí)際上,數(shù)據(jù)庫只不過是一些信息的聚集。通常意義下,“數(shù)據(jù)庫”這個術(shù)語是指由數(shù)據(jù)庫管理系統(tǒng)(DataBase Management System,簡稱DBMS)管理的數(shù)據(jù)集。一個數(shù)據(jù)庫系統(tǒng)應(yīng)該具有以下4種特性。
(1)允許使用數(shù)據(jù)定義語言(Data Definition Language),建立新的數(shù)據(jù)庫,指定它們的模式(schema)。
(2)能夠查詢數(shù)據(jù)和更新數(shù)據(jù),所使用的語言通常稱為“查詢語言”或“數(shù)據(jù)操作語言”。
(3)支持存儲大量的數(shù)據(jù),并且經(jīng)過很長一段時間以后仍保證安全,使其免遭意外或非授權(quán)的使用,同時允許對數(shù)據(jù)庫查詢和更新的有效訪問。
(4)控制多用戶的同時訪問,使一個用戶的訪問不影響其他用戶,保證同時訪問不會損壞數(shù)據(jù)。
1.2 數(shù)據(jù)庫系統(tǒng)的結(jié)構(gòu)、組成及工作流程
前面我們介紹了數(shù)據(jù)庫系統(tǒng)的基本概念,本節(jié)將介紹數(shù)據(jù)庫系統(tǒng)的體系結(jié)構(gòu)、數(shù)據(jù)庫系統(tǒng)的組成以及工作流程。
1.2.1 數(shù)據(jù)庫的體系結(jié)構(gòu)
數(shù)據(jù)庫體系結(jié)構(gòu)是數(shù)據(jù)庫的一個總的框架。盡管實(shí)際的數(shù)據(jù)庫系統(tǒng)軟件產(chǎn)品多種多樣、支持不同的數(shù)據(jù)模型、使用不同的數(shù)據(jù)庫語言、建立在不同的操作系統(tǒng)之上,但絕大多數(shù)數(shù)據(jù)庫系統(tǒng)在總的體系結(jié)構(gòu)上,都具有三級模式的結(jié)構(gòu)特性。
從另一個角度來講,同一意義下的數(shù)據(jù)(如學(xué)生記錄),從計(jì)算機(jī)中處理的二進(jìn)制表示到用戶處理的學(xué)生姓名等概念的數(shù)據(jù)之間,存在著許多層次的抽象和轉(zhuǎn)換。數(shù)據(jù)庫管理系統(tǒng)(DBMS)就是通過這三級模式來實(shí)現(xiàn)上述的轉(zhuǎn)換。
數(shù)據(jù)庫體系結(jié)構(gòu)的三級模式為:外模式、概念模式和內(nèi)模式,如圖1-4所示。

圖1-4 數(shù)據(jù)庫系統(tǒng)的三級模式
1.內(nèi)模式
內(nèi)模式又稱存儲模式,是對數(shù)據(jù)的物理結(jié)構(gòu)和存儲方式的描述。例如,數(shù)據(jù)記錄如何存儲,是順序存儲還是按照索引存儲,索引以什么方式組織等。內(nèi)模式是由數(shù)據(jù)庫系統(tǒng)提供的數(shù)據(jù)定義語言定義的。
2.概念模式
概念模式又叫作數(shù)據(jù)庫模式(簡稱模式),是數(shù)據(jù)庫中全部數(shù)據(jù)的邏輯結(jié)構(gòu)的描述。概念模式以某種數(shù)據(jù)模型為基礎(chǔ),并用模式定義語言定義這些內(nèi)容,它可以看作是現(xiàn)實(shí)世界中的實(shí)體在具體數(shù)據(jù)庫系統(tǒng)中的實(shí)現(xiàn)。概念模式與具體的應(yīng)用程序無關(guān),同時也不涉及數(shù)據(jù)的存儲細(xì)節(jié)和硬件環(huán)境。
3.外模式
外模式又稱為用戶模式或子模式,通常由概念模式導(dǎo)出,是概念模式的子集,其主要功能是定義允許用戶操作的數(shù)據(jù)。我們可以將外模式理解為用戶看到的數(shù)據(jù)視圖,即與某一應(yīng)用有關(guān)的數(shù)據(jù)的邏輯表示。不同用戶的需求不同,使用的數(shù)據(jù)內(nèi)容不同,對數(shù)據(jù)的保密要求不同,因此不同數(shù)據(jù)的外模式是不同的。
4.內(nèi)模式/概念模式映像
內(nèi)模式到概念模式之間的映像保證了數(shù)據(jù)的物理獨(dú)立性。當(dāng)數(shù)據(jù)的物理結(jié)構(gòu)發(fā)生變化時,如對數(shù)據(jù)增加索引、改變數(shù)據(jù)的存儲位置、改變存儲設(shè)備等,不影響數(shù)據(jù)的邏輯結(jié)構(gòu)。當(dāng)數(shù)據(jù)庫管理員根據(jù)應(yīng)用程序?qū)?shù)據(jù)的存取要求對數(shù)據(jù)的物理組織進(jìn)行優(yōu)化后,并不需要對概念模式和外模式進(jìn)行重新定義,也不需要修改應(yīng)用程序。
5.概念模式/外模式映像
概念模式到外模式之間的映像保證了數(shù)據(jù)的邏輯獨(dú)立性。當(dāng)數(shù)據(jù)的整體邏輯結(jié)構(gòu)發(fā)生變化時,如在概念模式中增加新的數(shù)據(jù)類型、在原有的記錄類型間增加新的聯(lián)系等,可以通過修改概念模式到外模式之間的映像而外模式不受影響。
數(shù)據(jù)庫的這種多層次的體系結(jié)構(gòu),保證了高度的數(shù)據(jù)獨(dú)立性,其中數(shù)據(jù)庫的全局邏輯描述是獨(dú)立于其他所有結(jié)構(gòu)的。在定義數(shù)據(jù)庫結(jié)構(gòu)時,我們應(yīng)首先定義概念模式。內(nèi)模式是將概念模式中定義的數(shù)據(jù)進(jìn)行適當(dāng)?shù)亟M織并加以存儲,達(dá)到較好的運(yùn)行效率。
1.2.2 數(shù)據(jù)庫系統(tǒng)的組成
一個完整的數(shù)據(jù)庫系統(tǒng)由數(shù)據(jù)庫、數(shù)據(jù)庫管理系統(tǒng)、軟件支持系統(tǒng)、硬件系統(tǒng)和數(shù)據(jù)庫管理員及相關(guān)人員5部分組成。
1.數(shù)據(jù)庫
這里所說的數(shù)據(jù)庫指的是物理數(shù)據(jù)庫,是按照一定的數(shù)據(jù)模型組織并存放在外存儲設(shè)備上的數(shù)據(jù)集合。例如,在學(xué)生選課信息管理系統(tǒng)中,應(yīng)用程序獲取的數(shù)據(jù)來自選課管理數(shù)據(jù)庫,這個數(shù)據(jù)庫中可能存放著學(xué)生信息、課程信息、教師信息等。
除了用戶直接使用的數(shù)據(jù)外,還有另一類數(shù)據(jù),它們是有關(guān)數(shù)據(jù)庫的定義信息,如用戶表及權(quán)限、數(shù)據(jù)庫表的定義等。這些信息通常存放在數(shù)據(jù)字典中,用戶一般不能改動數(shù)據(jù)字典的內(nèi)容。
2.數(shù)據(jù)庫管理系統(tǒng)—DBMS(DataBase Management System)
數(shù)據(jù)庫管理系統(tǒng)是對數(shù)據(jù)進(jìn)行管理的軟件系統(tǒng),是數(shù)據(jù)庫系統(tǒng)的核心軟件。數(shù)據(jù)庫系統(tǒng)的一切操作,如創(chuàng)建表、視圖、索引,向表中插入數(shù)據(jù),對數(shù)據(jù)進(jìn)行檢索、修改、刪除等,都是通過數(shù)據(jù)庫管理系統(tǒng)實(shí)現(xiàn)的。
一般而言,數(shù)據(jù)庫管理系統(tǒng)主要提供了數(shù)據(jù)定義、數(shù)據(jù)存儲、數(shù)據(jù)庫管理等功能。
3.軟件支持系統(tǒng)
數(shù)據(jù)庫系統(tǒng)的軟件除了DBMS之外,還需要一個軟件支撐環(huán)境,包括操作系統(tǒng)、應(yīng)用系統(tǒng)開發(fā)工具、各種宿主語言以及實(shí)用程序等。
4.硬件支持系統(tǒng)
硬件支持系統(tǒng)主要是指計(jì)算機(jī)。對于分布式數(shù)據(jù)庫而言,計(jì)算機(jī)網(wǎng)絡(luò)也是基礎(chǔ)環(huán)境。
5.數(shù)據(jù)庫管理員及相關(guān)人員
數(shù)據(jù)庫有關(guān)人員主要包括數(shù)據(jù)管理員(DBA)、系統(tǒng)分析員、應(yīng)用程序員和普通用戶。數(shù)據(jù)庫系統(tǒng)中,不同人員可操控不同級別的數(shù)據(jù),如圖1-5所示。

圖1-5 數(shù)據(jù)庫人員可操控的抽象數(shù)據(jù)
1.2.3 數(shù)據(jù)庫的工作流程
數(shù)據(jù)庫系統(tǒng)的層次結(jié)構(gòu)如圖1-6所示。

圖1-6 數(shù)據(jù)庫系統(tǒng)層次結(jié)構(gòu)圖
下面我們以用戶查詢數(shù)據(jù)庫中的一組數(shù)據(jù)為例,說明數(shù)據(jù)庫系統(tǒng)的工作流程。數(shù)據(jù)庫的工作流程圖如圖1-7所示。

圖1-7 數(shù)據(jù)庫工作流程圖
(1)DBMS首先對數(shù)據(jù)查詢語句進(jìn)行語法檢查,然后從數(shù)據(jù)字典中找到該用戶對應(yīng)的外模式,同時進(jìn)行權(quán)限檢查;若發(fā)現(xiàn)錯誤,則將錯誤信息返回給用戶。
(2)DBMS根據(jù)找到的外模式,利用概念模式/外模式映像,將其映像到概念模式,確定概念模式應(yīng)該讀入哪些數(shù)據(jù)。
(3)DBMS利用內(nèi)模式/概念模式映像,將概念模式映像到內(nèi)模式,確定數(shù)據(jù)庫應(yīng)讀入哪些物理記錄及其具體的地址。
(4)DBMS根據(jù)地址信息向操作系統(tǒng)發(fā)出讀取記錄的命令。
(5)操作系統(tǒng)執(zhí)行讀取數(shù)據(jù)的命令,并將數(shù)據(jù)從硬盤讀入系統(tǒng)緩沖區(qū),將執(zhí)行結(jié)果通知DBMS。
(6)DBMS根據(jù)查詢語句及數(shù)據(jù)字典定義的信息,將系統(tǒng)緩沖區(qū)中的數(shù)據(jù)轉(zhuǎn)換成用戶所需的記錄格式。
(7)DBMS將數(shù)據(jù)記錄從系統(tǒng)緩沖區(qū)傳送到用戶工作區(qū)。
由此可見,在數(shù)據(jù)庫系統(tǒng)中,數(shù)據(jù)庫管理系統(tǒng),即DBMS處于中心地位。
注意
DBMS并不是直接讀取數(shù)據(jù)庫中的數(shù)據(jù),而是通過操作系統(tǒng)訪問數(shù)據(jù)庫,數(shù)據(jù)庫系統(tǒng)是基于操作系統(tǒng)的。
1.3 關(guān)系數(shù)據(jù)庫
目前廣泛使用的數(shù)據(jù)庫軟件都是基于關(guān)系模型的關(guān)系數(shù)據(jù)庫管理系統(tǒng)。關(guān)系模型是現(xiàn)代數(shù)據(jù)庫產(chǎn)品最廣泛實(shí)現(xiàn)的模型,正是關(guān)系模型構(gòu)成了SQL的基礎(chǔ)。采用關(guān)系模型的數(shù)據(jù)庫稱為關(guān)系數(shù)據(jù)庫,而關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMS)就是管理關(guān)系數(shù)據(jù)庫的計(jì)算機(jī)軟件。
1.3.1 關(guān)系模型
關(guān)系模型把世界看作是由實(shí)體(Entity)和聯(lián)系(Relationship)構(gòu)成的。所謂實(shí)體就是指現(xiàn)實(shí)世界中具有區(qū)分于其他事物的特征或?qū)傩裕峙c其他實(shí)體有聯(lián)系的對象。在關(guān)系模型中,實(shí)體通常是以表的形式來表現(xiàn)的。表的每一行描述實(shí)體的一個實(shí)例,表的每一列描述實(shí)體的一個特征或?qū)傩浴?/p>
關(guān)系是關(guān)系模型的核心,是匯集在表結(jié)構(gòu)中的行和列的集合。每個關(guān)系由一個或多個屬性(列)組成,屬性將類型相似的數(shù)據(jù)歸納在一起。屬性與關(guān)系直接的關(guān)聯(lián)如圖1-8所示。

圖1-8 屬性與關(guān)系
圖1-8所示的關(guān)系是由NO、NAME、SEX、DEPARTMENT 4個屬性組成的。數(shù)據(jù)以數(shù)組(行)的方式存儲在關(guān)系中,每個數(shù)組代表相關(guān)數(shù)據(jù)的一個記錄。
說明
關(guān)系、屬性和數(shù)組這3個術(shù)語在涉及到關(guān)系模型時使用,SQL在描述這些術(shù)語時使用的是表、列和行。
所謂聯(lián)系就是指實(shí)體之間的關(guān)系,即實(shí)體之間的對應(yīng)關(guān)系。聯(lián)系可以分為以下3種。
? 一對一的聯(lián)系:第一個關(guān)系中的某個數(shù)組只能與第二個關(guān)系中的一個數(shù)組有關(guān);同樣,第二個關(guān)系中的某個數(shù)組只能與第一個關(guān)系中的一個數(shù)組有關(guān)。例如,NO關(guān)系和NAME關(guān)系之間是一對一的聯(lián)系,對應(yīng)于第一個關(guān)系列出的每個學(xué)號,第二個關(guān)系只能列出一個姓名,反之亦然。
? 一對多的聯(lián)系:第一個關(guān)系中的某個數(shù)組可以與第二個關(guān)系中的一個或多個數(shù)組有關(guān),但是第二個關(guān)系中的某個數(shù)組只能與第一個關(guān)系中的一個數(shù)組有關(guān)。例如,SEX關(guān)系和NO關(guān)系就是一對多的聯(lián)系,反之,NO關(guān)系和SEX關(guān)系就是多對一的聯(lián)系。
? 多對多的聯(lián)系:在這種聯(lián)系中,第一個關(guān)系中的某個數(shù)組可以與第二個關(guān)系中的一個或者多個數(shù)組有關(guān),并且第二個關(guān)系中的某個數(shù)組也可以與第一個關(guān)系中的一個或者多個數(shù)組有關(guān)。例如,SEX關(guān)系和DEPARTMENT關(guān)系就是多對多的聯(lián)系。
注意
多對多的聯(lián)系在物理上實(shí)現(xiàn)時,必須在第一個關(guān)系和第二個關(guān)系之間添加第三個關(guān)系,以創(chuàng)建兩個一對多的聯(lián)系。如在圖1-8中,SEX關(guān)系和DEPARTMENT關(guān)系通過NO關(guān)系就形成了兩個一對多的聯(lián)系。
1.3.2 Codd十二法則
關(guān)系數(shù)據(jù)庫是由E.F.Codd博士于1970年在一篇名為“一種存儲大型共享數(shù)據(jù)的關(guān)系模型”的論文中提出的。一個完美的、完全符合數(shù)據(jù)庫技術(shù)的關(guān)系數(shù)據(jù)庫系統(tǒng),需要滿足Codd博士提出的十二條法則。
? 信息法則:關(guān)系型數(shù)據(jù)庫的所有信息都被清楚地表示成表中的數(shù)據(jù),即表行中的列值。
? 授權(quán)存儲法則:保證關(guān)系數(shù)據(jù)庫中的每一個數(shù)據(jù)項(xiàng),都可以通過“表名+主鍵+列名”的組合來訪問。
? NULL值的系統(tǒng)處理:DBMS對NULL值(未知或不可使用的數(shù)據(jù))應(yīng)提供系統(tǒng)支持。NULL值并不是零,也不是空白的字符串。
? 一個活躍的、在線數(shù)據(jù)字典應(yīng)作為關(guān)系型表來儲存:在邏輯上,數(shù)據(jù)庫的描述及其內(nèi)容都被表示為表的形式,并能用數(shù)據(jù)庫語言進(jìn)行查詢。
? 必須提供數(shù)據(jù)存取語言進(jìn)行存取訪問:至少有一種具有嚴(yán)格、統(tǒng)一語法的語言,該語言必須支持?jǐn)?shù)據(jù)定義、視圖定義、數(shù)據(jù)操作、安全性、完整性約束規(guī)則、授權(quán)和事務(wù)處理。
? 視圖更新法則:所有理論上能被更新的視圖應(yīng)當(dāng)是可被系統(tǒng)更新的。
? 集合級的插入、更新和刪除:DBMS不僅支持集合級上的檢索,還應(yīng)支持集合級的插入、更新和刪除操作。
? 數(shù)據(jù)的物理獨(dú)立性:應(yīng)用不依賴于物理結(jié)構(gòu),當(dāng)數(shù)據(jù)的存儲結(jié)構(gòu)或者物理存取方法改變時,應(yīng)用程序在邏輯上應(yīng)不受影響。
? 數(shù)據(jù)的邏輯獨(dú)立性:如果一個表被分成兩個部分,則可應(yīng)用視圖連接在一起,以便不會對應(yīng)用產(chǎn)生影響。
? 數(shù)據(jù)完整性的獨(dú)立性:數(shù)據(jù)庫語言必須能夠定義完整性規(guī)則,這些完整性規(guī)則應(yīng)該儲存在數(shù)據(jù)字典中。
? 分布獨(dú)立性:一個數(shù)據(jù)庫即使被分布,也應(yīng)該能工作。
? 非破壞性原則:如果允許采用低級語言存取數(shù)據(jù),則該低級語言一定不能繞過用數(shù)據(jù)庫語言定義的安全性和完整性原則。
說明
雖然沒有一個商業(yè)上可用的數(shù)據(jù)庫完全遵循Codd的所有12條法則,但是Codd規(guī)則從歷史的角度來看是重要的,這些規(guī)則有助于判斷一個DBMS是否基于關(guān)系模型。
1.3.3 范式
構(gòu)造數(shù)據(jù)庫必須遵循一定的規(guī)則,在關(guān)系數(shù)據(jù)庫中,這種規(guī)則就是范式。范式是符合某一種級別的關(guān)系模式的集合。關(guān)系數(shù)據(jù)庫中的關(guān)系必須滿足一定的要求,即滿足不同的范式。目前關(guān)系數(shù)據(jù)庫有6種范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。滿足最低要求的范式是第一范式(1NF)。在第一范式的基礎(chǔ)上進(jìn)一步滿足更多要求的稱為第二范式(2NF),其余范式以此類推。一般說來,數(shù)據(jù)庫只需滿足第三范式(3NF)就可以了。下面舉例介紹第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。
1.第一范式(1NF)
在任何關(guān)系數(shù)據(jù)庫中,第一范式(1NF)是對關(guān)系模式的基本要求,不滿足第一范式(1NF)的數(shù)據(jù)庫就不是關(guān)系數(shù)據(jù)庫。第一范式主要包括以下指導(dǎo)原則。
? 數(shù)據(jù)庫表的每一列都是不可分割的基本數(shù)據(jù)項(xiàng),同一列中不能有多個值,即實(shí)體中的某個屬性不能有多個值或重復(fù)的屬性。如果出現(xiàn)重復(fù)的屬性,數(shù)據(jù)庫就可能需要定義一個新的實(shí)體,新的實(shí)體由重復(fù)的屬性構(gòu)成,新實(shí)體與原實(shí)體之間為一對多關(guān)系。
? 表的每一行只包含一個實(shí)例的信息。
例如圖1-9所示的員工信息表,不能將員工信息都放在一列中顯示,也不能將其中的兩列或多列在一列中顯示;員工信息表的每一行只表示一個員工的信息,一個員工的信息在表中只出現(xiàn)一次。簡而言之,第一范式就是無重復(fù)的列。

圖1-9 員工信息表
2.第二范式(2NF)
第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。
第二范式(2NF)要求數(shù)據(jù)庫表中的每個實(shí)例或行必須是唯一的。為實(shí)現(xiàn)區(qū)分,我們通常需要為表加上一個列,以存儲各個實(shí)例的唯一標(biāo)識。如員工信息表中加上了員工編號EMP_ID列,每個員工的編號是唯一的,因此每個員工可以被唯一區(qū)分。這個唯一屬性列被稱為主關(guān)鍵字或主鍵、主碼。
第二范式(2NF)要求實(shí)體的屬性完全依賴于主關(guān)鍵字。所謂完全依賴是指不能存在僅依賴主關(guān)鍵字一部分的屬性。如果存在,那么這個屬性和主關(guān)鍵字的這一部分應(yīng)該分離出來形成一個新的實(shí)體,新實(shí)體與原實(shí)體之間是一對多的關(guān)系。為實(shí)現(xiàn)區(qū)分,我們通常需要為表加上一個列,以存儲各個實(shí)例的唯一標(biāo)識。簡而言之,第二范式就是非主屬性非部分依賴于主關(guān)鍵字。
3.第三范式(3NF)
滿足第三范式(3NF)必須先滿足第二范式(2NF)。簡而言之,第三范式(3NF)要求一個數(shù)據(jù)庫表中不包含已在其他表中包含的非主關(guān)鍵字信息。例如一個部門信息表,其中每個部門有部門編號DEPT_ID、部門名稱、部門簡介等信息。那么我們在員工信息表中列出部門編號DEPT_ID后,就不能再將部門名稱、部門簡介等與部門有關(guān)的信息加入員工信息表中。如果不存在部門信息表,則根據(jù)第三范式(3NF)也應(yīng)該構(gòu)建它,否則就會有大量的數(shù)據(jù)冗余。
1.4 SQL語言基礎(chǔ)
SQL全稱是“結(jié)構(gòu)化查詢語言(Structured Query Language)”,最早是IBM公司的圣約瑟研究實(shí)驗(yàn)室為其關(guān)系數(shù)據(jù)庫管理系統(tǒng)SYSTEMR開發(fā)的一種查詢語言。它的前身是SQUARE語言。
SQL語言結(jié)構(gòu)簡潔,功能強(qiáng)大,簡單易學(xué),因此自從IBM公司1981年推出以來,SQL語言得到了廣泛的應(yīng)用。如今無論是Oracle、SQL Server這些大型的數(shù)據(jù)庫管理系統(tǒng),還是Access這些常用的數(shù)據(jù)庫開發(fā)系統(tǒng),都支持SQL語言作為查詢語言。
1.4.1 SQL的歷史
在20世紀(jì)70年代初,E.E.Codd博士首先提出了關(guān)系模型。70年代中期,IBM公司在研制SYSTEM R關(guān)系數(shù)據(jù)庫管理系統(tǒng)中研制了SQL語言,最早的SQL語言(SEQUEL2)是在1976年11月的IBM Journal of R&D上公布的。
1979年,Oracle公司首先提供商用的SQL,IBM公司在DB2和SQL/DS數(shù)據(jù)庫系統(tǒng)中也實(shí)現(xiàn)了SQL。
1986年10月,美國ANSI采用SQL作為關(guān)系數(shù)據(jù)庫管理系統(tǒng)的標(biāo)準(zhǔn)語言(ANSI X3.135-1986),后來被國際標(biāo)準(zhǔn)化組織(ISO)采納為國際標(biāo)準(zhǔn)。
1989年,美國ANSI采納在ANSI X3.135-1989報告中定義的關(guān)系數(shù)據(jù)庫管理系統(tǒng)的SQL標(biāo)準(zhǔn)語言,稱為ANSI SQL 89,替代了ANSI X3.135-1986版本。該標(biāo)準(zhǔn)為下列組織所采納。
? 國際標(biāo)準(zhǔn)化組織(ISO),為ISO 9075-1989報告——“Database Language SQL With Integrity Enhancement”。
? 美國聯(lián)邦政府,發(fā)布在The Federal Information Processing Standard Publication(FIPS PUB)127。
1992年,SQL又出現(xiàn)了新版本SQL-92,或簡稱SQL2。SQL-92代表了SQL的主要版本,擴(kuò)展并改進(jìn)了早期版本的功能特性。7年之后,即1999年,SQL標(biāo)準(zhǔn)的最新版本SQL:1999發(fā)布,對SQL-92版本又新增了一些特性,標(biāo)志著SQL在滿足用戶需求方面又前進(jìn)了一大步。
說明
各數(shù)據(jù)庫廠家都對SQL語言作了不同擴(kuò)充,但都支持SQL語言的標(biāo)準(zhǔn)。本書主要針對主流的SQL-92版本進(jìn)行講解,對SQL:1999的一些新增特性也作了一些介紹。
1.4.2 SQL語言的組成
SQL可以創(chuàng)建、維護(hù)、保護(hù)數(shù)據(jù)庫對象,并且可以操作對象中的數(shù)據(jù),因此SQL被認(rèn)為是一種完整的語言。依據(jù)SQL語言的執(zhí)行功能,可以將SQL分為以下幾部分。
? 數(shù)據(jù)定義語言(DDL,Data Definition Language):主要用于創(chuàng)建、修改或刪除數(shù)據(jù)庫對象,如表、視圖、模式、觸發(fā)器和存儲過程等,與其相關(guān)的主要SQL關(guān)鍵字包括CREAT、ALTER和DROP。
? 數(shù)據(jù)查詢語言(DQL,Data Query Language):主要用于數(shù)據(jù)的檢索查詢,與其相關(guān)的主要SQL關(guān)鍵字為SELECT。
? 數(shù)據(jù)操縱語言(DML,Data Manipulation Language):主要用于添加、修改或刪除存儲在數(shù)據(jù)庫對象中的數(shù)據(jù),與其相關(guān)的主要SQL關(guān)鍵字包括INSERT、UNPDATE和DELECT。
? 數(shù)據(jù)控制語言(DCL,Data Control Language):可以控制訪問數(shù)據(jù)庫中特定對象的用戶,還可以控制用戶對數(shù)據(jù)庫的訪問類型,與其相關(guān)的主要SQL關(guān)鍵字包括GRANT、DENY和REVOKE。
? 其他語言要素(Additional Language Elements):SQL除了包括上述4種功能語言外,還包括如事務(wù)控制、程序化語言等其他語言要素。
SQL語句數(shù)目種類較多,其主體大約由40條語句組成,如表1-1所示。
表1-1 主要的SQL語句

1.4.3 SQL語句的結(jié)構(gòu)
所有的SQL語句均有自己的格式,如圖1-10所示。

圖1-10 SQL語句結(jié)構(gòu)
每條SQL語句均由一個謂詞開始,該謂詞描述這條語句要產(chǎn)生的動作,如SELECT關(guān)鍵字。謂詞后緊接著一個或多個子句(Clause),子句中給出了被謂詞作用的數(shù)據(jù)或提供謂詞動作的詳細(xì)信息。每一條子句由一個關(guān)鍵字開始,如WHERE。
1.4.4 SQL的優(yōu)點(diǎn)
1.非過程化語言
SQL是一個非過程化的語言,因?yàn)樗淮翁幚硪粋€記錄,對數(shù)據(jù)提供自動導(dǎo)航。SQL允許用戶在高層的數(shù)據(jù)結(jié)構(gòu)上工作,而不對單個記錄進(jìn)行操作,可操作記錄集。所有SQL語句接受集合作為輸入,返回集合作為輸出。SQL的集合特性允許一條SQL語句的結(jié)果作為另一條SQL語句的輸入。SQL不要求用戶指定對數(shù)據(jù)的存放方法。
這種特性使用戶更易集中精力于要得到的結(jié)果。所有SQL語句都使用查詢優(yōu)化器,它是關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMS)的一部分,由它決定對指定數(shù)據(jù)最快速度存取的手段。查詢優(yōu)化器知道存在什么索引,在哪兒使用合適,而用戶從不需要知道表是否有索引,表有什么類型的索引。
2.統(tǒng)一的語言
SQL可用于所有用戶的數(shù)據(jù)庫活動模型,包括系統(tǒng)管理員、數(shù)據(jù)庫管理員、應(yīng)用程序員、決策支持系統(tǒng)人員及許多其他類型的終端用戶。基本的SQL命令只需很少時間就能學(xué)會,最高級的命令在幾天內(nèi)也可掌握。SQL為許多任務(wù)提供了以下命令。
? 查詢數(shù)據(jù)
? 在表中插入、修改和刪除記錄
? 建立、修改和刪除數(shù)據(jù)對象
? 控制對數(shù)據(jù)和數(shù)據(jù)對象的存取
? 保證數(shù)據(jù)庫一致性和完整性
以前的數(shù)據(jù)庫管理系統(tǒng)為上述各類操作提供單獨(dú)的語言,而SQL將全部任務(wù)統(tǒng)一在一種語言中。
3.是所有關(guān)系數(shù)據(jù)庫的公共語言
由于所有主要的關(guān)系數(shù)據(jù)庫管理系統(tǒng)都支持SQL語言,用戶可將使用SQL的技能從一個RDBMS轉(zhuǎn)到另一個。所有用SQL編寫的程序都是可以移植的。
1.4.5 SQL的執(zhí)行
除了定義如何使用語言外,SQL:1999標(biāo)準(zhǔn)還詳細(xì)說明了如何執(zhí)行SQL語句——共用4種執(zhí)行方法。
? 直接調(diào)用:利用這種方法,可以從前端應(yīng)用程序,如SQL Server中的Query Analyzer(查詢分析器)、Oracle中的SQL*Plus Worksheet,直接與SQL服務(wù)器上的數(shù)據(jù)庫進(jìn)行通信。我們只要把查詢輸入到應(yīng)用程序窗口,然后執(zhí)行SQL語句,就可以獲取查詢結(jié)果。這種方法可以迅速檢查數(shù)據(jù)、驗(yàn)證連接和觀察數(shù)據(jù)庫對象。
說明
本書中,SQL代碼實(shí)例均是在SQL Server中的Query Analyzer(查詢分析器)環(huán)境下直接實(shí)現(xiàn)的。
? 嵌入式SQL:在這種方法中,SQL語句直接編碼(嵌入)在主機(jī)編程語言中。例如,我們可以將SQL語句嵌入C應(yīng)用程序代碼中。在編譯代碼之前,預(yù)處理器將分析SQL語句,并把這些語句從C代碼中分離出來。SQL代碼被轉(zhuǎn)換成一種能為RDMS理解的格式,其余的C代碼則按照正常的方式進(jìn)行編譯。
? 模塊綁定:這種方法可以創(chuàng)建和主機(jī)編程語言相分離的SQL語句代碼塊,即模塊。模塊在創(chuàng)建后就被組合到應(yīng)用程序中。
? CLI(調(diào)用層接口):通過把作為參數(shù)值的SQL語句傳遞到子例程,CLI可以通過接口調(diào)用SQL語句。這些語句在嵌入式SQL和模塊綁定中,并不進(jìn)行預(yù)編譯,RDMS將直接執(zhí)行這些語句。
雖然直接調(diào)用不是最通用的方法,但是因?yàn)樗苯訉⒉樵兲峤唤o數(shù)據(jù)庫,并且可以立即生成結(jié)果,所以本書采用了這種方法。在實(shí)際應(yīng)用中,嵌入式SQL是最常用的方法。本書的第19章將對嵌入式SQL、模塊綁定、CLI進(jìn)行詳細(xì)討論。
1.5 SQL環(huán)境
SQL環(huán)境實(shí)際上可以理解為一個框架,數(shù)據(jù)在其中可以存在,而數(shù)據(jù)的SQL操作在其中可以執(zhí)行。
1.5.1 環(huán)境
實(shí)際上,可以把SQL環(huán)境看作是運(yùn)行在某個設(shè)備上的數(shù)據(jù)庫管理系統(tǒng)。SQL環(huán)境由很多組件構(gòu)成,各組件協(xié)同工作,以支持SQL操作,如創(chuàng)建和修改對象、存儲和查詢數(shù)據(jù),修改和刪除數(shù)據(jù)等。這些組件加起來構(gòu)成一個模型,RDBMS以該模型為基礎(chǔ)。
基本的數(shù)據(jù)庫元素,比如基本表、視圖,都是在SQL環(huán)境中定義的。這些元素組成了層次結(jié)構(gòu),每個元素起著不同的作用。SQL環(huán)境中元素的體系結(jié)構(gòu)如圖1-11所示。

圖1-11 SQL環(huán)境中元素的體系結(jié)構(gòu)
說明
圖中的群集是目錄的聚集。每個用戶都有相關(guān)的群集,也就是該用戶可以訪問的所有目錄的集合。群集是數(shù)據(jù)庫可以操作的最大范圍,因此,對于特定的用戶,群集就是“數(shù)據(jù)庫”。
1.5.2 SQL的層次結(jié)構(gòu)
目錄是SQL環(huán)境的重要組分,是模式的集合。這里我們可以把目錄看作是一個繼承結(jié)構(gòu),繼承結(jié)構(gòu)的頂部是SQL環(huán)境,目錄是父對象,模式是子對象,如圖1-12所示。

圖1-12 目錄的層次結(jié)構(gòu)
1.模式對象
模式對象位于目錄的底層,是包含在模式中的相關(guān)組件的集合。SQL數(shù)據(jù)就存儲在這一層。通過使用SQL,我們就可以定義SQL對象,修改、存儲和操作對象中的數(shù)據(jù)。實(shí)際上,本書所做的大部分工作都直接影響到模式對象。
SQL:1999定義了基本表、視圖、域、約束、觸發(fā)器等11種類型的模式對象,這些對象構(gòu)成了SQL環(huán)境的基礎(chǔ)。
2.模式(Schema)
這里的模式是指數(shù)據(jù)庫模式,而不是關(guān)系模式,是表、視圖、域等數(shù)據(jù)庫模式對象的聚集。模式是整個SQL環(huán)境體系結(jié)構(gòu)的基本單位。SQL中,模式的創(chuàng)建采用CREATE SCHEMA語句,其語法如下。
CREATE SCHEMA <模式名> <模式元素>
比如創(chuàng)建一個學(xué)生模式,包括學(xué)生、課程和學(xué)生選課等3個關(guān)系以及計(jì)算機(jī)系學(xué)生視圖,其說明簡要描述如下。
CREATE SCHEMA StudentSchema CREATE TABLE Student CREATE TABLE Course CREATE TABLE StudentCourse CREATE VIEW ComputerDeptStud
如果要把學(xué)生模式作為當(dāng)前模式,可如下設(shè)置。
SET SCHEMA StudentSchema
于是,隨后定義的表、視圖等模式元素均屬于學(xué)生模式。
3.目錄(Catalog)
目錄是模式的聚集,即每個目錄都有一個或多個模式。在一個目錄中,模式的名字必須是唯一的。每個目錄都包含INFORMATION-SCHEMA(信息模式)特殊模式,該模式包含該目錄中所有模式的信息。
在目錄中建立模式類似于在模式中建立表或視圖之類的模式元素。可以用如下語句建立學(xué)生目錄。
CREATE CATALOG StudentCatalog
它后面跟著屬于學(xué)生目錄的模式及模式的說明。可以用SET CATALOG(設(shè)置目錄)語句設(shè)置當(dāng)前目錄。例如,要把學(xué)生目錄作為當(dāng)前目錄,可如下設(shè)置。
SET CATALOG StudentCatalog;
于是,隨后定義的模式將屬于學(xué)生目錄。
1.5.3 客戶程序和服務(wù)程序系統(tǒng)
服務(wù)程序一般運(yùn)行在存有數(shù)據(jù)庫的大型主機(jī)上,而客戶程序一般運(yùn)行在另一臺主機(jī)上。當(dāng)然,有時客戶程序和服務(wù)程序也會運(yùn)行在同一臺主機(jī)上。SQL的客戶程序和服務(wù)程序與連接、會話和模塊這3個概念緊密地聯(lián)系在一起。SQL的客戶程序和服務(wù)程序的相互作用如圖1-13所示。

圖1-13 客戶程序和服務(wù)程序的相互作用
1.連接
連接把客戶程序和服務(wù)程序連接起來。可用如下的SQL連接語句,在客戶程序和服務(wù)程序之間打開連接。
CONNECT TO <服務(wù)程序名> AS <連接名>
我們一般把服務(wù)器名作為服務(wù)程序名。
說明
用戶可以打開幾個連接,但在任何時間只能有一個是活動的。
2.會話
當(dāng)連接激活時,所執(zhí)行的SQL操作將在客戶程序和服務(wù)程序之間形成請求——響應(yīng)式的交往,這種操作序列被稱為會話(Session)。
會話與建立它的連接處于同一狀態(tài)。當(dāng)連接處于待用狀態(tài)時,會話也處于待用狀態(tài),當(dāng)連接被激活時,會話也被激活。每個會話都有當(dāng)前目錄和該目錄中的當(dāng)前模式。
3.模塊
SQL2標(biāo)準(zhǔn)建議SQL實(shí)現(xiàn)至少為用戶提供以下3種類型的應(yīng)用程序(稱為模塊,Module)之一。
? 通用SQL接口
? 嵌入式SQL
? 實(shí)際模塊
模塊的執(zhí)行稱為SQL代理,圖1-13給出了一個模塊和一個SQL代理,并且把二者作為一個整體,調(diào)用SQL客戶程序來建立連接。
注意
模塊與SQL代理之間的差別類似于程序和處理之間的差別,前者為代碼,而后者是代碼的執(zhí)行。
1.5.4 SQL環(huán)境中對象的命名規(guī)則
在研究SQL之前,我們有必要介紹一下SQL對象標(biāo)識符。標(biāo)識符為SQL對象賦予名稱,最多可以達(dá)到128個字符,且必須遵守一定的規(guī)則。SQL語句創(chuàng)建的任何對象,如表、列、視圖或模式等,都必須有名字,也就是標(biāo)識符。
SQL:1999標(biāo)準(zhǔn)定義了兩種類型的標(biāo)識符,即正則標(biāo)識符和定界標(biāo)識符,二者具有不同的約定。實(shí)際應(yīng)用中,采用最多的是正則標(biāo)識符規(guī)則,因此這里只介紹正則標(biāo)識符規(guī)則,簡述如下。
? 標(biāo)識符名稱不區(qū)分大小寫,即大小寫是等效的,如StudentName等同于STUDENTNAME和studentname。
? 標(biāo)識符只允許使用字母、數(shù)據(jù)和下劃線,可以創(chuàng)建如First_Name,Table1之類的標(biāo)識符。
? 不允許使用SQL保留關(guān)鍵字。
說明
關(guān)鍵字是一個單詞,是SQL詞匯的一部分。SQL關(guān)鍵字有兩種類型:保留關(guān)鍵字和非保留關(guān)鍵字。保留關(guān)鍵字只能用在SQL語句中,而不能用于其他任何用途。非保留關(guān)鍵字則沒有這樣的限制。
一個完整的模式對象標(biāo)識符應(yīng)包括目錄的名稱、模式的名稱和模式對象的名稱,各個名稱之間以點(diǎn)(.)隔開。如Student表在StudentSchema模式中,而這個模式又在StudentCatalog目錄中,那么該表完全合格的名稱就是StudentCatalog.StudentSchema.Student。
- Scala機(jī)器學(xué)習(xí)
- 程序員的制勝技
- 產(chǎn)品眾包設(shè)計(jì)理論與方法
- Apache Pulsar原理解析與應(yīng)用實(shí)踐
- 學(xué)校沒教的軟件工程課
- Swift開發(fā)實(shí)戰(zhàn)
- 負(fù)載均衡:高并發(fā)網(wǎng)關(guān)設(shè)計(jì)原理與實(shí)踐
- 構(gòu)建跨平臺APP:jQuery Mobile移動應(yīng)用實(shí)戰(zhàn)(第2版) (跨平臺移動開發(fā)叢書)
- 軟件架構(gòu)指標(biāo):度量軟件系統(tǒng)的性能和架構(gòu)質(zhì)量
- 持續(xù)交付2.0:業(yè)務(wù)引領(lǐng)的DevOps精要(增訂本)
- 芯片改變世界
- Android驅(qū)動開發(fā)與移植實(shí)戰(zhàn)詳解
- 云計(jì)算360度
- 鋒利的jQuery(第2版)
- 軟件安全開發(fā)