数据库基本知识学习
 第一章 基本知識(shí)
 
數(shù)據(jù)和信息
信息:關(guān)于現(xiàn)實(shí)世界事物存在方式和運(yùn)動(dòng)狀態(tài)的反映。
 數(shù)據(jù):通常指用符號(hào)記錄下來的、可以識(shí)別的信息。
 
數(shù)據(jù)處理和數(shù)據(jù)管理
數(shù)據(jù)處理是指從某些已知的數(shù)據(jù)出發(fā),推導(dǎo)加工出一些新的信息。
數(shù)據(jù)管理是指數(shù)據(jù)的收集、整理、存儲(chǔ)、維護(hù)、檢索、傳送等操作。這部分操作是數(shù)據(jù)處理業(yè)務(wù)的基本環(huán)節(jié),而且是任何數(shù)據(jù)處理業(yè)務(wù)中必不可少的共有部分。
 
 
數(shù)據(jù)庫基本術(shù)語
數(shù)據(jù)庫(DB):長(zhǎng)期存儲(chǔ)在計(jì)算機(jī)內(nèi)、有組織的、統(tǒng)一管理的相關(guān)數(shù)據(jù)的集合。
數(shù)據(jù)庫管理系統(tǒng)(DBMS):位于用戶和操作系統(tǒng)之間的一層數(shù)據(jù)管理軟件。
數(shù)據(jù)庫系統(tǒng)(DBS):實(shí)現(xiàn)有組織地、動(dòng)態(tài)地存儲(chǔ)大量關(guān)聯(lián)數(shù)據(jù)、方便多用戶訪問的計(jì)算機(jī)硬件、軟件和數(shù)據(jù)資源組成的系統(tǒng)。
數(shù)據(jù)庫技術(shù):與數(shù)據(jù)庫的結(jié)構(gòu)、存儲(chǔ)、設(shè)計(jì)、管理和使用的相關(guān)技術(shù)。
 
 
數(shù)據(jù)存儲(chǔ)方法的演化歷史:磁盤、卡片和紙帶發(fā)展到磁盤,同時(shí)磁盤容量出現(xiàn)飛速增長(zhǎng)。
數(shù)據(jù)庫技術(shù)的發(fā)展經(jīng)歷了三個(gè)階段:手工管理階段、文件系統(tǒng)階段和數(shù)據(jù)庫階段。
手工管理階段:在20世紀(jì)50年代以前,外存只有磁帶、卡片和紙帶,還沒有直接存取設(shè)備,沒有操作系統(tǒng),沒有管理數(shù)據(jù)的軟件,也沒有文件的概念。數(shù)據(jù)量少,由用戶自己管理,且數(shù)據(jù)沒有組織結(jié)構(gòu),是面向應(yīng)用的,依賴于應(yīng)用程序,不能獨(dú)立存在。
文件系統(tǒng)階段:50年代后期到60年代中期,出現(xiàn)了磁鼓、磁盤等存儲(chǔ)設(shè)備,于是數(shù)據(jù)被組織成獨(dú)立的數(shù)據(jù)文件,這樣數(shù)據(jù)以“文件”形式長(zhǎng)期保存在外部存儲(chǔ)器的磁盤上,系統(tǒng)通過文件名訪問,對(duì)文件里的記錄進(jìn)行存取,并可對(duì)文件中的記錄進(jìn)行增刪改。文件系統(tǒng)實(shí)現(xiàn)了記錄的結(jié)構(gòu)化,即給出了記錄間各種數(shù)據(jù)的關(guān)系,使得數(shù)據(jù)的邏輯結(jié)構(gòu)與物理結(jié)構(gòu)有了區(qū)別。文件組織也已經(jīng)多樣化。數(shù)據(jù)不再屬于某個(gè)特定的程序,可以重復(fù)使用。
但文件從整體上看仍是無結(jié)構(gòu)的,數(shù)據(jù)共享性、獨(dú)立性差,數(shù)據(jù)之間聯(lián)系弱,數(shù)據(jù)不一致,且有大量冗余,所以管理和維護(hù)的代價(jià)很大。
數(shù)據(jù)庫階段:60年代后期,出現(xiàn)了數(shù)據(jù)庫這樣的數(shù)據(jù)管理技術(shù)。1968年IBM推出層次模型的IMS系統(tǒng)。1969年CODASYL組織發(fā)布了DBTG報(bào)告,總結(jié)了當(dāng)時(shí)各種數(shù)據(jù)庫,提出網(wǎng)狀模型。可以說,層次數(shù)據(jù)庫是數(shù)據(jù)庫系統(tǒng)的先驅(qū),而網(wǎng)狀數(shù)據(jù)庫則是數(shù)據(jù)庫概念、方法、技術(shù)的奠基者。1970年IBM的E.F.Codd連續(xù)發(fā)表論文,提出關(guān)系模型,奠定了關(guān)系數(shù)據(jù)庫的理論基礎(chǔ)。
數(shù)據(jù)庫的特點(diǎn)有:采用數(shù)據(jù)模型表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu);有較高的數(shù)據(jù)獨(dú)立性;數(shù)據(jù)庫系統(tǒng)為用戶提供了方便的用戶接口;數(shù)據(jù)庫系統(tǒng)提供了數(shù)據(jù)庫的并發(fā)控制、數(shù)據(jù)庫的恢復(fù)、數(shù)據(jù)的完整性、數(shù)據(jù)安全性這四方面的數(shù)據(jù)控制功能。
除了關(guān)系數(shù)據(jù)庫,如今還有一些高級(jí)數(shù)據(jù)庫,比如分布式數(shù)據(jù)庫系統(tǒng)、對(duì)象數(shù)據(jù)庫系統(tǒng)、網(wǎng)絡(luò)數(shù)據(jù)庫系統(tǒng)。
分布式數(shù)據(jù)庫通常使用位于不同的地點(diǎn)的較小的計(jì)算機(jī)系統(tǒng),通過網(wǎng)絡(luò)連接構(gòu)成完整的、全局的大型數(shù)據(jù)庫。每臺(tái)計(jì)算機(jī)有DBMS的一份完整拷貝,且具有自己局部的數(shù)據(jù)庫。
對(duì)象數(shù)據(jù)庫是用以對(duì)象形式表示信息的數(shù)據(jù)庫。對(duì)象數(shù)據(jù)庫的管理系統(tǒng)稱為ODBMS或OODBMS。
網(wǎng)絡(luò)數(shù)據(jù)庫由數(shù)據(jù)和資源共享這兩種方式結(jié)合在一起而成,也稱Web數(shù)據(jù)庫。它以后臺(tái)(遠(yuǎn)程)數(shù)據(jù)庫為基礎(chǔ),加上一定的前臺(tái)(本地計(jì)算機(jī))程序,通過瀏覽器完成數(shù)據(jù)的存儲(chǔ)、查詢等操作。
 
 
數(shù)據(jù)庫系統(tǒng)的體系結(jié)構(gòu)
數(shù)據(jù)庫系統(tǒng)的結(jié)構(gòu)常采用三級(jí)模式結(jié)構(gòu):外模式、概念模式、內(nèi)模式。
概念模式簡(jiǎn)稱為模式,它表示了對(duì)數(shù)據(jù)的全局邏輯級(jí)的抽象級(jí)別,是數(shù)據(jù)庫中全部數(shù)據(jù)的整體邏輯結(jié)構(gòu)的描述。它由若干個(gè)概念記錄類型組成,還包含記錄間聯(lián)系、數(shù)據(jù)的完整性、安全性等要求。在實(shí)現(xiàn)中,它可以對(duì)應(yīng)于所有的表格。
內(nèi)模式也稱存儲(chǔ)模式,表示了對(duì)數(shù)據(jù)的物理級(jí)的抽象級(jí)別。它是數(shù)據(jù)庫中全體數(shù)據(jù)的內(nèi)部表示或底層描述,是數(shù)據(jù)庫最低一級(jí)的邏輯描述,它描述了數(shù)據(jù)在存儲(chǔ)介質(zhì)上的存儲(chǔ)方式和物理結(jié)構(gòu),對(duì)應(yīng)著實(shí)際存儲(chǔ)在外存儲(chǔ)介質(zhì)上的數(shù)據(jù)庫。它包括記錄類型、索引、文件的組織等,用內(nèi)模式描述語言來描述、定義。
外模式也稱子模式,表示了對(duì)數(shù)據(jù)的局部邏輯級(jí)的抽象級(jí)別。它對(duì)應(yīng)于用戶級(jí),是用戶與數(shù)據(jù)庫系統(tǒng)的接口,是用戶用到的那部分?jǐn)?shù)據(jù)的描述。在實(shí)現(xiàn)中可以對(duì)應(yīng)于視圖。
三級(jí)模式間存在二級(jí)映象:
外模式/概念模式映象:局部邏輯級(jí)和全局邏輯級(jí)的一級(jí)映象,提供了邏輯獨(dú)立性。這樣在修改表格時(shí),只需要相應(yīng)修改映象,而用戶程序不會(huì)受到影響。
概念模式/內(nèi)模式映象:全局邏輯級(jí)和物理級(jí)的一級(jí)映象,提供了物理獨(dú)立性。這樣在進(jìn)行數(shù)據(jù)庫遷移時(shí),比如從mysql到sqlserver,表格并不需要發(fā)生變化。
 
 
DBMS用于管理數(shù)據(jù)庫。應(yīng)用程序向DBMS發(fā)送請(qǐng)求,DBMS則向DB發(fā)出底層指令。DB向DBMS返回?cái)?shù)據(jù)(查詢結(jié)果),DBMS對(duì)數(shù)據(jù)進(jìn)行處理并返回給應(yīng)用程序數(shù)據(jù)(處理結(jié)果)。
DBMS的主要功能有:數(shù)據(jù)庫的定義功能、數(shù)據(jù)庫的操縱功能、數(shù)據(jù)庫的保護(hù)功能(數(shù)據(jù)庫的恢復(fù)、數(shù)據(jù)庫的并發(fā)控制、數(shù)據(jù)完整性控制和數(shù)據(jù)安全性控制)、數(shù)據(jù)庫的維護(hù)功能和數(shù)據(jù)字典(存放數(shù)據(jù)庫的信息,其用途為描述數(shù)據(jù),比如一個(gè)表的創(chuàng)建者信息,創(chuàng)建時(shí)間信息,所屬表空間信息,用戶訪問權(quán)限信息等)。
 
 
數(shù)據(jù)庫系統(tǒng)的組成:數(shù)據(jù)庫、硬件、軟件(DBMS、OS、開發(fā)工具等)和數(shù)據(jù)庫管理員。
數(shù)據(jù)庫系統(tǒng)的用戶角色有:
DBA(Database Administrator):是控制數(shù)據(jù)庫整體結(jié)構(gòu)的一組人員,負(fù)責(zé)DBS的正常運(yùn)行,承擔(dān)創(chuàng)建、監(jiān)控和維護(hù)數(shù)據(jù)庫的責(zé)任。它的職責(zé)有:定義模式、定義內(nèi)模式、與用戶的聯(lián)絡(luò)(包括定義外模式、應(yīng)用程序的設(shè)計(jì)、提供技術(shù)培訓(xùn)等專業(yè)服務(wù))、定義安全性規(guī)則和對(duì)用戶訪問的數(shù)據(jù)庫進(jìn)行授權(quán)、定義完整性規(guī)則及監(jiān)督數(shù)據(jù)庫的運(yùn)行、數(shù)據(jù)的轉(zhuǎn)儲(chǔ)和恢復(fù)工作。
專業(yè)用戶:使用專用的數(shù)據(jù)庫查詢語言操作數(shù)據(jù)的計(jì)算機(jī)工作者。
應(yīng)用程序員:使用主語言和DML語言(Data Manipulation Language,SQL的分類之一,包括:INSERT、UPDATE、DELETE。)編寫應(yīng)用程序的計(jì)算機(jī)工作者。
終端用戶:使用應(yīng)用程序的非計(jì)算機(jī)人士。
 
 
第二章 數(shù)據(jù)模型
數(shù)據(jù)模型的概念
能表示實(shí)體類型及實(shí)體間聯(lián)系的模型稱為“數(shù)據(jù)模型”。
數(shù)據(jù)模型分為兩類:概念數(shù)據(jù)模型、輯數(shù)據(jù)模型和物理數(shù)據(jù)模型。
 
 
概念數(shù)據(jù)模型(Conceptual Data Model)貼近于現(xiàn)實(shí)世界,它獨(dú)立于計(jì)算機(jī)系統(tǒng),完全不涉及信息在計(jì)算機(jī)中的表示,只是用來描述某個(gè)特定組織所關(guān)心的信息結(jié)構(gòu)。
最常用的概念數(shù)據(jù)模型是E-R(Entity-Relationship)模型,即實(shí)體-聯(lián)系模型。它的數(shù)據(jù)描述有:
實(shí)體:客觀存在,可以互相區(qū)別的事物。
實(shí)體集:性質(zhì)相同的同類實(shí)體的集合。
屬性:實(shí)體的特性。
實(shí)體標(biāo)識(shí)符。
聯(lián)系:實(shí)體之間的相互聯(lián)系。
 ER模型可以用ER圖來表示,它看起來如下:
 
 
ER圖有三個(gè)基本成分:矩形框,用于表示實(shí)體類型(考慮問題的對(duì)象);菱形框,用于表示聯(lián)系類型;橢圓形框,用于表示實(shí)體和聯(lián)系類型的屬性,實(shí)體的主鍵屬性里文字下方應(yīng)該有下劃線。從上圖可以看到實(shí)體和聯(lián)系都可以有屬性。一般說來,ER圖里實(shí)體都是名詞,而聯(lián)系都是動(dòng)詞。
 ER圖的優(yōu)點(diǎn)有:簡(jiǎn)單、容易理解,真實(shí)反映用戶的需求;與計(jì)算機(jī)無關(guān),用戶容易接受。
 
與一個(gè)聯(lián)系有關(guān)的實(shí)體集個(gè)數(shù)被稱為元數(shù)。一個(gè)聯(lián)系可以是一元聯(lián)系、二元聯(lián)系或多元聯(lián)系。上圖展示的聯(lián)系就是二元聯(lián)系。根據(jù)實(shí)體參與的數(shù)量,二元聯(lián)系又可分為一對(duì)一(1:1,乘客和座位)、一對(duì)多(1:N,車間和工人)和多對(duì)多(M:N,學(xué)生和課程)。上表中的聯(lián)系上m和n表示多對(duì)多的關(guān)系。一元聯(lián)系的一個(gè)例子是零件的組合關(guān)系,一個(gè)零件可以用若干子零件組成。
屬性的分類
根據(jù)屬性的可分性,屬性有基本屬性和復(fù)合屬性。比如地址可以包含郵編、街道、門牌號(hào),它是一個(gè)復(fù)合屬性。
根據(jù)屬性的值的數(shù)量,屬性有單值屬性和多值屬性。比如一個(gè)人的姓名是一個(gè)單值屬性,而他的網(wǎng)名是多值屬性。多值屬性在ER圖里用雙線橢圓表示。
此外,還有導(dǎo)出屬性(派生屬性),它通過具有相互信賴的屬性推導(dǎo)出來,比如一個(gè)學(xué)生的平均成績(jī)。導(dǎo)出屬性在ER圖里用虛線橢圓表示。
注意屬性的值可以是空值。
 存在依賴(Existence Dependency):如果實(shí)體x的存在依賴于實(shí)體y的存在,則稱x存在依賴于y。y稱作支配實(shí)體,而x稱作從屬實(shí)體(弱實(shí)體)。弱實(shí)體主鍵的一部分或全部從被依賴實(shí)體獲得。如果y被刪除,那么x也要被刪除。從屬實(shí)體的集合便稱為弱實(shí)體集。弱實(shí)體在ER圖里用雙線矩形表示。比如某單位的職工子女信息,如果職工不在該單位了,其子女信息也沒有意義了,所以職工子女信息是一個(gè)弱實(shí)體。
 
 
 
邏輯數(shù)據(jù)模型(Logical Data Model)貼近于計(jì)算機(jī)上的實(shí)現(xiàn),是用戶從數(shù)據(jù)庫看到的模型,是具體DBMS所支持的數(shù)據(jù)模型。此模型既要面向用戶,又要面向系統(tǒng),主要用于DBMS的實(shí)現(xiàn)。邏輯模型有層次模型、網(wǎng)狀模型和關(guān)系模型。
層次模型:用樹形結(jié)構(gòu)表示實(shí)體類型及實(shí)體間聯(lián)系的數(shù)據(jù)模型,盛行于20世紀(jì)70年代。缺點(diǎn)是只能表示1:N的關(guān)系,且查詢和操作很復(fù)雜。
網(wǎng)狀模型:用有向圖表示實(shí)體類型及實(shí)體間聯(lián)系的數(shù)據(jù)模型,盛行于70年代至80年代中期。它的特點(diǎn)是記錄之間聯(lián)系通過指針實(shí)現(xiàn),M:N也容易實(shí)現(xiàn),查詢效率較高。缺點(diǎn)是數(shù)據(jù)結(jié)構(gòu)復(fù)雜,編程復(fù)雜。
關(guān)系模型:用二維表格表示實(shí)體集;用關(guān)鍵碼而不是用指針導(dǎo)航數(shù)據(jù)。SQL語言是具有代表性的語言。
 
 
 物理數(shù)據(jù)模型(Physical Data Model)面向于計(jì)算機(jī)物理表示,描述了數(shù)據(jù)在存儲(chǔ)介質(zhì)上的組織結(jié)構(gòu),不僅和具體的DBMS有關(guān),還與操作系統(tǒng)和硬件有關(guān)。每一種邏輯數(shù)據(jù)模型在實(shí)現(xiàn)時(shí)都有起對(duì)應(yīng)的物理數(shù)據(jù)模型。DBMS為了保證其獨(dú)立性與可移植性,大部分物理數(shù)據(jù)模型的實(shí)現(xiàn)工作由系統(tǒng)自動(dòng)完成,而設(shè)計(jì)者只設(shè)計(jì)索引、聚集等特殊結(jié)構(gòu)。
 
 
 
ER模式的設(shè)計(jì)的過程為:設(shè)計(jì)局部ER模式、設(shè)計(jì)全局模式和全局ER模式的優(yōu)化。
局部ER模式設(shè)計(jì)基于需求分析的結(jié)果,1、確定局部結(jié)構(gòu)范圍;2、實(shí)體定義;3、聯(lián)系定義;4、屬性分配;5、查看是否還有待分析的局部結(jié)構(gòu),若有則跳到第2步,否則進(jìn)入全局ER模式設(shè)計(jì)階段。
全局ER模式設(shè)計(jì)基于局部ER模式,1、確定公共實(shí)體類型;2、合并兩個(gè)局部的ER模式;3、檢查并消除沖突;4、重復(fù)第3步直到不再有沖突;5、檢查是否還有未合并的局部ER模式,若有則跳到第2步,否則便完成了ER模式設(shè)計(jì)。
全局ER模式的優(yōu)化有:實(shí)體類型的合并(一般的可以把1:1聯(lián)系的兩個(gè)實(shí)體類型合并);冗余屬性的消除;冗余聯(lián)系的消除(通常利用規(guī)范化理論中的函數(shù)依賴的概念消除冗余聯(lián)系)。
在ER模式的設(shè)計(jì)過程中,常常要對(duì)ER模型進(jìn)行種種變換。變換包括:分裂、合并和增加刪除。
實(shí)體的分裂有水平分裂和垂直分裂。水平分裂根據(jù)應(yīng)用對(duì)象的不同,分成兩個(gè)具有相同屬性的實(shí)體,比如書店的書可以水平分裂成“有庫存”和“無庫存”兩個(gè)實(shí)體,這樣方便對(duì)兩種實(shí)體進(jìn)行不同的操作。垂直分裂根據(jù)屬性的使用頻率,分成兩個(gè)屬性不同的實(shí)體,比如圖書有作者、版次、價(jià)格等屬性,分成包含常用的作者、版次屬性的圖書和包含不常用的價(jià)格屬性的圖書。垂直分裂的好處是可以減少每次存取的數(shù)據(jù)量。
聯(lián)系的分裂可以細(xì)化聯(lián)系,比如程序員和項(xiàng)目的聯(lián)系“參與”,可以分裂成“開發(fā)”和“維護(hù)”。
合并是分裂的逆過程。注意合并的聯(lián)系類型只能是定義在相同的實(shí)體類型上的。
 
 
ER模型向關(guān)系模型的轉(zhuǎn)換規(guī)則
實(shí)例類型的轉(zhuǎn)換:將每個(gè)實(shí)體類型轉(zhuǎn)換成一個(gè)關(guān)系模型,實(shí)體的屬性即為關(guān)系模型的屬性,實(shí)體的標(biāo)識(shí)符即為關(guān)系模型的鍵。
二元聯(lián)系類型的轉(zhuǎn)換:
1:1聯(lián)系:在由實(shí)體轉(zhuǎn)換成的兩個(gè)關(guān)系模式之間選任一個(gè)加上一個(gè)屬性來表示另一個(gè)關(guān)系模式的鍵和聯(lián)系。也就是結(jié)果只有兩張表,其中一張表里會(huì)有外鍵表示聯(lián)系。
1:N聯(lián)系:在N端實(shí)體轉(zhuǎn)換成的關(guān)系模式里加上1端實(shí)體類型的鍵和聯(lián)系類型和屬性。最終的結(jié)果也是兩個(gè)表,N端的表有外鍵。
M:N聯(lián)系:將聯(lián)系類型轉(zhuǎn)換成關(guān)系模式,其屬性為兩端實(shí)體類型的鍵加上聯(lián)系類型的屬性,而鍵為兩端實(shí)體鍵的組合。最終的結(jié)果有三張表,其中一張表專門表示聯(lián)系,包含另兩個(gè)表的外鍵。
 
 
第三章 關(guān)系數(shù)據(jù)庫理論
關(guān)系模型是用二維表格表示實(shí)體,用鍵碼進(jìn)行數(shù)據(jù)導(dǎo)航的數(shù)據(jù)模型。數(shù)據(jù)導(dǎo)航是指從已知數(shù)據(jù)查找未知數(shù)據(jù)的方法。在關(guān)系模型中,記錄稱為元組,為行(Row);字段稱為屬性,為列(Column)。
超鍵(Super Key)是可以唯一標(biāo)識(shí)元組的屬性集。候選鍵(Candicate Key)是不含多余屬性的超鍵。主鍵(Primary Key)是用戶選做元組標(biāo)識(shí)的候選鍵。外鍵(Foreign Key)是當(dāng)模式R中的屬性K是其它模式的主鍵,那么K在R中稱為鍵。
 舉個(gè)例子,屏幕上的點(diǎn)的信息表
 
| x坐標(biāo) | y坐標(biāo) | 顏色 | 大小 | 
 如果主鍵出現(xiàn)在別的表中,比如一個(gè)“射線”表
 
| x坐標(biāo) | y坐標(biāo) | 方向 | 
 
 
關(guān)系是一個(gè)屬性集相同的元組的集合。由于是集合,因此:
1、關(guān)系中沒有重復(fù)的元組;
2、關(guān)系中的元組是無序的,即沒有行序;(理論上屬性集也是無序的,但使用時(shí)習(xí)慣考慮列的順序)。
每個(gè)屬性都是不可分解的整體,比如只能是整型、字符這種簡(jiǎn)單類型,而不能是結(jié)構(gòu)體這樣的復(fù)雜的類型。
根據(jù)元組的數(shù)目,關(guān)系可分為有限關(guān)系和無限關(guān)系。
 
 
關(guān)系模式有三類完整性規(guī)則:
1、實(shí)體完整性規(guī)則,即主鍵的值不能是空值;
2、參照完整性規(guī)則,即不允許(通過外鍵)引用不存在的實(shí)體;
3、用戶定義的完整性規(guī)則,比如屬性“性別”只能接受“男”和“女”作為合法值,其它的輸入都是非法的。
 關(guān)于參照完整性,當(dāng)在一個(gè)參照關(guān)系里作為刪除記錄時(shí),有三種策略:
 1、級(jí)聯(lián)刪除:將參照關(guān)系中所有外鍵值與被參照關(guān)系中要?jiǎng)h除的元組的主鍵值相同的元組一起刪除;
2、受限刪除:僅當(dāng)參數(shù)關(guān)系中沒有外鍵與被參照關(guān)系中要?jiǎng)h除的元組主鍵值相同時(shí)才允許刪除,否則拒絕刪除操作;
3、置空值刪除:刪除被參照關(guān)系中的元組,并將參照關(guān)系中相應(yīng)的外鍵值置空值。
而向參照關(guān)系插入元組時(shí),有兩種策略:
1、受限插入:僅當(dāng)被參照關(guān)系存在相應(yīng)的元組,且其主鍵和要插入的元組的外鍵值相同時(shí)才允許插入,否則拒絕插入操作;
 2、遞歸插入:首先在被參照關(guān)系里插入主鍵值等于參照關(guān)系里要插入的元組的外鍵值相同的元組,再在參照關(guān)系里插入元組。
 
關(guān)于實(shí)體完整性,主鍵的修改操作有兩種方法:一種是不允許修改主鍵;另一種是允許修改主鍵,但必須保證修改后的主鍵唯一且非空。當(dāng)修改的主鍵是參照關(guān)系的外鍵時(shí),可以使用三種策略:級(jí)聯(lián)修改、受限修改和置空值刪除。
 
 
關(guān)系代數(shù)的運(yùn)算有多種。
五個(gè)基本操作:并(Union,∪)、差(set difference,?)、笛卡兒積(Cartesian product,×)、投影(Projection,Π)和選擇(Selection,σ);
四個(gè)組合操作:交(Intersection,∩)、θ連接(θ-Join,θ)、自然連接(Natural join,?)和除法(Division,÷);
七個(gè)擴(kuò)充操作:改名(Rename,ρ)、廣義投影、賦值(←)、外連接(Outer joins,???)、外部并、半連接(Semijoin,? ?)、聚集操作(Aggregation)。
 
 
選擇運(yùn)算:從關(guān)系中選擇滿足給定條件的元組。比如σA<5(R)在關(guān)系R中選擇屬性A的值小于5的元組。
投影運(yùn)算:從關(guān)系中取出若干列組成新的關(guān)系,投影結(jié)果里要?jiǎng)h除重復(fù)的元組。比如ΠA,B(R)從關(guān)系R中取出屬性集(A、B)。
 舉個(gè)例子,有學(xué)生信息表S1
 
| 學(xué)號(hào) | 姓名 | 電話 | 
| 1 | X | 123 | 
| 2 | Y | 456 | 
| 3 | Z | 789 | 
 
 
并運(yùn)算:合并兩個(gè)關(guān)系,即元組合并。這兩個(gè)關(guān)系必須是同構(gòu)的,即屬性集應(yīng)該相同。
 例如有另一種學(xué)生信息表S2
 
| 學(xué)號(hào) | 姓名 | 電話 | 
| 3 | Z | 789 | 
| 4 | M | 999 | 
S1∪S2的結(jié)果為:
| 學(xué)號(hào) | 姓名 | 電話 | 
| 1 | X | 123 | 
| 2 | Y | 456 | 
| 3 | Z | 789 | 
| 4 | M | 999 | 
 
 
交運(yùn)算:得到同時(shí)出現(xiàn)在兩個(gè)關(guān)系的元組集合。
 例如,
 S1∩S2的結(jié)果為:
 
| 學(xué)號(hào) | 姓名 | 電話 | 
| 3 | Z | 789 | 
 
 
差運(yùn)算:得到出現(xiàn)在一個(gè)關(guān)系而不在另一個(gè)關(guān)系的元組集合。
 例如:
 S1?S2的結(jié)果為:
 
| 學(xué)號(hào) | 姓名 | 電話 | 
| 1 | X | 123 | 
| 2 | Y | 456 | 
換句話說,(S1?S2)∩S2=?,而(S1?S2)∪S1=S1。
 
 
笛卡兒乘積運(yùn)算:把一個(gè)關(guān)系中的每個(gè)元組和另一個(gè)關(guān)系的所有元組連接成新關(guān)系中的一個(gè)元組。新關(guān)系的元組數(shù)是兩個(gè)關(guān)系的元組數(shù)之積。
 比如有一張選課表SC1
 
| 學(xué)號(hào) | 課程 | 
| 1 | 語文 | 
| 2 | 數(shù)學(xué) | 
 那么S1×SC1的結(jié)果為:
 
| 學(xué)號(hào) | 姓名 | 電話 | 學(xué)號(hào) | 成績(jī) | 
| 1 | X | 123 | 1 | 語文 | 
| 1 | X | 123 | 2 | 數(shù)學(xué) | 
| 2 | Y | 456 | 1 | 語文 | 
| 2 | Y | 456 | 2 | 數(shù)學(xué) | 
| 3 | Z | 789 | 1 | 語文 | 
| 3 | Z | 789 | 2 | 數(shù)學(xué) | 
運(yùn)算中的查詢優(yōu)化:盡可能早地執(zhí)行選擇操作和投影操作;避免直接做笛卡兒乘積,把笛卡兒乘積之前和之后的一連串操作和投影合并起來做。
 
 
除運(yùn)算:它類似于(但不完全是)笛卡兒乘積的逆運(yùn)算,被除關(guān)系的屬性集(M,N)真包含除關(guān)系的屬性集(N),得到的結(jié)果關(guān)系的屬性集為被除關(guān)系的屬性集與除關(guān)系的屬性集的差集(M),且結(jié)果關(guān)系是與除關(guān)系的笛卡兒乘積被包含于被除關(guān)系的最大關(guān)系。換句話說,若R1(M,N)÷?R2(N) = R3(M),則R3(M) × R2(N) ? R1(M,N),而在ΠM(R1)?R3里,沒有任何子集能足這樣的關(guān)系。
 舉個(gè)例子,有選課表SC2
 
| 學(xué)號(hào) | 課程 | 
| 1 | 語文 | 
| 2 | 數(shù)學(xué) | 
| 1 | 數(shù)學(xué) | 
| 課程 | 
| 語文 | 
| 數(shù)學(xué) | 
 那么SC2?÷?C2的結(jié)果為:
 
| 學(xué)號(hào) | 
| 1 | 
結(jié)果其實(shí)為選修了所有課程的學(xué)生號(hào)。
 除運(yùn)算的另一種形式表達(dá)為:r?÷?s =?ΠR-S(r)?-ΠR-S((ΠR-S(r)?× s)?-?ΠR-S,S(r))?(小寫r、s為關(guān)系名,而大寫R、S分別為r、s的屬性集)。
 
 
 
更名運(yùn)算:ρx(E)可以返回關(guān)系表達(dá)式的結(jié)果,并重命名這個(gè)表達(dá)式為x。ρx(A1,A2,...,An)(E)同時(shí)將各屬性更名為A1、A2……,An。例如數(shù)學(xué)成績(jī)比王紅同學(xué)高的學(xué)生:ΠS.姓名(σR.成績(jī)<S.成績(jī) ∧ R.課程=數(shù)學(xué) ∧ S.課程=數(shù)學(xué) ^ R.姓名=王紅(R ×ρS(R))。其實(shí)更名運(yùn)算就是SQL里的as。
 
 
θ連接:從兩個(gè)關(guān)系的廣義笛卡兒積中選取給屬性間滿足一定條件的元組通常寫法為:
| R?S | 
| A θ B | 
 A、B分別為R和S上可比的屬性列。θ為算術(shù)比較符,如果是等號(hào)則稱為等值連接。例如數(shù)學(xué)成績(jī)比王紅同學(xué)高的學(xué)生的另一種表示方式可以是:
 
| ΠS.姓名((σ課程=數(shù)學(xué) ∧ 姓名=王紅(R)) | ? | σ課程=數(shù)學(xué)ρS(R) | 
| R.成績(jī) | < | S.成績(jī) | 
 自然連接:從兩個(gè)關(guān)系的廣義笛卡兒積中選取在相同屬性列上取值相等的元組,并去掉重復(fù)的列。比如前面的S1表和SC1表的自然連接的結(jié)果為:
 
| 學(xué)號(hào) | 姓名 | 電話 | 成績(jī) | 
| 1 | X | 123 | 語文 | 
| 2 | Y | 456 | 數(shù)學(xué) | 
 
 
賦值運(yùn)算:用于存儲(chǔ)臨時(shí)變量,比如r?÷?s的過程可寫成:
 temp1??ΠR-S(r)
 
 temp2?←ΠR-S(tmp1?× s) -?ΠR-S,S(r))
 
 result?←temp1?-?temp2
 
 
 
廣義投影:在投影列表中使用算術(shù)表達(dá)式來對(duì)投影進(jìn)行擴(kuò)展:ΠF1, F2, ..., Fn(E),其中F1,F2,...Fn是算術(shù)表達(dá)式。比如:ΠA*5, B+3(R)。
 
 
外連接:為避免自然連接時(shí)因失配而發(fā)生的信息丟失,可以假定往參與連接的一方表中附加一個(gè)取值全為空值的行,它和參與連接的另一方表中的任何一個(gè)未匹配上的元組都能匹配,稱之為外連接。
外連接 = 自然連接 + 未匹配元組
外連接的形式有:左外連接、右外連接和全外連接。
左外連接 = 自然連接 + 左側(cè)表中未匹配元組
右外連接 = 自然連接 + 右側(cè)表中未匹配元組
 全外連接 = 自然連接 + 兩側(cè)表中未匹配元組
 
考慮兩張表“學(xué)生借書信息”(R)
| 學(xué)號(hào) | 書名 | 借出時(shí)間 | 
| 1 | 數(shù)據(jù)庫 | 2012.1.2 | 
| 5 | 設(shè)計(jì)模式 | 2012.3.6 | 
| 8 | 操作系統(tǒng) | 2012.4.8 | 
和“學(xué)生會(huì)信息”(S):
| 學(xué)號(hào) | 學(xué)生會(huì) | 
| 1 | 科技部 | 
| 3 | 體育部 | 
 自然連接:R?S:
 
| 學(xué)號(hào) | 書名 | 借出時(shí)間 | 學(xué)生會(huì) | 
| 1 | 數(shù)據(jù)庫 | 2012.1.2 | 科技部 | 
 左外連接:R?S
 
| 學(xué)號(hào) | 書名 | 借出時(shí)間 | 學(xué)生會(huì) | 
| 1 | 數(shù)據(jù)庫 | 2012.1.2 | 科技部 | 
| 5 | 設(shè)計(jì)模式 | 2012.3.6 | null | 
| 8 | 操作系統(tǒng) | 2012.4.8 | null | 
 右外連接:R?S
 
| 學(xué)號(hào) | 書名 | 借出時(shí)間 | 學(xué)生會(huì) | 
| 1 | 數(shù)據(jù)庫 | 2012.1.2 | 科技部 | 
| 3 | null | null | 體育部 | 
 全外連接:R?S
 
| 學(xué)號(hào) | 書名 | 借出時(shí)間 | 學(xué)生會(huì) | 
| 1 | 數(shù)據(jù)庫 | 2012.1.2 | 科技部 | 
| 3 | null | null | 體育部 | 
| 5 | 設(shè)計(jì)模式 | 2012.3.6 | null | 
| 8 | 操作系統(tǒng) | 2012.4.8 | null | 
 
 
半連接:類似于自然連接,但R???S?的連接的結(jié)果只是在?S?中有在公共屬性名字上相等的元組所有的R?中的元組,而R?S剛好相反。
還是以前面的“學(xué)生借書信息”和“學(xué)生會(huì)信息”為例:
 R???S:
 
| 學(xué)號(hào) | 書名 | 借出時(shí)間 | 
| 1 | 數(shù)據(jù)庫 | 2012.1.2 | 
R ? S:
| 學(xué)號(hào) | 學(xué)生會(huì) | 
| 1 | 科技部 | 
 
 
聚集函數(shù):求一組值的統(tǒng)計(jì)信息,返回單一值。使用聚集的集合可以是多重集,即一個(gè)值可以重復(fù)出現(xiàn)多次。如果想去除重復(fù)值,可以用連接符“-”將“distinct”附加在聚集函數(shù) 名后,如sum-distinct。
聚集函數(shù)包括:
sum:求和。例如求001號(hào)學(xué)生的總成績(jī):sumscore(σs#=001(SC))
avg:求平均數(shù)。
count:計(jì)數(shù)。
max:求最大值。
min:求最小值。
聚集函數(shù)可以使用分組,將一個(gè)元組集合分為若干個(gè)組,在每個(gè)分組上使用聚集函數(shù)。它的形式是:屬性下標(biāo)G聚集函數(shù)屬性下標(biāo)(關(guān)系)。例如
“學(xué)號(hào)G avg分?jǐn)?shù)(成績(jī)表)”得到每個(gè)學(xué)生的平均成績(jī)。
分組運(yùn)算G的一般形式是:G1,G2,...,GnGF1(A1),F2(A2),...,Fm(Am)(E)。在關(guān)系表達(dá)式E里,所有在G1,G2,...,Gn上相等的元組分成一組,分別在屬性A1上執(zhí)行F1,屬性A2上執(zhí)行F2,…,屬性Am上執(zhí)行Fm。
 
 
第四章 結(jié)構(gòu)化查詢語言
SQL可以分為兩類:數(shù)據(jù)操作語言(Data Manipulation Language,DML)和數(shù)據(jù)定義語言(Data Definition Language,DDL)。
DML由查詢和更新命令組成:
- SELECT:從數(shù)據(jù)庫中取出數(shù)據(jù)。
- UPDATE:更新數(shù)據(jù)庫的數(shù)據(jù)。
- DELETE:從數(shù)據(jù)庫中刪除數(shù)據(jù)。
- INSERT INTO:向數(shù)據(jù)庫插入新數(shù)據(jù)。
DDL創(chuàng)建和刪除數(shù)據(jù)庫、創(chuàng)建和刪除表、定義索引(關(guān)鍵字)、指定表之間的聯(lián)系、定義表之間的約束。SQL里最重要的DDL的語句有:
- CREATE DATABASE:創(chuàng)建一個(gè)新的數(shù)據(jù)庫
- ALTER DATABASE:修改一個(gè)數(shù)據(jù)庫。
- CREATE TABLE?:創(chuàng)建一張新的表。
- ALTER TABLE?:修改一張表。
- DROP TABLE?:刪除一張表。
- CREATE INDEX?:創(chuàng)建一個(gè)索引。
- DROP INDEX?:刪除一個(gè)索引。
 用SELECT進(jìn)行查詢時(shí),可以會(huì)有重復(fù)的記錄。使用DISTINCT語句可以消除重復(fù)數(shù)據(jù)。比如:select distinct name from persons。使用WHERE可以指定查詢的目標(biāo),比如:select * from persons where age >= 18。
 
| = | Equal | 
| <> | Not equal | 
| > | Greater than | 
| < | Less than | 
| >= | Greater than or equal | 
| <= | Less than or equal | 
| BETWEEN | Between an inclusive range | 
| LIKE | Search for a pattern | 
| IN | To specify multiple possible values for a column | 
Note:?In some versions of SQL the <> operator may be written as !=
 IN的語法是
 
FROM table_name
WHERE column_name IN (value1,value2,...)
 
 
BETWEEN的語法是:
SELECT column_name(s)FROM table_name
WHERE column_name
BETWEEN value1 AND value2
在對(duì)字符串比較時(shí),需要用單引號(hào)包圍字符串常量(多數(shù)據(jù)數(shù)據(jù)庫系統(tǒng)也接受雙引號(hào)),數(shù)值不應(yīng)該使用綽號(hào)。
 LIKE比較時(shí)可以使用的通配符有:
 
| % | A substitute for zero or more characters | 
| _ | A substitute for exactly one character | 
| [charlist] | Any single character in charlist | 
| [^charlist] or [!charlist] | Any single character not in charlist | 
 在進(jìn)行條件判斷時(shí),可以使用AND和OR來連接邏輯表達(dá)式。
 
 
 
可以使用ORDER BY對(duì)查詢的結(jié)果進(jìn)行排序,它的語法為
 SELECT column_name(s)
 
 FROM table_name
 
ORDER BY column_name(s) ASC|DESC
 在mysql里,可以使用LIMIT子句來定義查詢結(jié)果的最大數(shù)量。?比如:select * from persons order by age limit 1。會(huì)看到年紀(jì)最小的人。在SQL Server里等價(jià)的語句是
 
FROM table_name
注意limit和top都不是SQL標(biāo)準(zhǔn)。
 INSERT用來插入數(shù)據(jù),語法為:
 
VALUES (value1, value2, value3,...)
The second form specifies both the column names and the values to be inserted:
INSERT INTO table_name (column1, column2, column3,...)VALUES (value1, value2, value3,...)
UPDATE更新數(shù)據(jù),語法為:
UPDATE table_nameSET column1=value, column2=value2,...
WHERE some_column=some_value
DELETE刪除表示的行,語法為:
DELETE FROM table_nameWHERE some_column=some_value
 
 
SELECT column_name(s)
FROM table_name
AS alias_name
 
 
SQL里的連接
- JOIN:自然連接;
 
- LEFT JOIN:左外連接;
- RIGHT JOIN:右外連接;
- FULL JOIN:全外連接。
 
INNER JOIN?語法
SELECT column_name(s)FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name
LEFT JOIN?語法
SELECT column_name(s)FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
 
 
 RIGHT JOIN 語法
 
 
SELECT column_name(s)FROM table_name1
RIGHT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
FULL JOIN 語法
SELECT column_name(s)FROM table_name1
FULL JOIN table_name2
ON table_name1.column_name=table_name2.column_name
UNION?求并集,語法為:
SELECT column_name(s) FROM table_name1UNION
SELECT column_name(s) FROM table_name2
Note:?The UNION operator selects only distinct values by default. To allow duplicate values, use UNION ALL.
UNION ALL保留重復(fù)的記錄:
SELECT column_name(s) FROM table_name1UNION ALL
SELECT column_name(s) FROM table_name2
SELECT INTO 可以把查詢結(jié)果寫入一張表里
 
 We can select all columns into the new table:
SELECT *INTO new_table_name [IN externaldatabase]
FROM old_tablename
Or we can select only the columns we want into the new table:
SELECT column_name(s)INTO new_table_name [IN externaldatabase]
FROM old_tablename
CREATE DATABASE 語法
CREATE DATABASE database_nameCREATE TABLE 語法
 
 CREATE TABLE table_name(
column_name1 data_type,
column_name2 data_type,
column_name3 data_type,
....
)
SQL約束
約束限定可以插入表的數(shù)據(jù)的類型。它可以在表創(chuàng)建(CREATE TABLE)時(shí)指定,也可以在表創(chuàng)建手(用ALTER TABLE)指定。常用的約束有:
- NOT NULL
- UNIQUE
- PRIMARY KEY
- FOREIGN KEY
- CHECK
- DEFAULT
NOT NULL約束強(qiáng)制某一列不接受NULL值。比如:
CREATE TABLE Persons(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
 
 
UNIQUE約束保證某列沒有重復(fù)記錄。在mysql中可以在創(chuàng)建表時(shí)有兩種方法指定:
CREATE TABLE Persons(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (P_Id)
)
或: CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
)
注意第二種方式可以同時(shí)指定多列,只有在這些列上都相等的記錄才視為重復(fù)。
在表創(chuàng)建后加入U(xiǎn)NIQUE約束的方法是:
ALTER TABLE PersonsADD UNIQUE (P_Id)
 或
 
ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
 注意:如果該列中已經(jīng)有重復(fù)的記錄,那么加入約束會(huì)失敗
 
 
刪除UNIQUE約束:
ALTER TABLE PersonsDROP INDEX uc_PersonID
創(chuàng)建PRIMARY KEY約束:
CREATE TABLE Persons(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)
修改表來加入PRIMARY KEY約束:
ALTER TABLE PersonsADD PRIMARY KEY (P_Id)
或
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
刪除PRIMARY KEY約束:
ALTER TABLE PersonsDROP PRIMARY KEY
創(chuàng)建外鍵?FOREIGN KEY:
CREATE TABLE Orders(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
)
修改表以創(chuàng)建FOREIGN KEY?:
ALTER TABLE OrdersADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id) 或
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
刪除FOREIGN KEY約束:
ALTER TABLE OrdersDROP FOREIGN KEY fk_PerOrders
 
 
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (P_Id>0)
)
 或
 
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
)
修改表以創(chuàng)建CHECK約束:
ALTER TABLE PersonsADD CHECK (P_Id>0)
 或
 
ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
 
 
刪除CHECK約束:
ALTER TABLE PersonsDROP CONSTRAINT chk_Person
 或
 
DROP CHECK chk_Person
創(chuàng)建DEFAULT約束:
My SQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)
修改表以創(chuàng)建DEFAULT約束:
ALTER TABLE PersonsALTER City SET DEFAULT 'SANDNES'
 或
 
ALTER COLUMN City SET DEFAULT 'SANDNES'
 
 
刪除DEFAULT約束:
ALTER TABLE PersonsALTER City DROP DEFAULT
創(chuàng)建AUTO INCREMENT約束,它只能作用在主鍵上:
CREATE TABLE Persons(
P_Id int NOT NULL?AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)
我們可以設(shè)置自增的起始值:
ALTER TABLE Persons AUTO_INCREMENT=100
Indexes
 索引用來提高數(shù)據(jù)查找的效率,用戶看不到索引的存在。注意:使用索引會(huì)使更新表的速度變慢,因?yàn)閿?shù)據(jù)更新的同時(shí)還要更新索引。
 
在表上創(chuàng)建一個(gè)允許重復(fù)值的索引:
CREATE INDEX index_nameON table_name (column_name)
在表上創(chuàng)建唯一的索引:
CREATE UNIQUE INDEX index_nameON table_name (column_name)
刪除INDEX:
ALTER TABLE table_name DROP INDEX index_name 
 
 一個(gè)表上的約束可以通過SHOW INDEX FROMtbl_name來查看。mysql上可以通過修改一個(gè)列來增加約束:
 
ALTER TABLE t1 MODIFY col1 BIGINT UNSIGNED DEFAULT 1 COMMENT 'my column'; ALTER TABLE t1 CHANGE b b BIGINT NOT NULL; 但是要?jiǎng)h除約束只能使用前面所述的drop ...的方式。
 
 
DROP TABLE?刪除一張表:
DROP TABLE table_name 
 
DROP DATABASE?刪除一個(gè)數(shù)據(jù)庫:
DROP DATABASE database_name 
 
TRUNCATE TABLE可以刪除一張表的所有數(shù)據(jù)而不刪除該表:
TRUNCATE TABLE table_name 
 
ALTER TABLE 可以修改一張表:
增加一列:ALTER TABLE table_name
ADD column_name datatype
 刪除一列:
 
DROP COLUMN column_name
 修改一列:
 
ALTER TABLE t1 MODIFY col1 BIGINT UNSIGNED DEFAULT 1 COMMENT 'my column';ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;
 
 
視圖是基于一個(gè)SQL語句的結(jié)果集的一張?zhí)摂M表。視圖的優(yōu)點(diǎn)有:
提供了邏輯數(shù)據(jù)獨(dú)立性。當(dāng)數(shù)據(jù)的邏輯結(jié)構(gòu)發(fā)生改變時(shí),原有的應(yīng)用程序不用修改。
簡(jiǎn)化了用戶觀點(diǎn)。用戶只需用到數(shù)據(jù)庫中的一部分,視圖適應(yīng)了用戶需要。
數(shù)據(jù)的安全保護(hù)功能。針對(duì)不同用戶定義不同視圖。
 
 
 創(chuàng)建視圖:
 
SELECT column_name(s)
FROM table_name
WHERE condition
更新視圖: CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
刪除視圖 :
DROP VIEW view_name
 
 
 MySQL的日期函數(shù):
 
| NOW() | Returns the current date and time | 
| CURDATE() | Returns the current date | 
| CURTIME() | Returns the current time | 
| DATE() | Extracts the date part of a date or date/time expression | 
| EXTRACT() | Returns a single part of a date/time | 
| DATE_ADD() | Adds a specified time interval to a date | 
| DATE_SUB() | Subtracts a specified time interval from a date | 
| DATEDIFF() | Returns the number of days between two dates | 
| DATE_FORMAT() | Displays date/time data in different formats | 
 
 
MySQL日期數(shù)據(jù)類型
- DATE - format YYYY-MM-DD
- DATETIME - format: YYYY-MM-DD HH:MM:SS
- TIMESTAMP - format: YYYY-MM-DD HH:MM:SS
- YEAR - format YYYY or YY
 
 
WHERE Address IS NULL
 
 
 IS NOT NULL?操作符判斷非空值:
 
WHERE Address IS NOT NULL
 MySQL沒有ISNULL函數(shù),所以它使用IFNULL:
 
FROM Products
或COALESCE()函數(shù):
SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0))FROM Products
 
 
MySQL數(shù)據(jù)類型
MySQL有三種主要類型:text, number和Date/Time。
Text types:
| CHAR(size) | Holds a fixed length string (can contain letters, numbers, and special characters). The fixed size is specified in parenthesis. Can store up to 255 characters | 
| VARCHAR(size) | Holds a variable length string (can contain letters, numbers, and special characters). The maximum size is specified in parenthesis. Can store up to 255 characters.Note:?If you put a greater value than 255 it will be converted to a TEXT type | 
| TINYTEXT | Holds a string with a maximum length of 255 characters | 
| TEXT | Holds a string with a maximum length of 65,535 characters | 
| BLOB | For BLOBs (Binary Large OBjects). Holds up to 65,535 bytes of data | 
| MEDIUMTEXT | Holds a string with a maximum length of 16,777,215 characters | 
| MEDIUMBLOB | For BLOBs (Binary Large OBjects). Holds up to 16,777,215 bytes of data | 
| LONGTEXT | Holds a string with a maximum length of 4,294,967,295 characters | 
| LONGBLOB | For BLOBs (Binary Large OBjects). Holds up to 4,294,967,295 bytes of data | 
| ENUM(x,y,z,etc.) | Let you enter a list of possible values. You can list up to 65535 values in an ENUM list. If a value is inserted that is not in the list, a blank value will be inserted. Note:?The values are sorted in the order you enter them. You enter the possible values in this format:ENUM('X','Y','Z') | 
| SET | Similar to ENUM except that SET may contain up to 64 list items and can store more than one choice | 
 
 
Number types:
| TINYINT(size) | -128 to 127 normal. 0 to 255 UNSIGNED*. The maximum number of digits may be specified in parenthesis | 
| SMALLINT(size) | -32768 to 32767 normal. 0 to 65535 UNSIGNED*. The maximum number of digits may be specified in parenthesis | 
| MEDIUMINT(size) | -8388608 to 8388607 normal. 0 to 16777215 UNSIGNED*. The maximum number of digits may be specified in parenthesis | 
| INT(size) | -2147483648 to 2147483647 normal. 0 to 4294967295 UNSIGNED*. The maximum number of digits may be specified in parenthesis | 
| BIGINT(size) | -9223372036854775808 to 9223372036854775807 normal. 0 to 18446744073709551615 UNSIGNED*. The maximum number of digits may be specified in parenthesis | 
| FLOAT(size,d) | A small number with a floating decimal point. The maximum number of digits may be specified in the size parameter. The maximum number of digits to the right of the decimal point is specified in the d parameter | 
| DOUBLE(size,d) | A large number with a floating decimal point. The maximum number of digits may be specified in the size parameter. The maximum number of digits to the right of the decimal point is specified in the d parameter | 
| DECIMAL(size,d) | A DOUBLE stored as a string , allowing for a fixed decimal point. The maximum number of digits may be specified in the size parameter. The maximum number of digits to the right of the decimal point is specified in the d parameter | 
*The integer types have an extra option called UNSIGNED. Normally, the integer goes from an negative to positive value. Adding the UNSIGNED attribute will move that range up so it starts at zero instead of a negative number.
Date types:
| DATE() | A date. Format: YYYY-MM-DD Note:?The supported range is from '1000-01-01' to '9999-12-31' | 
| DATETIME() | *A date and time combination. Format: YYYY-MM-DD HH:MM:SS Note:?The supported range is from '1000-01-01 00:00:00' to '9999-12-31 23:59:59' | 
| TIMESTAMP() | *A timestamp. TIMESTAMP values are stored as the number of seconds since the Unix epoch ('1970-01-01 00:00:00' UTC). Format: YYYY-MM-DD HH:MM:SS Note:?The supported range is from '1970-01-01 00:00:01' UTC to '2038-01-09 03:14:07' UTC | 
| TIME() | A time. Format: HH:MM:SS Note:?The supported range is from '-838:59:59' to '838:59:59' | 
| YEAR() | A year in two-digit or four-digit format. Note:?Values allowed in four-digit format: 1901 to 2155. Values allowed in two-digit format: 70 to 69, representing years from 1970 to 2069 | 
 
 
 
 
SQL聚集函數(shù)計(jì)算某列的各值,返回單一值。
 有用的集體函數(shù)有:
 
- AVG() -平均數(shù)
- COUNT() -計(jì)數(shù)
- FIRST() -第一個(gè)值
- LAST() -最后一個(gè)值
- MAX() -最大值
- MIN() -最小值
- SUM() -求和
這些函數(shù)會(huì)計(jì)算重復(fù)值,可以使用DISTINCT來消除重復(fù),比如:select sum(distinct?age) from persons。
 結(jié)果也可以用AS來起別名,比如select sum(age) as MySum from persons。
 
 
 
 在MySql里沒有first和last,所以
 
等價(jià)于:
SELECT OrderPrice FROM Orders ORDER BY O_Id LIMIT 1
SELECT LAST(OrderPrice) AS LastOrderPrice FROM Orders
 等價(jià)于:
 
 
 
GROUP BY可以根據(jù)記錄在某列上的值把表的記錄分組,然后分別計(jì)算各組的聚集函數(shù)的值。它也能指定多個(gè)列比如:
SELECT Customer,OrderDate,SUM(OrderPrice) FROM OrdersGROUP BY?Customer,OrderDate
HAVING可以在查詢時(shí)使用一個(gè)聚集函數(shù)來指定條件,它之前必須可以有g(shù)roup by修飾:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
 
 
Having與WHERE的區(qū)別是:
where決定哪些元組被選擇參加運(yùn)算,作用于關(guān)系中的元組;
Having決定哪些分組符合要求,作用于分組;
 聚集函數(shù)的條件關(guān)系必須用Having,Where不應(yīng)該出現(xiàn)聚集函數(shù)。
 
 
 
SQL標(biāo)量函數(shù)基于輸入值返回單個(gè)值。有用的標(biāo)量函數(shù)有:
- UCASE() -轉(zhuǎn)換成大寫。
- LCASE() - 轉(zhuǎn)換成小寫。
- MID() - 抽取子字符串。
- LEN() - 得到字符串的長(zhǎng)度。
- ROUND() - 舍取一個(gè)小數(shù)。
- NOW() - 返回當(dāng)前日期和時(shí)間。
- FORMAT() - 格式化顯示。
 SQL UCASE() 語法
 
 
SELECT UCASE(column_name) FROM table_name
 
SQL MID() 語法
SELECT MID(column_name,start[,length]) FROM table_nameSQL ROUND() 語法
SELECT ROUND(column_name,decimals) FROM table_nameSQL FORMAT() 語法
SELECT FORMAT(column_name,format) FROM table_name| column_name | Required. The field to be formatted. | 
| format | Required. Specifies the format. | 
 
 
 參考:http://www.w3schools.com/sql
 
 
 
第五章 數(shù)據(jù)庫設(shè)計(jì)
軟件工程與軟件生命周期
軟件生存期是指從軟件的規(guī)劃、研制、實(shí)現(xiàn)、測(cè)試、投入運(yùn)行后的維護(hù),直到它被新的軟件所取代而停止使用的整個(gè)歷程。
 
 
數(shù)據(jù)庫工程與數(shù)據(jù)庫生存期
數(shù)據(jù)庫應(yīng)用系統(tǒng)從規(guī)劃、設(shè)計(jì)、實(shí)現(xiàn)、測(cè)試、運(yùn)行中的維護(hù)到最后被新的系統(tǒng)取代而停止使用的整個(gè)期間,稱為數(shù)據(jù)庫生存期。它包括規(guī)劃、需求分析、概念設(shè)計(jì)、邏輯設(shè)計(jì)、物理設(shè)計(jì)、實(shí)現(xiàn)、運(yùn)行和維護(hù)。
 
 
數(shù)據(jù)庫設(shè)計(jì)的輸入輸出
輸入:總體信息需求、處理需求、DBMS的特征、硬件和OS特征。
輸出:完整的數(shù)據(jù)庫結(jié)構(gòu)、基于數(shù)據(jù)庫結(jié)構(gòu)和處理需求的應(yīng)用程序設(shè)計(jì)原則。
 
 
數(shù)據(jù)庫設(shè)計(jì)的階段劃分
規(guī)劃階段:系統(tǒng)調(diào)查、可行性分析、確定數(shù)據(jù)庫系統(tǒng)的總目標(biāo)和制定項(xiàng)目開發(fā)計(jì)劃。
需求分析階段:分析用戶活動(dòng),產(chǎn)生業(yè)務(wù)流程圖;確定系統(tǒng)范圍,產(chǎn)生系統(tǒng)范圍圖;分析用戶活動(dòng)設(shè)計(jì)的數(shù)據(jù),產(chǎn)生數(shù)據(jù)流圖;分析系統(tǒng)數(shù)據(jù),產(chǎn)生數(shù)據(jù)字典。
概念設(shè)計(jì)階段:進(jìn)行數(shù)據(jù)抽象,設(shè)計(jì)局部概念模式;將局部概念模式綜合成全局概念模式。
邏輯設(shè)計(jì)階段:從之前得到的概念模式出發(fā),1、導(dǎo)出初始DBMS模式說明;2、子模式設(shè)計(jì)和應(yīng)用程序設(shè)計(jì)草圖;3、模式評(píng)價(jià);4,如果處理結(jié)束,則進(jìn)入物理設(shè)計(jì)階段,否則進(jìn)入下一步;5、檢查模式是否需要修正,如果需要?jiǎng)t修正模式,并回到第2步,否則回到前面的階段。
物理設(shè)計(jì)階段:存儲(chǔ)記錄結(jié)構(gòu)設(shè)計(jì);確定數(shù)據(jù)存放位置;存取方法的設(shè)計(jì);完整性和安全性考慮;程序設(shè)計(jì)。
數(shù)據(jù)庫實(shí)現(xiàn):定義數(shù)據(jù)庫結(jié)構(gòu);數(shù)據(jù)裝載(大型應(yīng)用和小型應(yīng)用);編制和調(diào)試應(yīng)用程序;數(shù)據(jù)庫試運(yùn)行。
數(shù)據(jù)庫的運(yùn)行與維護(hù):數(shù)據(jù)庫的轉(zhuǎn)儲(chǔ)和恢復(fù);數(shù)據(jù)安全性、完整性控制;數(shù)據(jù)庫性能的監(jiān)督,分析和改進(jìn);數(shù)據(jù)庫的重組織和重構(gòu)造。
 
 
之前所述的總體信息需求在需求分析和概念設(shè)計(jì)中被使用;處理需求在需要分析、邏輯設(shè)計(jì)、物理設(shè)計(jì)階段中都有使用;DBMS特征在邏輯設(shè)計(jì)和物理設(shè)計(jì)階段中被使用;硬件和OS特征只在物理設(shè)計(jì)階段被使用。
 
 
 第六章 關(guān)系數(shù)據(jù)庫的規(guī)范化理論
 
問題的提出
設(shè)有關(guān)系模式R(姓名,電話,參與的俱樂部,俱樂部的活動(dòng)),候選碼為(姓名,參與的俱樂部)。
 
 
| 姓名 | 電話 | 參與的俱樂部 | 俱樂部的活動(dòng) | 
| A | 123 | 乒乓club | 打乒乓球 | 
| A | 123 | 登山club | 爬山 | 
| B | 456 | 乒乓club | 打乒乓球 | 
| B | 456 | 英語club | 學(xué)習(xí)英語 | 
| C | 789 | 登山club | 爬山 | 
| C | 789 | 英語club | 學(xué)習(xí)英語 | 
注意到上面的模式有什么問題?
1、數(shù)據(jù)冗余:一個(gè)人參與幾個(gè)俱樂部,那么他的電話會(huì)重復(fù)幾次;同樣,一個(gè)俱樂部被幾個(gè)人參加,它的活動(dòng)就會(huì)重復(fù)幾次。
2、修改異常:一旦一個(gè)人的手機(jī)號(hào)變化,那么對(duì)應(yīng)于他參與的每個(gè)俱樂部的各行里的電話都需要修改,如果有遺漏,那么會(huì)造成數(shù)據(jù)不一致;俱樂部的活動(dòng)也是如此。
3、插入異常:如果一個(gè)新人到來,還未參加任何俱樂部,那么他的信息和電話就無法插入到這張表里,因?yàn)閰⑴c的俱樂部是主屬性,不能為空。
4、刪除異常:如果某人暫時(shí)退出了所有的俱樂部,那么必須把所有的元組都刪去,這樣這個(gè)人的姓名和電話信息也不存在了。
 
 
問題的解決方式是把關(guān)系模式R分解成三個(gè)模式:
| 姓名 | 電話 | 
| A | 123 | 
| B | 456 | 
| C | 789 | 
| 俱樂部 | 活動(dòng) | 
| 乒乓club | 打乒乓球 | 
| 英語club | 學(xué)習(xí)英語 | 
| 登山club | 爬山 | 
| 姓名 | 參與的俱樂部 | 
| A | 乒乓club | 
| A | 登山club | 
| B | 乒乓club | 
| B | 英語club | 
| C | 登山club | 
| C | 英語club | 
 
 
 函數(shù)依賴(FD,Functional Dependency)
 
實(shí)際上關(guān)系模式的更新異常是由屬性間的數(shù)據(jù)依賴引起的,數(shù)據(jù)依賴指數(shù)據(jù)之間存在著某種內(nèi)在的聯(lián)系,如姓名和電話之間,每一個(gè)人都有一個(gè)確定的電話,姓名的一個(gè)取值可以確定唯一的地址。
函數(shù)依賴的概念為:設(shè)有關(guān)系模式R(U),X和Y是屬性集U的子集,函數(shù)依賴是形為X→Y的一個(gè)命題,只要有r是R的當(dāng)前關(guān)系,對(duì)r中的任意兩個(gè)元組t和s,都有t[X] = s[X]蘊(yùn)涵t[Y] = s[Y],那么稱函數(shù)依賴X→Y在關(guān)系模式R(U)中成立。比如前面的U是(姓名,電話,參與的俱樂部,俱樂部的活動(dòng)),子集X為(姓名),子集Y為(電話)。
 函數(shù)依賴的文字化定義:設(shè)R(U)是屬性集U上的關(guān)系模式,X、Y是U的子集,若對(duì)于R(U)的任意一個(gè)可能的關(guān)系r,R中不可能存在兩個(gè)元組在X的屬性值上相等,而在Y上的屬性值不等,則稱“X函數(shù)確定Y”,或“Y函數(shù)依賴于X”,記作X→Y。例如姓名→電話。
 
FD的推理規(guī)則有:
基本規(guī)則:
1、自反性:Y?X???X?→Y
2、增廣性:XZ?→YZ
3、傳遞性:X?→Y, Y?→Z???X?→Z
擴(kuò)展規(guī)則:
4、合并性:{X?→Y, X?→Z}???X?→YZ
5、分解性:{X?→Y, Z ? Y}???X?→Z
6、偽傳遞性:{X?→Y, WY?→Z}???WX?→Z
 7、復(fù)合性:{X?→Y, W?→Z}???WX?→YZ
 
 
 
函數(shù)依賴的性質(zhì)有:
1、若X→Y,但X ? Y,則稱X→Y是非平凡的函數(shù)依賴,一般不特殊指明的情況下,我們總是討論非平凡函數(shù)依賴。
2、若X→Y,則稱X是決定因素。
3、若Y不函數(shù)依賴于X,則記作X?Y
4、若X→Y,Y→X,則稱X與Y一一對(duì)應(yīng),記為X?Y。
在R(U)中,如果X→Y,并且對(duì)于X的任意一個(gè)真子集X',都有X'?Y,則稱Y完全函數(shù)依賴于X,或Y對(duì)X完全函數(shù)依賴,記作X-f->Y,否則稱Y對(duì)X部分函數(shù)依賴,X-p->Y。
在關(guān)系模式R(U)中,如果X→Y,(X ? Y),Y→Z,則稱Z對(duì)X傳遞函數(shù)依賴。
設(shè)K為R<u,f>中的屬性或?qū)傩越M,若K-f->u,則K為R的候選碼,若候選碼多于一個(gè),則選其中一個(gè)作為主碼。特殊情況:所有屬性構(gòu)成碼,稱為全碼。包含在任何一個(gè)候選碼中的屬性,叫主屬性(Prime Attribute),不包含在任何碼中的屬性為非主屬性,或非碼屬性。
關(guān)系模式R中屬性或?qū)傩越MX并非R的主碼,但它是另一個(gè)關(guān)系模式的主碼,則稱X是R的外碼(Foreign Key)。關(guān)系間是通過主碼和外碼進(jìn)行聯(lián)系的。
 
 
規(guī)范化理論
1971年起E.F.Codd提出了規(guī)范化理論。該理論按屬性間的依賴情況(如函數(shù)依賴)規(guī)范關(guān)系模式。按規(guī)范化的程度不同分為第一范式1NF(Normal Form)、2NF、3NF、BCNF及4NF,逐步消除更新異常問題。
若R屬于第幾范式,一般記為R∈XNF,一個(gè)低一級(jí)范式的關(guān)系模式,通過模式分解總可以將它分解為若干個(gè)高一級(jí)范式的關(guān)系模式的結(jié)合,這種過程就叫規(guī)范化。
設(shè)有關(guān)系模式R(U),屬性集為U,R1、……、Rk都是U的子集,并且有R1∪R2∪……∪Rk=U。關(guān)系模式R1,……,Rk的集合用ρ={R1,……,Rk}。用ρ代替R的過程為關(guān)系模式的分解。
 
 
1NF指每一個(gè)分量都是不可分的,這是最基本的規(guī)范化。即關(guān)系的所有屬性都只能是預(yù)定義的簡(jiǎn)單變量,如整型,而不能是結(jié)構(gòu)體。
2NF的定義為:如果R∈1NF,且每個(gè)非主屬性完全函數(shù)依賴于碼,則R∈2NF。如本章最開始提出的問題,在屬性性(姓名,電話,參與的俱樂部,俱樂部的活動(dòng))里,候選碼為(姓名,參與的俱樂部),即姓名和參與的俱樂部是主屬性,但是“電話”部分函數(shù)依賴于“姓名”,并沒有完全函數(shù)依賴于碼;“俱樂部的活動(dòng)”同樣也部分函數(shù)依賴于“俱樂部”。它便是由于違反了2NF,才造成了更新異常。而表的拆分便是關(guān)系模式的分解。
3NF的定義:關(guān)系模式R<U,F>中若不存在這樣的碼X,屬性組Y及非主屬性Z(Z?Y),便利X→Y,Y→Z成立,則稱R∈3NF。
比如關(guān)系
| 員工 | 所在分公司 | 分公司總裁 | 
其中“員工”是主碼,員工→所在分公司,所在分公司→分公司總裁。所以它違反了3NF。它造成的問題有修改異常:員工換了分公司的話,總裁屬性也必須修改。遺漏會(huì)造成數(shù)據(jù)不一致。我們可以把它模式分解為:
| 員工 | 所在分公司 | 
| 分公司 | 總裁 | 
2NF、3NF有一個(gè)缺陷:它們只限制了主碼對(duì)非主屬性的部分函數(shù)依賴或傳遞函數(shù)依賴,但并沒有對(duì)主屬性進(jìn)行限制。
比如
| 學(xué)號(hào) | 姓名 | 課程名 | 
假定姓名沒有重名的,那么(學(xué)號(hào),課程名)和(姓名,課程名)都可以是候選鍵,也就是說三個(gè)屬性都是主屬性。如果我們選取(學(xué)號(hào),課程名)作為主碼,有(學(xué)號(hào),姓名)→學(xué)號(hào),學(xué)號(hào)→姓名的傳遞依賴,也可以理解為部分依賴,但是因?yàn)樾彰侵鲗傩?#xff0c;所以這個(gè)關(guān)第符合2NF、3NF。然而,它有之前討論過的冗余和更新異常的問題。
BCNF(Boyce Codd Normal Form)是由Boyce和Codd提出的,比3NF又進(jìn)一步,通常認(rèn)為BCNF是修正的第三范式,有時(shí)也稱為3NF。它的定義為:如果關(guān)系模式R是1NF,且每個(gè)屬性(包括主屬性)都不傳遞依賴于R的候選鍵,那么稱R是BCNF范式。若R∈BCNF,則R∈3NF。
 
 
范式是衡量關(guān)系模式好壞的標(biāo)準(zhǔn),它與數(shù)據(jù)依賴有著直接的聯(lián)系。1NF是關(guān)系模式的基礎(chǔ)(對(duì)象模式違背了1NF),2NF已經(jīng)稱為歷史,3NF和BCNF是最為常見的范式。
 
 
第七章 數(shù)據(jù)存儲(chǔ)
 
 
物理存儲(chǔ)媒介的分類
高速緩沖區(qū):現(xiàn)今的AMD和Intel的CPU都在芯片內(nèi)部集成了數(shù)據(jù)高速緩存和指令高速緩存,通稱了L1高速緩存;比L1更大的L2高速緩存曾放在CPU外部的主板或CPU接口上,現(xiàn)在已經(jīng)成為CPU內(nèi)部的標(biāo)準(zhǔn)部件了;高端家用機(jī)或工作站甚至配備了L3緩存器。高速緩存使用靜態(tài)隨機(jī)存取存儲(chǔ)器(StaticRandomAccessMemory,?SRAM)技術(shù),比主存的DRAM技術(shù)快。
 
 
主存儲(chǔ)區(qū):使用動(dòng)態(tài)隨機(jī)存取(Dynamic Random Access Memory,DRAM)技術(shù),性價(jià)比很高,擴(kuò)展性也不錯(cuò)。DRAM里面所儲(chǔ)存的數(shù)據(jù)需要周期性地更新,所以比SRAM較慢。最近生產(chǎn)的(2010年后)計(jì)算機(jī)主要使用的主存是DDR 3 SDRAM(第三代雙倍資料率同步動(dòng)態(tài)隨機(jī)存取內(nèi)存,Double-Data-Rate Three Synchronous Dynamic Random Access Memory)。
 
 
快擦寫存儲(chǔ)器:一種EEPROM芯片,EEPROM,或?qū)懽?strong>E2PROM,全稱電子抹除式可復(fù)寫只讀內(nèi)存?(Electrically-Erasable Programmable Read-Only Memory),是一種可以通過電子方式多次復(fù)寫的半導(dǎo)體存儲(chǔ)設(shè)備。相比EPROM(Erasable Programmable Read Only Memory,可擦除可編程式只讀內(nèi)存),EEPROM不需要用紫外線照射,也不需取下,就可以用特定的電壓,來抹除芯片上的信息,以便寫入新的數(shù)據(jù)。EEPROM被廣泛用于需要經(jīng)常擦除的BIOS芯片,以及快閃存儲(chǔ)器(Flash Memory,簡(jiǎn)稱閃存),并逐步替代部分有斷電保留需要的RAM芯片,甚至取代部份的硬盤功能(固態(tài)硬盤Solid State Disk、Solid State Drive,簡(jiǎn)稱SSD)。
磁盤存儲(chǔ)器:利用磁記錄技術(shù)在涂有磁記錄介質(zhì)的旋轉(zhuǎn)圓盤上進(jìn)行數(shù)據(jù)存儲(chǔ)的輔助存儲(chǔ)器。具有存儲(chǔ)容量大、數(shù)據(jù)傳輸率高、存儲(chǔ)數(shù)據(jù)可長(zhǎng)期保存等特點(diǎn)。
 
 
 光存儲(chǔ)器:由光盤驅(qū)動(dòng)器和光盤片組成的光盤驅(qū)動(dòng)系統(tǒng),光存儲(chǔ)技術(shù)是一種通過光學(xué)的方法讀寫數(shù)據(jù)的一種技術(shù),它的工作原理是改變存儲(chǔ)單元的某種性質(zhì)的反射率,反射光極化方向,利用這種性質(zhì)的改變來寫入存儲(chǔ)二進(jìn)制數(shù)據(jù).在讀取數(shù)據(jù)時(shí),光檢測(cè)器檢測(cè)出光強(qiáng)和極化方向等的變化,從而讀出存儲(chǔ)在光盤上的數(shù)據(jù).由于高能量激光束可以聚焦成約0.8μm的光束,并且激光的對(duì)準(zhǔn)精度高,因此它比硬盤等其他存儲(chǔ)技術(shù)具有較高的存儲(chǔ)容量.
 
 
 
磁帶:一種用于記錄聲音、圖像、數(shù)字或其他信號(hào)的載有磁層的帶狀材料,是產(chǎn)量最大和用途最廣的一種磁記錄材料。作為數(shù)字信息的存貯具有容量大、價(jià)格低的優(yōu)點(diǎn)。主要大量用于計(jì)算機(jī)的外存貯器。目前僅在專業(yè)設(shè)備上使用(比如車床控制機(jī))。
 
 
數(shù)據(jù)存儲(chǔ)文件的組織結(jié)構(gòu)
 堆文件:Heap File。插入的記錄被添加到文件的末尾,因此文件是無序的。記錄被刪除時(shí),會(huì)在文件中間留下空白行,所以堆文件需要周期性地壓縮來恢復(fù)空間。
 
順序文件:Sequential File。記錄以查找鍵的升序或降序的順序存儲(chǔ)。文件在載入到內(nèi)存里時(shí),可以以隨機(jī)方式讀取數(shù)組,比如可用二分查找法來優(yōu)化查找時(shí)間。但把新記錄寫入到文件時(shí),必須以順序方式。
散列文件:Hash File。記錄存儲(chǔ)的地址(塊號(hào))是記錄的某個(gè)屬性值通過散列函數(shù)求得的值。
聚集文件:Cluster File。“聚集(Clustering)”的意義是為了訪問的效率把相關(guān)的數(shù)據(jù)存儲(chǔ)在一起。多個(gè)數(shù)據(jù)庫和多上表被合并(join)被稱為聚集(cluster)。共享同一個(gè)聚集關(guān)鍵字的表被存儲(chǔ)在一起,在相同或相鄰的數(shù)據(jù)塊里。這樣可以提升表在聚集關(guān)鍵字上進(jìn)行的聚集操作的效率。
 
 
 第八章 索引機(jī)制
 
索引的概念:在數(shù)據(jù)文件中,根據(jù)記錄建立的一種數(shù)據(jù)結(jié)構(gòu),以次線性時(shí)間查找(sublinear time lookup)來加快查詢速度。索引也用來監(jiān)管數(shù)據(jù)庫約束,比如unique、exclusion、primary key和foreign key。
索引的架構(gòu)(Index architecture)
非簇集索引(Non-Clustered):數(shù)據(jù)以任意序表示,但索引指明了它的邏輯序(logical ordering)。數(shù)據(jù)行無視被索引的列的值而遍布在表中,但非簇集索引樹包含排好序的索引關(guān)鍵字,并在葉子級(jí)包含記錄的指針(頁結(jié)構(gòu)引擎(page-organized engines)里的頁和數(shù)據(jù)頁里的行號(hào);文件結(jié)構(gòu)引擎(file-organized engines)里的行偏移量)。
 在非簇集索引里,數(shù)據(jù)存儲(chǔ)的順序和索引不同。索引通常在join、where、和order by語句里使用的非主鍵列上創(chuàng)建。在一個(gè)數(shù)據(jù)庫表上,可以創(chuàng)建多個(gè)非簇集索引。
 
簇集索引(Clustered):數(shù)據(jù)塊以特定的順序聚集來匹配索引,導(dǎo)致行數(shù)據(jù)順序存儲(chǔ)。因此,一張表只能創(chuàng)建一個(gè)簇集索引。如果文件記錄以非碼字段排序,那么這個(gè)字段稱為簇集字段(cluster field)。
 有些數(shù)據(jù)庫把簇集索引和記錄分開存儲(chǔ)在不同文件里,而其它一些則把它們存儲(chǔ)在同一文件的不同數(shù)據(jù)塊里。簇集索引里包含有序的記錄,每個(gè)記錄包含兩人個(gè)字段。第一個(gè)字段和數(shù)據(jù)的簇集字段有相同的數(shù)據(jù)類型;第二個(gè)字段是一個(gè)指針。
 
當(dāng)數(shù)據(jù)以和簇集索引相同或相反的順序訪問,或選擇一個(gè)范圍里的數(shù)據(jù)時(shí),簇集索引可以大幅提升訪問速度。
 
 
索引的類型(Types of indexes)
 位圖索引(Bitmap index):一種特殊的索引,把它的大塊數(shù)據(jù)存儲(chǔ)在位數(shù)組(bit array)里,也就是位圖里。多數(shù)查詢都通過位邏輯操作來完成。如果索引的值不重復(fù)或只重復(fù)較少的次數(shù)時(shí),那么最普遍使用的索引,比如b+tree,是最高效的。相反,位圖索引被設(shè)計(jì)用在變量值頻繁重復(fù)的情況下。比如只有“男”和“女”的性別屬性。
 
稠密索引(Dense index):數(shù)據(jù)文件里的每個(gè)記錄所對(duì)應(yīng)的“關(guān)鍵字-指針”對(duì)所組成的文件。也就是說,數(shù)據(jù)文件里每個(gè)記錄都有索引。在有重復(fù)關(guān)鍵字的簇集索引里,稠密索引指向該關(guān)鍵字的第一條記錄。
 稀疏索引(Sparse index):或非稠密索引(nondense index)。數(shù)據(jù)文件里的每個(gè)塊都有相應(yīng)的“關(guān)鍵字-塊”對(duì)。在有重復(fù)關(guān)鍵字的簇集索引里,塊指針指向每個(gè)塊的最小的搜索鍵(lowest search key)。
 
逆索引(Reverse index):在把關(guān)鍵字插入到索引之前,把關(guān)鍵字翻轉(zhuǎn)。比如:值12345在索引里成為54321。它對(duì)于索引諸如序號(hào)(sequence number,單調(diào)增加的值)的值非常有用,特別是在大容量的事務(wù)處理系統(tǒng)(Transaction processing system)上,因?yàn)樗鼈兛梢詼p少索引塊的競(jìng)爭(zhēng)。
逆索引使用b-tree結(jié)構(gòu)實(shí)現(xiàn)。
 
 
主索引和輔索引
 主索引(Primary Key)建立在有序文件中的排序碼字段上。輔索引(Secondary Key)指定在文件的任何非排序字段上。同一個(gè)文件只能有一個(gè)主存取方式,但是可以有多個(gè)輔助索引,從而有多個(gè)索引字段。當(dāng)輔索引建立在碼上時(shí),該碼字段被稱為輔碼(Secondary Key)。
 
 
 
 索引文件的組織:線性索引、樹形索引和散列索引。
 
 
 
 第九章 并發(fā)控制和故障恢復(fù)
 
事務(wù)、并發(fā)控制的概念
事務(wù)(Transaction)是構(gòu)成單一邏輯工作單元的操作集合。
在多用戶在線共享系統(tǒng)中,許多事務(wù)可能同時(shí)對(duì)同一數(shù)據(jù)進(jìn)行操作,稱為并發(fā)操作。并發(fā)可能導(dǎo)致的問題有:丟失更新問題、讀脹數(shù)據(jù)問題、錯(cuò)誤求和問題、和不可重復(fù)讀問題等等。
并發(fā)控制負(fù)責(zé)協(xié)調(diào)并發(fā)事務(wù)的執(zhí)行,保證數(shù)據(jù)庫的完整性,同時(shí)避免用戶得到不正確的數(shù)據(jù)。
 
 
事務(wù)的基本屬性
原子性(Atomicity):一個(gè)事務(wù)對(duì)數(shù)據(jù)庫的所有操作,是一個(gè)不可分割的工作單元。這些操作要么全部執(zhí)行,要么什么也不做。
一致性(Consistency):一個(gè)事務(wù)獨(dú)立執(zhí)行的結(jié)果,應(yīng)保持?jǐn)?shù)據(jù)庫的一致性,即數(shù)據(jù)不會(huì)因事務(wù)的執(zhí)行而遭到破壞。
隔離性(Isolation):在多個(gè)事務(wù)并發(fā)執(zhí)行時(shí),系統(tǒng)應(yīng)保證與這些事務(wù)先后獨(dú)立執(zhí)行的結(jié)果一樣。
持久性(Durability):一個(gè)事務(wù)一旦完成全部操作后,他對(duì)數(shù)據(jù)庫的所有更新應(yīng)永久地反映在數(shù)據(jù)庫中。
這些屬性的首字母縮寫為ACID。其中原子性是最主要的根本目標(biāo);其它三個(gè)是輔助的屬性。
 
 
 第十章 數(shù)據(jù)庫完整性機(jī)制
 
數(shù)據(jù)庫完整性的概念
與關(guān)系數(shù)據(jù)庫的完整性不同,數(shù)據(jù)庫完整性表示數(shù)據(jù)的正確性(accurate)、有效性(valid)和相容性(consistent),防止錯(cuò)誤的數(shù)據(jù)進(jìn)入數(shù)據(jù)庫。
正確性指數(shù)據(jù)的合法性;
有效性指數(shù)據(jù)是否屬于所定義的有效范圍;
相容性指表示同一事實(shí)的兩個(gè)數(shù)據(jù)應(yīng)相同。
在對(duì)數(shù)據(jù)庫提交修改前,必須要滿足所應(yīng)用的完整性約束(Integrity constraints)和數(shù)據(jù)驗(yàn)證(Data validation)。
完整性除了在第三章所述的實(shí)體完整性(Entity Integrity)、參照完整性(Referential Integrity)、和用戶定義完整性(User Defined Integrity),還有域完整性(Domain Integrity):數(shù)據(jù)必須為預(yù)定義的數(shù)據(jù)類型,同時(shí)屬性值的限制:比如取值范圍,沒有提供值時(shí)的默認(rèn)值,以及是否可以為空等。
 
 
 完整性子系統(tǒng)
 
DBMS中執(zhí)行完整性檢查的子系統(tǒng)稱為“完整性子系統(tǒng)”。它檢測(cè)事務(wù)的執(zhí)行,并測(cè)試是否違反完整性的規(guī)則。若有違反完整性規(guī)則,則采取適當(dāng)?shù)牟僮鳌?/p>
 
 
完整性規(guī)則集
完整性規(guī)則集是由DBA或應(yīng)用程序員事先向完整性子系統(tǒng)提供的有關(guān)數(shù)據(jù)約束的一組規(guī)則。它由以下部分組成:
1、什么時(shí)候使用規(guī)則進(jìn)行檢查(稱為規(guī)則的觸發(fā)條件);
2、要檢查什么樣的錯(cuò)誤(稱為約束條件或謂詞);
3、如果查出錯(cuò)誤,應(yīng)該怎么辦(稱為“ELSE子句”,即違反時(shí)要做的動(dòng)作)。
 
 
SQL完整性約束分類
域約束:在域定義中定義的一種約束。域約束與在特定域中定義的任何列有關(guān)。
 
 
斷言:在斷言定義中定義一種約束。斷言可以與一個(gè)或多個(gè)表進(jìn)行關(guān)聯(lián)。
 斷言僅僅是一種可以用于多個(gè)表的CHECK約束,因此必須在表定義之外獨(dú)立的創(chuàng)建斷言。
 
 
 
與表相關(guān)的約束:它是在表定義中定義的一種約束。該約束可以被定義為列定義的一部分,或者定義為表定義中的一個(gè)元素。在表級(jí)別定義的約束可以應(yīng)用于一個(gè)或多個(gè)列。
列約束:NOT NULL,UNIQUE PRIMARY KEY,FOREIGN KEY,CHECK
表約束:UNIQUE PRIMARY KEY,FOREIGN KEY,CHECK
 
 
 第十一章 數(shù)據(jù)庫安全機(jī)制
 
數(shù)據(jù)庫安全性機(jī)制的概念
數(shù)據(jù)庫的安全是指保護(hù)數(shù)據(jù)庫,防止不合法的使用,導(dǎo)致數(shù)據(jù)的泄密、更改或破壞。
 
 
安全性的級(jí)別
環(huán)境級(jí):計(jì)算機(jī)系統(tǒng)的機(jī)房和設(shè)備應(yīng)加以保護(hù),防止有人進(jìn)行物理破壞。
職員級(jí):工作人員應(yīng)清正廉潔,正確授予用戶訪問數(shù)據(jù)庫的權(quán)限。
OS級(jí):應(yīng)防止未經(jīng)過授權(quán)的用戶從OS處著手訪問數(shù)據(jù)庫。
網(wǎng)絡(luò)級(jí):由于大多數(shù)DBS都允許用戶通過網(wǎng)絡(luò)進(jìn)行遠(yuǎn)程訪問,因此網(wǎng)絡(luò)軟件內(nèi)部的安全性是很重要的。
DBS級(jí):DBS的職責(zé)是檢查用戶的身份是否合法以及使用數(shù)據(jù)庫的權(quán)限是否正確。
 
 
 授權(quán)子系統(tǒng)
 
自主訪問控制(DAC)
自主訪問控制機(jī)制允許對(duì)象的屬主來制定針對(duì)該對(duì)象的保護(hù)策略。通常DAC通過授權(quán)列表(或訪問控制列表)來限定哪些主體針對(duì)哪些客體可以執(zhí)行什么操作。如此將可以非常靈活地對(duì)策略進(jìn)行調(diào)整。由于其易用性與可擴(kuò)展性,自主訪問控制機(jī)制經(jīng)常被用于商業(yè)系統(tǒng)。
六種權(quán)限:SELECT、INSERT、DELETE、UPDATE、REFERENCES、和USAGE。
賦予權(quán)限:GRANT <權(quán)限表> ON <數(shù)據(jù)庫元素> TO <用戶名表> [WITH GRANT OPTION]
 收回權(quán)限:REVOKE <權(quán)限表> ON <數(shù)據(jù)庫元素> FROM <用戶名表> [RESTRICT | CASCADE]
 
 
 
強(qiáng)制訪問控制(MAC)
用來保護(hù)系統(tǒng)確定的對(duì)象,對(duì)此對(duì)象用戶不能進(jìn)行更改。也就是說,系統(tǒng)獨(dú)立于用戶行為強(qiáng)制執(zhí)行訪問控制,用戶不能改變他們的安全級(jí)別或?qū)ο蟮陌踩珜傩浴_@樣的訪問控制規(guī)則通常對(duì)數(shù)據(jù)和用戶按照安全等級(jí)劃分標(biāo)簽,訪問控制機(jī)制通過比較安全標(biāo)簽來確定的授予還是拒絕用戶對(duì)資源的訪問。強(qiáng)制訪問控制進(jìn)行了很強(qiáng)的等級(jí)劃分,所以經(jīng)常用于軍事用途。
 
 
視圖機(jī)制
用來對(duì)無權(quán)用戶屏蔽數(shù)據(jù)。數(shù)據(jù)安全,邏輯數(shù)據(jù)獨(dú)立性和操作簡(jiǎn)便性。
 
 
數(shù)據(jù)加密
常用的數(shù)據(jù)庫加密技術(shù)有:庫外加密、庫內(nèi)加密、和硬件加密。
總結(jié)
 
                            
                        - 上一篇: 5G学习-3GPP协议入门
- 下一篇: Spark机器学习数据流水线
