學習數據庫系統概論這一篇就夠了

目錄


第一章 數據庫緒論

1.1、數據庫系統概述

1.1.1、數據庫的四個概念

  • 數據(Data):數據是數據庫中存儲的基本對象,它是描述事物的符號記錄。
  • 數據庫(Database):數據庫是長期儲存在計算機內、有組織的、可共享的大量數據的集合。
  • 數據庫管理系統(DBMS):數據庫管理系統是位於用戶與操作系統之間的一層數據管理軟件,它是一個大型複雜的軟件系統,它主要用於科學地組織和存儲數據、高效地獲取和維護數據。
  • 數據庫系統(DBS):數據庫系統主要是由數據庫、數據庫管理系統(及其開發工具)、數據庫管理員以及應用程序所構成的一套人機系統。

1.1.2、數據庫系統的特點

  • 數據的整體結構化
數據的整體結構化是數據庫的主要特徵之一,它不再僅僅針對某一個應用,而是面向全組織,不僅數據內部結構化,整體也是結構化的,數據之間具有聯繫,數據記錄可以變長,數據的最小存取單位是數據項。
  • 數據的共享性高,冗餘度低且易擴充
數據面向整個系統,可以被多個用戶、多個應用共享使用。
數據共享的好處:
(1)、減少數據冗餘,節約存儲空間。
(2)、避免數據之間的不相容性與不一致性。
(3)、使系統易於擴充。
  • 數據獨立性高
數據獨立性由數據庫管理系統的二級映像功能來保證,它主要分爲:物理獨立性和邏輯獨立性。
物理獨立性:指用戶的應用程序與數據庫中數據的物理存儲是相互獨立的,當數據的物理存儲改變了,應用程序不用改變。
邏輯獨立性:指用戶的應用程序與數據庫中數據的邏輯結構是相互獨立的,當數據的邏輯結構改變了,應用程序不用改變。
  • 數據由數據庫管理系統統一管理和控制
數據庫管理系統提供的數據控制功能。
(1)、數據的安全性(Security)保護:保護數據以防止不合法的使用造成的數據的泄密和破壞。
(2)、數據的完整性(Integrity)檢查:保證數據的正確性、有效性和相容性。
(3)、併發(Concurrency)控制:對多用戶的併發操作加以控制和協調,防止相互干擾而得到錯誤的結果。
(4)、數據庫恢復(Recovery)技術:將數據庫從錯誤狀態恢復到某一已知的正確狀態。

1.2、數據庫數據模型

1.2.1、數據模型的概述

數據模型是對現實世界數據特徵的抽象,通俗地講數據模型就是現實世界的模擬,數據模型是數據庫系統的核心和基礎。

1.2.2、數據模型的要求

  1. 能比較真實地模擬現實世界。
  2. 容易爲人所理解。
  3. 便於在計算機上實現。

1.2.3、數據模型的分類

數據模型分爲兩類(兩個不同的層次):

  1. 概念模型:
    • 概念模型也稱信息模型,它是按用戶的觀點來對數據和信息建模,用於數據庫設計。
  2. 邏輯模型和物理模型:
    • 邏輯模型主要包括層次模型、網狀模型、關係模型、面向對象數據模型、對象關係數據模型、半結構化數據模型等。按計算機系統的觀點對數據建模,用於DBMS實現。
    • 物理模型是對數據最底層的抽象,描述數據在系統內部的表示方式和存取方法,在磁盤或磁帶上的存儲方式和存取方法。

1.2.4、概念模型的概述

(1)、概念模型的用途

  • 概念模型用於信息世界的建模。
  • 是現實世界到機器世界的一箇中間層次。
  • 是數據庫設計的有力工具。
  • 數據庫設計人員和用戶之間進行交流的語言。

(2)、概念模型的要求

  • 較強的語義表達能力。
  • 簡單、清晰、易於用戶理解。

(3)、概念模型的表示

實體-聯繫方法,用E-R圖來描述現實世界的概念模型,E-R方法也稱爲E-R模型。

(4)、信息世界中的基本概念

  • 實體(Entity):客觀存在並可相互區別的事物稱爲實體。
  • 屬性(Attribute):實體所具有的某一特性稱爲屬性。一個實體可以由若干個屬性來刻畫。例如學生實體可以由學號、姓名、性別、出生年份、系、入學時間等屬性組成。(94002268,張山,男,1976,計算機系,1994)這些屬性組合起來表徵了一個學生。
  • 碼(Key):唯一標識實體的屬性集稱爲碼。例如學號是學生實體的碼。
  • 域(Domain):屬性的取值範圍稱爲該屬性的域。例如,學號的域爲8位整數,姓名的域爲字符串集合,年齡的域爲小於38的整數,性別的域爲(男,女)。
  • 實體型(Entity Type) :具有相同屬性的實體必然具有共同的特徵和性質。用實體名及其屬性名集合來抽象和刻畫同類實體,稱爲實體型。例如,學生(學號,姓名,性別,出生年份,系,入學時間)就是一個實體型。
  • 實體集(Entity Set):同型實體的集合稱爲實體集。例如,全體學生就是一個實體集。
  • 聯繫(Relationship) :在現實世界中,事物內部以及事物之間是有聯繫的,這些聯繫在信息世界中反映爲實體(型)內部的聯繫和實體(型)之間的聯繫。實體內部的聯繫通常是指組成實體的各屬性之間的聯繫。實體之間的聯繫通常是指不同實體集之間的聯繫。

(5)、兩個實體型之間的聯繫

兩個實體型之間的聯繫可以分爲三類:

  • 一對一聯繫(1 : 1)

如果對於實體集A中的每一個實體,實體集B中至多有一個(也可以沒有)實體與之聯繫,反之亦然,則稱實體集A與實體集B具有一對一聯繫,記爲1 : 1。例如,學校裏面,一個班級只有一個正班長,而一個班長只在一個班中任職,則班級與班長之間具有一對一聯繫。

  • 一對多聯繫(1 : n)

    如果對於實體集A中的每一個實體,實體集B中有n個實體(n≥0)與之聯繫,反之,對於實體集B中的每一個實體,實體集A中至多隻有一個實體與之聯繫,則稱實體集A與實體集B有一對多聯繫,記爲1 : n。例如,一個班級中有若干名學生,而每個學生只在一個班級中學習,則班級與學生之間具有一對多聯繫。

  • 多對多聯繫(m : n)

    如果對於實體集A中的每一個實體,實體集B中有n個實體(n≥0)與之聯繫,反之,對於實體集B中的每一個實體,實體集A中也有m個實體(m≥0)與之聯繫,則稱實體集A與實體集B具有多對多聯繫,記爲m : n。

1.2.5、數據模型的組成

  • 數據結構
描述數據庫的組成對象,以及對象之間的聯繫,它是對系統靜態特性的描述。
  • 數據操作
對數據庫中各種對象(型)的實例(值)允許執行的操作的集合,包括操作及有關的操作規則,它是對系統動態特性的描述。
數據操作的類型:
(1)、查詢
(2)、更新(包括插入、刪除、修改)
  • 數據的完整性約束條件
是一組完整性規則的集合,用以限定符合數據模型的數據庫狀態以及狀態的變化,以保證數據的正確、有效和相容。
完整性規則:給定的數據模型中數據及其聯繫所具有的制約和依存規則。

1.2.6、常見的數據模型

  • 層次模型(Hierarchical Model)
  • 網狀模型(Network Model)
  • 關係模型(Relational Model))
  • 面向對象數據模型(Object Oriented Data Model)
  • 對象關係數據模型(Object Relational Data Model)
  • 半結構化數據模型(Semistruture Data Model)

1.2.7、層次模型

1.2.7.1、概述

定義:層次數據模型是用樹狀層次結構來組織數據的數據模型。

層次模型是數據庫系統中最早出現的數據模型,層次數據庫系統的典型代表是IBM公司的IMS(Information Management System)數據庫管理系統,層次模型用樹形結構來表示各類實體以及實體間的聯繫。

滿足下面兩個條件的基本層次聯繫的集合爲層次模型:

  1. 有且只有一個結點沒有雙親結點,這個結點稱爲根結點。
  2. 根以外的其它結點有且只有一個雙親結點。

image-20200919090046099

1.2.7.2、特點
  • 結點的雙親是唯一的。
  • 只能直接處理一對多的實體聯繫。
  • 每個記錄類型可以定義一個排序字段,也稱爲碼字段。
  • 任何記錄值只有按其路徑查看時,才能顯出它的全部意義。
  • 沒有一個子女記錄值能夠脫離雙親記錄值而獨立存在。
1.2.7.3、數據結構

教員學生層次數據庫模型舉例:

image-20200919090402880

1.2.7.4、數據操縱
  • 查詢
  • 插入
  • 刪除
  • 更新
1.2.7.5、完整性約束條件
  • 無相應的雙親結點值就不能插入子女結點值。
  • 如果刪除雙親結點值,則相應的子女結點值也被同時刪除。
  • 更新操作時,應更新所有相應記錄,以保證數據的一致性。
1.2.7.6、優缺點
  • 優點

    • 層次模型的數據結構比較簡單清晰。
    • 查詢效率高,性能優於關係模型,不低於網狀模型。
    • 層次數據模型提供了良好的完整性支持。
  • 缺點

    • 結點之間的多對多聯繫表示不自然。
    • 對插入和刪除操作的限制多,應用程序的編寫比較複雜。
    • 查詢子女結點必須通過雙親結點。
    • 層次命令趨於程序化。

1.2.8、網狀模型

1.2.8.1、概述

定義:用有向圖表示實體和實體之間的聯繫的數據結構模型稱爲網狀數據模型。

網狀數據庫系統採用網狀模型作爲數據的組織方式,典型代表是DBTG系統,亦稱CODASYL系統,20世紀70年代由DBTG提出的一個系統方案。

滿足下面兩個條件的基本層次聯繫的集合稱爲網狀數據模型:

  1. 允許一個以上的結點無雙親。
  2. 一個結點可以有多於一個的雙親。

image-20200919092352655

1.2.8.2、描述
  • 實體型:用記錄類型描述每個結點表示一個記錄類型(實體)。
  • 屬性:用字段描述每個記錄類型可包含若干個字段。
  • 聯繫:用結點之間的連線表示記錄類型(實體)之間的一對多的父子聯繫。
1.2.8.3、數據結構

學生/選課/課程的網狀數據模型舉例:

image-20200919092654076

1.2.8.4、數據操縱

網狀數據庫系統(如DBTG)對數據操縱加了一些限制,提供了一定的完整性約束。

  • 查詢
  • 插入
  • 刪除
  • 更新
1.2.8.5、完整性約束條件
  • 一個聯繫中雙親記錄與子女記錄之間是一對多聯繫。
  • 支持雙親記錄和子女記錄之間某些約束條件。
1.2.8.6、優缺點
  • 優點
    • 能夠更爲直接地描述現實世界,如一個結點可以有多個雙親。
    • 具有良好的性能,存取效率較高。
  • 缺點
    • 結構比較複雜,而且隨着應用環境的擴大,數據庫的結構就變得越來越複雜,不利於最終用戶掌握。
    • DDL、DML語言複雜,用戶不容易使用。
    • 記錄之間聯繫是通過存取路徑實現的,用戶必須瞭解系統結構的細節。

1.2.9、關係模型

1.2.9.1、概述

定義:使用表格表示實體和實體之間關係的數據模型稱之爲關係數據模型。

關係數據庫系統採用關係模型作爲數據的組織方式,1970年美國IBM公司San Jose研究室的研究員E.F.Codd首次提出了數據庫系統的關係模型,計算機廠商新推出的數據庫管理系統幾乎都支持關係模型。

關係型數據庫是目前最流行的數據庫,同時也是被普遍使用的數據庫,如MySQL就是一種流行的數據庫。

1.2.9.2、特點
  1. 關係數據模型中,無論是是實體、還是實體之間的聯繫都是被映射成統一的關係—一張二維表,在關係模型中,操作的對象和結果都是一張二維表,它由行和列組成。
  2. 關係型數據庫可用於表示實體之間的多對多的關係,只是此時要藉助第三個關係—表,來實現多對多的關係。
  3. 關係必須是規範化的關係,即每個屬性是不可分割的實體,不允許表中表的存在。
1.2.9.3、數據結構

學生登記表爲例:

image-20200919093653951

常見的術語描述:

  • 關係(Relation):一個關係對應通常說的一張表。
  • 元組(Tuple):表中的一行即爲一個元組。
  • 屬性(Attribute):表中的一列即爲一個屬性,給每一個屬性起一個名稱即屬性名。
  • 主碼(Key):也稱碼鍵,表中的某個屬性組,它可以唯一確定一個元組。
  • 域(Domain):是一組具有相同數據類型的值的集合,屬性的取值範圍來自某個域。
  • 分量:元組中的一個屬性值。
  • 關係模式:對關係的描述。

常見的術語對比圖:

image-20200919093948162

1.2.9.4、數據操縱

數據操作是集合操作,操作對象和操作結果都是關係:

  • 查詢
  • 插入
  • 刪除
  • 更新
1.2.9.5、完整性約束條件
  • 實體完整性。
  • 參照完整性。
  • 用戶定義的完整性。
1.2.9.6、優缺點
  • 優點
    • 建立在嚴格的數學概念的基礎上。
    • 概念單一。
    • 關係模型的存取路徑對用戶透明。
  • 缺點
    • 存取路徑對用戶透明,查詢效率往往不如格式化數據模型。
    • 爲提高性能,必須對用戶的查詢請求進行優化,增加了開發數據庫管理系統的難度。

1.3、數據庫系統結構

  • 從數據庫應用開發人員角度看,數據庫系統通常採用三級模式結構,是數據庫系統內部的系統結構。
  • 從數據庫最終用戶角度看,數據庫系統的結構分爲:
    • 單用戶結構
    • 主從式結構
    • 分佈式結構
    • 客戶-服務器結構
    • 瀏覽器-應用服務器結構
    • 數據庫服務器多層結構
1.3.1、數據庫系統的模式概念
  • 模式(Schema)
    • 數據庫邏輯結構和特徵的描述
    • 是型的描述,不涉及具體值
    • 反映的是數據的結構及其聯繫
    • 模式是相對穩定的
  • 實例(Instance)
    • 模式的一個具體值
    • 反映數據庫某一時刻的狀態
    • 同一個模式可以有很多實例
    • 實例隨數據庫中的數據的更新而變動
1.3.2、數據庫系統的三級模式結構

三級模式結構說明:

  • 模式(Schema)
模式(也稱邏輯模式)
數據庫中全體數據的邏輯結構和特徵的描述。
所有用戶的公共數據視圖。
  • 外模式(External Schema)
外模式(也稱子模式或用戶模式)
數據庫用戶(包括應用程序員和最終用戶)使用的局部數據的邏輯結構和特徵的描述。
數據庫用戶的數據視圖,是與某一應用有關的數據的邏輯表示。
  • 內模式(Internal Schema)
內模式(也稱存儲模式)
是數據物理結構和存儲方式的描述。
是數據在數據庫內部的表示方式。
記錄的存儲方式(例如,順序存儲,按照B樹結構存儲,按hash方法存儲等)。
索引的組織方式。
數據是否壓縮存儲。
數據是否加密。
數據存儲記錄結構的規定。

三級模式結構圖:

image-20200919095138531

1.3.3、數據庫系統的二級映像功能

三級模式是對數據的三個抽象級別,二級映象在數據庫管理系統內部實現這三個抽象層次的聯繫和轉換:

  • 外模式/模式映像
保證數據的邏輯獨立性。
(1)、當模式改變時,數據庫管理員對外模式/模式映象作相應改變,使外模式保持不變。
(2)、應用程序是依據數據的外模式編寫的,應用程序不必修改,保證了數據與程序的邏輯獨立性,簡稱數據的邏輯獨立性。
  • 模式/內模式映像
保證數據的物理獨立性。
(1)、當數據庫的存儲結構改變了(例如選用了另一種存儲結構),數據庫管理員修改模式/內模式映象,使模式保持不變。
(2)、應用程序不受影響。保證了數據與程序的物理獨立性,簡稱數據的物理獨立性。

數據庫的二級映像的主要功能:

  • 保證了數據庫外模式的穩定性。
  • 從底層保證了應用程序的穩定性,除非應用需求本身發生變化,否則應用程序一般不需要修改。

1.4、數據庫系統的組成

  • 數據庫
  • 數據庫管理系統(及其開發工具)
  • 數據庫管理員
  • 應用程序

1.5、數據庫管理員職責

  1. 決定數據庫中的信息內容和結構。
  2. 決定數據庫的存儲結構和存取策略。
  3. 定義數據的安全性要求和完整性約束條件。
  4. 監控數據庫的使用和運行。
  5. 數據庫的改進和重組。

第二章 關係數據庫

2.1、關係概述

2.1.1、關係

現實世界的實體以及實體間的各種聯繫均用關係來表示。

從用戶角度,關係模型中數據的邏輯結構是一張二維表,它是建立在集合代數的基礎上。

域(Domain): 域是一組具有相同數據類型的值的集合。

笛卡爾積(Cartesian Product): 給定一組域D1,D2,…,Dn,允許其中某些域是相同的。D1,D2,…,Dn的笛卡爾積爲:
D1×D2×…×Dn ={(d1,d2,…,dn)|di∈Di,i=1,2,…,n},笛卡爾積是所有域的所有取值的一個組合,它不能重複。

  • 元組(Tuple):笛卡爾積中每一個元素(d1,d2,…,dn)叫作一個n元組(n-tuple)或簡稱元組。

  • 分量(Component):笛卡爾積中每一個元素(d1,d2,…,dn)中的每一個值di叫作一個分量。

  • 基數(Cardinal number):若Di(i=1,2,…,n)爲有限集,其基數爲mi(i=1,2,…,n),則D1×D2×…×Dn的基數M爲:image-20201123094231714

  • 表示方法:笛卡爾積可表示爲一張二維表,表中的每行對應一個元組,表中的每列對應一個域。

  • 例如,給出3個域:

    D1=導師集合SUPERVISOR={張清玫,劉逸}
    D2=專業集合SPECIALITY={計算機專業,信息專業}
    D3=研究生集合POSTGRADUATE={李勇,劉晨,王敏}
    D1,D2,D3的笛卡爾積爲
    D1×D2×D3={
            (張清玫,計算機專業,李勇),(張清玫,計算機專業,劉晨),
            (張清玫,計算機專業,王敏),(張清玫,信息專業,李勇),
            (張清玫,信息專業,劉晨),(張清玫,信息專業,王敏),
            (劉逸,計算機專業,李勇),(劉逸,計算機專業,劉晨),
            (劉逸,計算機專業,王敏),(劉逸,信息專業,李勇),
            (劉逸,信息專業,劉晨),(劉逸,信息專業,王敏) }
    基數爲2×2×3=12
    

關係(Relation): D1×D2×…×Dn的子集叫作在域D1,D2,…,Dn上的關係,表示爲R(D1,D2,…,Dn),其中,R爲關係名,n爲關係的目或度(Degree)。關係中的每個元素是關係中的元組,通常用t表示。當n=1時,稱該關係爲單元關係(Unary relation)或一元關係 ,當n=2時,稱該關係爲二元關係(Binary relation),關係也是一個二維表,表的每行對應一個元組,表的每列對應一個域,關係中不同列可以對應相同的域,爲了加以區分,必須對每列起一個名字,稱爲屬性(Attribute),n目關係必有n個屬性。若關係中的某一屬性組的值能唯一地標識一個元組,則稱該屬性組爲候選碼,簡單的情況:候選碼只包含一個屬性,最極端的情況:關係模式的所有屬性組是這個關係模式的候選碼,稱爲全碼(All-key),若一個關係有多個候選碼,則選定其中一個爲主碼(Primary key),候選碼的諸屬性稱爲主屬性(Prime attribute),不包含在任何侯選碼中的屬性稱爲非主屬性(Non-Prime attribute)或非碼屬性(Non-key attribute) 。

  • 三類關係:
    • 基本關係(基本表或基表):實際存在的表,是實際存儲數據的邏輯表示
    • 查詢表:查詢結果對應的表
    • 視圖表:由基本表或其他視圖表導出的表,是虛表,不對應實際存儲的數據
  • 基本關係的性質:
    • 列是同質的(Homogeneous)
    • 不同的列可出自同一個域,其中的每一列稱爲一個屬性,不同的屬性要給予不同的屬性名
    • 列的順序無所謂,列的次序可以任意交換
    • 行的順序無所謂,行的次序可以任意交換
    • 任意兩個元組的候選碼不能相同
    • 分量必須取原子值,這是規範條件中最基本的一條

2.1.2、關係模式

  • 什麼是關係模式?

    關係模式是對關係的描述。如元組集合的結構,完整性約束條件。
    
  • 咋定義關係模式?

    關係模式可以形式化地表示爲:R(U,D,DOM,F)
    		R       	     關係名
    		U       	     組成該關係的屬性名集合
    		D       	     U中屬性所來自的域
    		DOM  	     	 屬性向域的映象集合
    		F        	     屬性間數據的依賴關係的集合
    		
    關係模式通常可以簡記爲R (U)或 R (A1,A2,…,An)
            R: 				關係名
            A1,A2,…,An  : 屬性名
    注:域名及屬性向域的映象常常直接說明爲屬性的類型、長度
    
  • 關係模式與關係?

    關係模式(Relation Schema)是型,而關係是值,關係模式和關係往往籠統稱爲關係。
    
    關係模式是對關係的描述,它是靜態的、穩定的。
    關係則表示關係模式在某一時刻的狀態或內容,它是動態的、隨時間不斷變化的。
    

2.1.3、關係數據庫

關係數據庫:在一個給定的應用領域中,所有關係的集合構成一個關係數據庫。

關係數據庫的型與值:

  • 關係數據庫的型: 關係數據庫模式,是對關係數據庫的描述。
  • 關係數據庫的值: 關係模式在某一時刻對應的關係的集合,通常稱爲關係數據庫。

2.1.4、關係模型的存儲結構

關係數據庫的物理組織:

  • 有的關係數據庫管理系統中一個表對應一個操作系統文件,將物理數據組織交給操作系統完成。
  • 有的關係數據庫管理系統從操作系統那裏申請若干個大的文件,自己劃分文件空間,組織表、索引等存儲結構,並進行存儲管理。

2.2、關係操作

常用關係操作:

  • 查詢操作:選擇、投影、連接、除、並、差、交、笛卡爾積(選擇、投影、並、差、笛卡爾基是5種基本操作,交、連接、除,可以用5種基本運算來表達,引進它們並不增加語言的能力,但可以簡化表達)
  • 數據更新:插入、刪除、修改

關係操作特點:操作的對象和結果都是集合,一次一集合的方式。

關係代數語言:用對關係的運算來表達查詢要求,代表:ISBL。

關係演算語言:用謂詞來表達查詢要求。

  • 元組關係演算語言:謂詞變元的基本對象是元組變量,代表:APLHA, QUEL。
  • 域關係演算語言 :謂詞變元的基本對象是域變量,代表:QBE。

具有關係代數和關係演算雙重特點的語言,代表:SQL(Structured Query Language)。

2.3、關係完整性

關係的三類完整性約束:

  • 實體完整性和參照完整性:關係模型必須滿足的完整性約束條件稱爲關係的兩個不變性,應該由關係系統自動支持。
  • 用戶定義的完整性:應用領域需要遵循的約束條件,體現了具體領域中的語義約束。

2.3.1、實體完整性

實體完整性規則(Entity Integrity):若屬性A是基本關係R的主屬性,則屬性A不能取空值,空值就是“不知道”或“不存在”或“無意義”的值。

實體完整性規則的說明:

  1. 實體完整性規則是針對基本關係而言的,一個基本表通常對應現實世界的一個實體集。
  2. 現實世界中的實體是可區分的,即它們具有某種唯一性標識。
  3. 關係模型中以主碼作爲唯一性標識。
  4. 主碼中的屬性即主屬性不能取空值。主屬性取空值,就說明存在某個不可標識的實體,即存在不可區分的實體,這與第(2)點相矛盾,因此這個規則稱爲實體完整性

2.3.2、參照完整性

  • 關係間的引用:在關係模型中實體及實體間的聯繫都是用關係來描述的,自然存在着關係與關係間的引用。
  • 外碼:設F是基本關係R的一個或一組屬性,但不是關係R的碼。如果F與基本關係S的主碼Ks相對應,則稱F是R的外碼。基本關係R稱爲參照關係(Referencing Relation),基本關係S稱爲被參照關係(Referenced Relation)或目標關係(Target Relation)。
  • 參照完整性規則:若屬性(或屬性組)F是基本關係R的外碼它與基本關係S的主碼Ks相對應(基本關係R和S不一定是不同的關係),則對於R中每個元組在F上的值必須爲:或者取空值(F的每個屬性值均爲空值),或者等於S中某個元組的主碼值。

2.3.3、用戶定義的完整性

針對某一具體關係數據庫的約束條件,反映某一具體應用所涉及的數據必須滿足的語義要求。

關係模型應提供定義和檢驗這類完整性的機制,以便用統一的系統的方法處理它們,而不需由應用程序承擔這一功能。

2.4、關係代數

關係代數是一種抽象的查詢語言,它用對關係的運算來表達查詢。

關係代數的運算對象是關係,運算結果亦爲關係。

關係代數的運算符有兩類:傳統的集合運算符和專門的關係運算符,傳統的集合運算是從關係的“水平”方向即行的角度進行,而專門的關係運算不僅涉及行而且涉及列。

常見的關係運算符如下:

image-20201123105448719

2.4.1、傳統的集合運算符

並:

image-20201123105816304

差:

image-20201123105851101

交:

image-20201123105930759

笛卡爾積:

image-20201123110031767

2.4.2、專門的集合運算符

選擇:

image-20201123110621165

投影:

image-20201123110804174

連接:

image-20201123121805030

除:

image-20201123121726738

第三章 SQL語言

3.1、SQL的概述

SQL(Structured Query Language)結構化查詢語言,是關係數據庫的標準語言,SQL是一個通用的、功能極強的關係數據庫語言。

3.2、SQL的發展

image-20201123124208739

目前,沒有一個數據庫系統能夠支持SQL標準的所有概念和特性.

3.3、SQL的特點

  1. 綜合統一
  2. 高度非過程化
  3. 面向集合的操作方式
  4. 以同一種語法結構提供兩種使用方式,SQL語言既是自含式語言,又是嵌入式語言
  5. 語言簡捷,易學易用

3.4、SQL的功能

image-20201123125725848

3.5、SQL的結構

SQL支持關係數據庫三級模式結構:

image-20201123125908372

3.6、SQL的數據類型

image-20201123135349095

3.7、數據定義語言(DDL)

一個關係數據庫管理系統的實例(Instance)中可以建立多個數據庫,一個數據庫中可以建立多個模式,一個模式下通常包括多個表、視圖和索引等數據庫對象。因此SQL的數據定義功能包括定義模式、定義表、定義視圖和定義索引。視圖是基於基本表的虛表,索引是依附於基本表的,因此SQL通常不提供修改視圖定義和修改索引定義的操作。用戶如果想修改視圖定義或索引定義,只能先將它們刪除掉,然後再重建。不過有些關係數據庫產品如Oracle允許直接修改視圖定義。

image-20201124094242567

3.7.1、模式

2.7.1.1、模式的定義

定義模式實際上定義了一個命名空間,在這個空間中可以定義該模式包含的數據庫對象,例如基本表、視圖、索引等。

在CREATE SCHEMA中可以接受CREATE TABLE,CREATE VIEW和GRANT子句。

CREATE SCHEMA <模式名> AUTHORIZATION <用戶名> [<表定義子句>|<視圖定義子句>|<授權定義子句>];

案例演示:爲用戶ZHANG創建了一個模式TEST,並且在其中定義一個表TAB1。

CREATE SCHEMA TEST AUTHORIZATION ZHANG CREATE TABLE TAB1 (
  COL1 SMALLINT,
  COL2 INT,
  COL3 CHAR(20),
  COL4 NUMERIC (10, 3),
  COL5 DECIMAL (5, 2)
) ;
2.7.1.2、模式的刪除
DROP SCHEMA <模式名> <CASCADE|RESTRICT>;

CASCADE(級聯):刪除模式的同時把該模式中所有的數據庫對象全部刪除。

RESTRICT(限制):如果該模式中定義了下屬的數據庫對象(如表、視圖等),則拒絕該刪除語句的執行,僅當該模式中沒有任何下屬的對象時才能執行。

案例演示:刪除模式ZHANG,同時該模式中定義的表TAB1也被刪除。

DROP SCHEMA ZHANG CASCADE;

3.7.2、基本表

3.7.2.1、基本表的定義

建立數據庫最重要的一步就是定義一些基本表,SQL語言使用CREATE TABLE語句定義基本表。

CREATE TABLE <表名> (
    <列名> <數據類型>[ <列級完整性約束條件> ]
  [,<列名> <數據類型>[ <列級完整性約束條件> ]]
  [,<列名> <數據類型>[ <列級完整性約束條件> ]]    
    ...
  [,<表級完整性約束條件> ]
);

<表名>:所要定義的基本表的名字。
<列名>:組成該表的各個屬性(列)。
<列級完整性約束條件>:涉及相應屬性列的完整性約束條件。
<表級完整性約束條件>:涉及一個或多個屬性列的完整性約束條件 。
如果完整性約束條件涉及到該表的多個屬性列,則必須定義在表級上,否則既可以定義在列級也可以定義在表級。



案例演示:建立“學生”表Student,學號是主碼,姓名取值唯一。

CREATE TABLE Student (
  Sno CHAR(9) PRIMARY KEY,
  Sname CHAR(20) UNIQUE,
  Ssex CHAR(2),
  Sage SMALLINT,
  Sdept CHAR(20)
) ;

案例演示:建立一個“課程”表Course,課程號是主碼。

CREATE TABLE Course (
  Cno CHAR(4) PRIMARY KEY,
  Cname CHAR(40),
  Cpno CHAR(4),
  Ccredit INT
) ;

案例演示:建立一個學生選課表SC,學生號和課程號組成主碼。

CREATE TABLE SC (
  Sno CHAR(9),
  Cno CHAR(4),
  Grade DECIMAL (40, 2) ,
  /* 主碼由兩個屬性構成,必須作爲表級完整性進行定義 */
  PRIMARY KEY (Sno, Cno),
  /* 表級完整性約束條件,Sno是外碼,被參照表是Student */
  FOREIGN KEY (Sno) REFERENCES Student (Sno),
  /* 表級完整性約束條件,Cno是外碼,被參照表是Course */
  FOREIGN KEY (Cno) REFERENCES Course (Cno)
) ;

模式與表:

每一個基本表都屬於某一個模式,一個模式包含多個基本表,定義基本表所屬模式有以下三種方式:

  • 方法一:在表名中明顯地給出模式名
    • Create table"S-T".Student(…);
    • Create table “S-T”.Cource(…);
    • Create table “S-T”.SC(…);
  • 方法二:在創建模式語句中同時創建表
  • 方法三:設置所屬的模式

創建基本表(其他數據庫對象也一樣)時,若沒有指定模式,系統根據搜索路徑來確定該對象所屬的模式,關係數據庫管理系統會使用模式列表中第一個存在的模式作爲數據庫對象的模式名,若搜索路徑中的模式名都不存在,系統將給出錯誤。

3.7.2.2、基本表的修改
ALTER TABLE <表名>
[ ADD  [ COLUMN ] <新列名> <數據類型> [ 完整性約束 ] ]
[ ADD <表級完整性約束>]
[ DROP [ COLUMN ] <列名> [CASCADE| RESTRICT] ]
[ DROP CONSTRAINT <完整性約束名> [ RESTRICT | CASCADE ] ]
[ ALTER COLUMN <列名><數據類型> ] ;

<表名>是要修改的基本表。
ADD子句用於增加新列、新的列級完整性約束條件和新的表級完整性約束條件。
DROP COLUMN子句用於刪除表中的列。
如果指定了CASCADE短語,則自動刪除引用了該列的其他對象。
如果指定了RESTRICT短語,則如果該列被其他對象引用,關係數據庫管理系統將拒絕刪除該列。
DROP CONSTRAINT子句用於刪除指定的完整性約束條件。
ALTER COLUMN子句用於修改原有的列定義,包括修改列名和數據類型。





案例演示:向Student表增加“入學時間”列,其數據類型爲日期型。

注意:不管基本表中原來是否已有數據,新增加的列一律爲空值。

ALTER TABLE Student 
ADD S_entrance DATE ;

案例演示:將年齡的數據類型由字符型(假設原來的數據類型是字符型)改爲整數。

ALTER TABLE Student 
ALTER COLUMN Sage INT ;

案例演示:增加課程名稱必須取唯一值的約束條件。

ALTER TABLE Course 
ADD UNIQUE (Cname) ;
3.7.2.3、基本表的刪除
DROP TABLE <表名>RESTRICT | CASCADE;

CASCADE(級聯):在刪除基本表的同時,相關的依賴對象一起刪除。

RESTRICT(限制):欲刪除的基本表不能被其他表的約束所引用,如果存在依賴該表的對象,則此表不能被刪除。

案例演示:刪除Student表。

DROP TABLE Student CASCADE ;

DROP TABLE時,SQL2011 與 3個RDBMS的處理策略比較:

image-20201123143317188

3.7.3、視圖

3.7.3.1、視圖的定義

視圖是一個虛擬表,其內容由查詢定義。但視圖並不存儲數據,視圖數據來自由定義視圖的查詢所引用的表。關係數據庫管理系統執行CREATE VIEW語句時只是把視圖定義存入數據字典,並不執行其中的SELECT語句。在對視圖查詢時,按視圖的定義從基本表中將數據查出。視圖能夠簡化用戶的操作,使用戶能以多種角度看待同一數據,視圖對重構數據庫提供了一定程度的邏輯獨立性,能夠對機密數據提供安全保護,適當的利用視圖可以更清晰的表達查詢。

CREATE VIEW < 視圖名 > [ (< 列名 > [, < 列名 > ]) ] AS
< 子查詢 > [ WITH CHECK OPTION ] ;

WITH CHECK OPTION:對視圖進行UPDATE,INSERT和DELETE操作時要保證更新、插入或刪除的行滿足視圖定義中的謂詞條件(即子查詢中的條件表達式)。子查詢可以是任意的SELECT語句,是否可以含有ORDER BY子句和DISTINCT短語,則決定具體系統的實現。

基於單表的視圖:

案例演示:建立信息系學生的視圖。

CREATE VIEW IS_Student AS 
SELECT 
  Sno,
  Sname,
  Sage 
FROM
  Student 
WHERE Sdept = 'IS' ;

案例演示:建立信息系學生的視圖,並要求進行修改和插入操作時仍需保證該視圖只有信息系的學生。

CREATE VIEW IS_Student AS 
SELECT 
  Sno,
  Sname,
  Sage 
FROM
  Student 
WHERE Sdept = 'IS' WITH CHECK OPTION ;

基於多表的視圖:

案例演示:建立信息系選修了1號課程的學生的視圖(包括學號、姓名、成績)。

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' ;

基於視圖的視圖:

案例演示:建立信息系選修了1號課程且成績在90分以上的學生的視圖。

CREATE VIEW IS_S2 AS 
SELECT 
  Sno,
  Sname,
  Grade 
FROM
  IS_S1 
WHERE Grade >= 90 ;

帶表達式的視圖:

案例演示:定義一個反映學生出生年份的視圖。

CREATE VIEW BT_S (Sno, Sname, Sbirth) AS 
SELECT 
  Sno,
  Sname,
  2014-Sage 
FROM
  Student ;

分組視圖:

案例演示:將學生的學號及平均成績定義爲一個視圖。

CREATE VIEW S_G (Sno, Gavg) AS 
SELECT 
  Sno,
  AVG(Grade) 
FROM
  SC 
GROUP BY Sno ;
3.7.3.2、數據的修改

案例演示:將信息系學生視圖IS_Student中學號”201215122”的學生姓名改爲”劉辰”。

UPDATE 
  IS_Student 
SET
  Sname = '劉辰' 
WHERE Sno = '201215122' ;

案例演示:向信息系學生視圖IS_S中插入一個新的學生記錄,其中學號爲”201215140”,姓名爲”趙新”,年齡爲20歲。

INSERT INTO IS_Student 
VALUES('201215140','趙新',20) ;

案例演示:刪除信息系學生視圖IS_Student中學號爲”201215140”的記錄。

DELETE FROM IS_Student 
WHERE Sno = '201215140' ;
3.7.3.3、視圖的刪除
DROP VIEW < 視圖名 > [ CASCADE ] ;

如果該視圖上還導出了其他視圖,使用CASCADE級聯刪除語句,把該視圖和由它導出的所有視圖一起刪除 。

案例演示:刪除視圖BT_S。

DROP VIEW BT_S ;

3.7.4、索引

3.7.4.1、索引的定義

建立索引是加快查詢速度的有效手段。用戶可以根據應用環境的需要,在基本表上建立一個或多個索引,以提供多種存取路徑,加快查找速度。一般說來,建立與刪除索引由數據庫管理員DBA或表的屬主(即建立表的人)負責完成。系統在存取數據時會自動選擇合適的索引作爲存取路徑,用戶不必也不能選擇索引。

在SQL語言中,建立索引使用CREATE INDEX語句。索引可以建立在該表的一列或多列上,各列名之間用逗號分隔。每個列名後面還可以用次序指定索引值的排列次序,可選ASC(升序)或DESC(降序),缺省值爲ASC升序。

CREATE [UNIQUE] [CLUSTER] INDEX <索引名> 
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]);

<表名>:要建索引的基本表的名字。
索引:可以建立在該表的一列或多列上,各列名之間用逗號分隔。
<次序>:指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASC。
UNIQUE:此索引的每一個索引值只對應唯一的數據記錄。
CLUSTER:表示要建立的索引是聚簇索引。所謂聚簇索引是指索引項的順序與表中記錄的物理順序一致的索引組織。用戶可以在最常查詢的列上建立聚簇索引以提高查詢效率。顯然在一個基本表上最多隻能建立一個聚簇索引。建立聚簇索引後,更新索引列數據時,往往導致表中記錄的物理順序的變更,代價較大,因此對於經常更新的列不宜建立聚簇索引。



案例演示:爲Student,Course,SC三個表建立索引。Student表按學號升序建唯一索引,Course表按課程號升序建唯一索引,SC表按學號升序和課程號降序建唯一索引。

CREATE UNIQUE INDEX Stusno 
ON Student (Sno) ;

CREATE UNIQUE INDEX Coucno 
ON Course (Cno) ;

CREATE UNIQUE INDEX SCno 
ON SC (Sno ASC, Cno DESC) ;
3.7.4.2、名稱的修改
ALTER INDEX <舊索引名> RENAME TO <新索引名> ;

案例演示:將SC表的SCno索引名改爲SCSno。

ALTER INDEX SCno RENAME TO SCSno;
3.7.4.3、索引的刪除

刪除索引時,系統會從數據字典中刪去有關該索引的描述。

DROP INDEX <索引名> on <表名>;

案例演示:刪除Student表的Sname索引。

DROP INDEX Sname ON Student;

3.8、數據查詢語言(DQL)

3.8.1、單表查詢

SELECT 
  [ ALL | DISTINCT ] 
  < 目標列表達式 > [,< 目標列表達式 > ]FROM
  < 表名或視圖名 > [,< 表名或視圖名 > ]| (SELECT 語句) [ AS ] < 別名 > 
[ WHERE < 條件表達式 > ] 
[ GROUP BY < 列名1 > [ HAVING < 條件表達式 > ] ] 
[ ORDER BY < 列名2 > [ ASC | DESC ] ] ;

SELECT子句:指定要顯示的屬性列。
FROM子句:指定查詢對象(基本表或視圖)。
WHERE子句:指定查詢條件。
GROUP BY子句:對查詢結果按指定列的值分組,該屬性列值相等的元組爲一個組。通常會在每組中作用聚集函數。
HAVING短語:只有滿足指定條件的組才予以輸出。
ORDER BY子句:對查詢結果表按指定列值的升序或降序排序。




image-20201123194545322

3.8.1.1、簡單查詢

案例演示:查詢全體學生的學號與姓名。

SELECT Sno,Sname FROM Student ;

案例演示:查詢全體學生的姓名、學號、所在系。

SELECT Sname,Sno,Sdept FROM Student ;

案例演示:查詢全體學生的詳細記錄。

SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student ;
SELECT * FROM Student ;

案例演示:查全體學生的姓名及其出生年份。(假設當年爲2014)

SELECT Sname,2014-Sage FROM Student ;

案例演示:查詢全體學生的姓名、出生年份和所在的院系,要求用小寫字母表示系名。(假設當年爲2014)

SELECT Sname,'Year of Birth:',2014-Sage,LOWER(Sdept) FROM Student ;
3.8.1.2、條件查詢

案例演示:查詢計算機科學系全體學生的名單。

SELECT Sname FROM Student WHERE Sdept = 'CS' ;

案例演示:查詢所有年齡在20歲以下的學生姓名及其年齡。

SELECT Sname,Sage FROM Student WHERE Sage < 20 ;

案例演示:查詢考試成績有不及格的學生的學號。

SELECT DISTINCT Sno FROM SC WHERE Grade < 60 ;

案例演示:查詢年齡在20~23歲(包括20歲和23歲)之間的學生的姓名、系別和年齡。

SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23 ;

案例演示:查詢年齡不在20~23歲之間的學生姓名、系別和年齡。

SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23 ;
3.8.1.3、IN子查詢

案例演示:查詢計算機科學系(CS)、數學系(MA)和信息系(IS)學生的姓名和性別。

SELECT Sname,Ssex FROM Student WHERE Sdept IN ('CS','MA','IS') ;

案例演示:查詢既不是計算機科學系、數學系,也不是信息系的學生的姓名和性別。

SELECT Sname,Ssex FROM Student WHERE Sdept NOT IN ('CS','MA','IS') ;
3.8.1.4、模糊查詢

謂詞: [NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <換碼字符>’]

  • % (百分號) :代表任意長度(長度可以爲0)的字符串。
  • _ (下橫線):代表任意單個字符。

案例演示:查詢學號爲201215121的學生的詳細情況。

SELECT * FROM Student WHERE Sno LIKE '201215121' ;
SELECT * FROM Student WHERE Sno = '201215121' ;

案例演示:查詢所有姓劉學生的姓名、學號和性別。

SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE '劉%' ;

案例演示:查詢姓"歐陽"且全名爲三個漢字的學生的姓名。

SELECT Sname FROM Student WHERE Sname LIKE '歐陽__' ;

案例演示:查詢名字中第2個字爲"陽"字的學生的姓名和學號。

SELECT Sname,Sno FROM Student WHERE Sname LIKE '__陽%' ;

案例演示:查詢所有不姓劉的學生姓名、學號和性別。

SELECT Sname,Sno,Ssex FROM Student WHERE Sname NOT LIKE '劉%' ;

案例演示:查詢DB_Design課程的課程號和學分。

注意:使用換碼字符將通配符轉義爲普通字符。

SELECT Cno,Ccredit FROM Course WHERE Cname LIKE 'DB#_Design' ESCAPE '#' ;

案例演示:查詢以"DB_"開頭,且倒數第3個字符爲 i的課程的詳細情況。

SELECT * FROM Course WHERE Cname LIKE 'DB#_%i__' ESCAPE '#' ;
3.8.1.5、空值查詢

案例演示:某些學生選修課程後沒有參加考試,所以有選課記錄,但沒 有考試成績。查詢缺少成績的學生的學號和相應的課程號。

SELECT Sno,Cno FROM SC WHERE Grade IS NULL ;

案例演示:查所有有成績的學生學號和課程號。

SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL ;
3.8.1.6、與或查詢

案例演示:查詢計算機系年齡在20歲以下的學生姓名。

SELECT Sname FROM Student WHERE Sdept = 'CS' AND Sage < 20 ;

案例演示:查詢計算機科學系(CS)、數學系(MA)和信息系(IS)學生的姓名和性別。

SELECT Sname,Ssex FROM Student WHERE Sdept IN ('CS','MA','IS') ;
SELECT Sname,Ssex FROM Student WHERE Sdept = 'CS' OR Sdept = 'MA' OR Sdept = 'IS' ;
3.8.1.7、排序查詢

案例演示:查詢選修了3號課程的學生的學號及其成績,查詢結果按分數降序排列。

SELECT Sno,Grade FROM SC WHERE Cno = '3' ORDER BY Grade DESC ;

案例演示:查詢全體學生情況,查詢結果按所在系的系號升序排列,同一系中的學生按年齡降序排列。

SELECT * FROM Student ORDER BY Sdept,Sage DESC ;
3.8.1.8、聚合查詢

案例演示:查詢學生總人數。

SELECT COUNT(*) FROM Student ;

案例演示:查詢選修了課程的學生人數。

SELECT COUNT(DISTINCT Sno) FROM SC ;

案例演示:計算1號課程的學生平均成績。

SELECT AVG(Grade) FROM SC WHERE Cno = '1' ;

案例演示:查詢選修1號課程的學生最高分數。

SELECT MAX(Grade) FROM SC WHERE Cno = '1' ;

案例演示:查詢學生201215012選修課程的總學分數。

SELECT SUM(Ccredit) FROM SC, Course WHERE Sno = '201215012' AND SC.Cno = Course.Cno ;
3.8.1.9、分組查詢

案例演示:求各個課程號及相應的選課人數。

SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno ;
3.8.1.10、過濾查詢

案例演示:查詢選修了3門以上課程的學生學號。

SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) > 3 ;

案例演示:查詢平均成績大於等於90分的學生學號和平均成績。

SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno HAVING AVG(Grade) >= 90 ;

3.8.2、連接查詢

3.8.2.1、等值連接

案例演示:查詢每個學生及其選修課程的情況。

SELECT Student.*,SC.* FROM Student,SC WHERE Student.Sno = SC.Sno ;
3.8.2.2、非等值連接

案例演示:查詢選修2號課程且成績在90分以上的所有學生的學號和姓名。

SELECT Student.Sno,Sname FROM Student,SC WHERE Student.Sno = SC.Sno AND SC.Cno = '2' AND SC.Grade > 90 ;
3.8.2.3、自身連接

案例演示:查詢每一門課的間接先修課(即先修課的先修課)。

SELECT 
  FIRST.Cno,
  SECOND.Cpno 
FROM
  Course FIRST,
  Course SECOND 
WHERE FIRST.Cpno = SECOND.Cno ;
3.8.2.4、外連接

案例演示:查詢每個學生及其選修課程的情況。

SELECT 
  Student.Sno,
  Sname,
  Ssex,
  Sage,
  Sdept,
  Cno,
  Grade 
FROM
  Student 
LEFT JOIN SC ON (Student.Sno = SC.Sno) ;
3.8.2.5、多表連接

案例演示:查詢每個學生的學號、姓名、選修的課程名及成績。

SELECT 
  Student.Sno,
  Sname,
  Cname,
  Grade 
FROM
  Student,
  SC,
  Course 
WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno ;

3.8.3、嵌套查詢

一個SELECT-FROM-WHERE語句稱爲一個查詢塊,將一個查詢塊嵌套在另一個查詢塊的WHERE子句或HAVING短語的條件中的查詢稱爲嵌套查詢,上層的查詢塊稱爲外層查詢或父查詢,下層查詢塊稱爲內層查詢或子查詢,SQL語言允許多層嵌套查詢,即一個子查詢中還可以嵌套其他子查詢,子查詢不能使用ORDER BY子句。

  • 不相關子查詢:子查詢的查詢條件不依賴於父查詢,由裏向外 逐層處理。即每個子查詢在上一級查詢處理之前求解,子查詢的結果用於建立其父查詢的查找條件。
  • 相關子查詢:子查詢的查詢條件依賴於父查詢,首先取外層查詢中表的第一個元組,根據它與內層查詢相關的屬性值處理內層查詢,若WHERE子句返回值爲真,則取此元組放入結果表,然後再取外層表的下一個元組,重複這一過程,直至外層表全部檢查完爲止。
3.8.3.1、帶有比較運算符的子查詢

案例演示:找出每個學生超過他選修課程平均成績的課程號。

SELECT 
  Sno,
  Cno 
FROM
  SC X
WHERE Grade >= 
  (
  SELECT 
    AVG(Grade) 
  FROM
    SC Y
  WHERE y.Sno = x.Sno
  ) ;
3.8.3.2、帶有IN謂詞的子查詢

案例演示:查詢與“劉晨”在同一個系學習的學生。

SELECT 
  Sno,
  Sname,
  Sdept 
FROM
  Student 
WHERE Sdept IN 
  (
  SELECT 
    Sdept 
  FROM
    Student 
  WHERE Sname = '劉晨'
  ) ;
3.8.3.3、帶有ANY或ALL謂詞的子查詢

使用ANY或ALL謂詞時必須同時使用比較運算,語義爲:

  • > ANY:大於子查詢結果中的某個值
  • > ALL:大於子查詢結果中的所有值
  • < ANY:小於子查詢結果中的某個值
  • < ALL:小於子查詢結果中的所有值
  • >= ANY:大於等於子查詢結果中的某個值
  • >= ALL:大於等於子查詢結果中的所有值
  • <= ANY:小於等於子查詢結果中的某個值
  • <= ALL:小於等於子查詢結果中的所有值
  • = ANY:等於子查詢結果中的某個值
  • = ALL:等於子查詢結果中的所有值
  • != ANY:不等於子查詢結果中的某個值
  • != ALL:不等於子查詢結果中的任何一個值

案例演示:查詢非計算機科學系中比計算機科學系任意一個學生年齡小的學生姓名和年齡。

SELECT 
  Sname,
  Sage 
FROM
  Student 
WHERE Sage < ANY (SELECT Sage FROM Student WHERE Sdept = 'CS') 
AND Sdept <> 'CS' ;

案例演示:查詢非計算機科學系中比計算機科學系所有學生年齡都小的學生姓名及年齡。

SELECT 
  Sname,
  Sage 
FROM
  Student 
WHERE Sage < ALL (SELECT Sage FROM Student WHERE Sdept = 'CS') 
AND Sdept <> 'CS' ;
3.8.3.4、帶有EXISTS謂詞的子查詢

帶有EXISTS謂詞的子查詢不返回任何數據,只產生邏輯真值“true”或邏輯假值“false”。

  • 若內層查詢結果非空,則外層的WHERE子句返回真值。
  • 若內層查詢結果爲空,則外層的WHERE子句返回假值。

由EXISTS引出的子查詢,其目標列表達式通常都用 * ,因爲帶EXISTS的子查詢只返回真值或假值,給出列名無實際意義。

NOT EXISTS謂詞:

  • 若內層查詢結果非空,則外層的WHERE子句返回假值。
  • 若內層查詢結果爲空,則外層的WHERE子句返回真值。

案例演示:查詢所有選修了1號課程的學生姓名。

SELECT 
  Sname 
FROM
  Student 
WHERE EXISTS 
  (SELECT 
    * 
  FROM
    SC 
  WHERE Sno = Student.Sno AND Cno = '1'
  ) ;

案例演示:查詢沒有選修1號課程的學生姓名。

SELECT 
  Sname 
FROM
  Student 
WHERE NOT EXISTS 
  (SELECT 
    * 
  FROM
    SC 
  WHERE Sno = Student.Sno AND Cno = '1'
  ) ;

3.8.4、集合查詢

3.8.4.1、並操作UNION

案例演示:查詢計算機科學系的學生及年齡不大於19歲的學生。

SELECT * FROM Student WHERE Sdept = 'CS' 
UNION
SELECT * FROM Student WHERE Sage <= 19 ;

UNION:將多個查詢結果合併起來時,系統自動去掉重複元組。
UNION ALL:將多個查詢結果合併起來時,保留重複元組。

3.8.4.2、交操作INTERSECT

案例演示:查詢計算機科學系的學生與年齡不大於19歲的學生的交集。

SELECT  * FROM Student WHERE Sdept = 'CS'
INTERSECT 
SELECT * FROM Student WHERE Sage <= 19 ;

實際上就是查詢計算機科學系中年齡不大於19歲的學生。

SELECT * FROM Student WHERE Sdept = 'CS' AND Sage <= 19 ;
3.8.4.3、差操作EXCEPT

案例演示:查詢計算機科學系的學生與年齡不大於19歲的學生的差集。

SELECT * FROM Student WHERE Sdept = 'CS' 
EXCEPT 
SELECT * FROM Student WHERE Sage <= 19 ;

實際上是查詢計算機科學系中年齡大於19歲的學生。

SELECT * FROM Student WHERE Sdept = 'CS' AND Sage > 19 ;

3.8.5、派生表查詢

子查詢不僅可以出現在WHERE子句中,還可以出現在FROM子句中,這時子查詢生成的臨時派生表(Derived Table)成爲主查詢的查詢對象。如果子查詢中沒有聚集函數,派生表可以不指定屬性列,子查詢SELECT子句後面的列名爲其缺省屬性。

案例演示:找出每個學生超過他自己選修課程平均成績的課程號。

SELECT Sno,Cno FROM SC,(SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno) AS Avg_sc(avg_sno,avg_grade) 
WHERE SC.Sno = Avg_sc.avg_sno 
AND SC.Grade >= Avg_sc.avg_grade ;

案例演示:查詢所有選修了1號課程的學生姓名。

SELECT 
  Sname 
FROM
  Student,(SELECT Sno FROM SC WHERE Cno = '1') AS SC1 
WHERE Student.Sno = SC1.Sno ;

3.9、數據操縱語言(DML)

3.9.1、插入

3.9.1.1、插入一條數據

語法格式:

INSERT INTO < 表名 > [ (< 屬性列1 > [, < 屬性列2 >) ] 
VALUES (< 常量1 > [, < 常量2 > ]) ;

案例演示:將一個新學生元組(學號:201215128;姓名:陳冬;性別:男;所在系:IS;年齡:18歲)插入到Student表中。

INSERT INTO Student (Sno, Sname, Ssex, Sdept, Sage) 
VALUES('201215128','陳冬','男','IS',18) ;
3.9.1.2、插入多條數據

語法格式:

INSERT INTO < 表名 > [ (< 屬性列1 > [, < 屬性列2 >) ] 
VALUES { (< 常量1 > [, < 常量2 > ]) } ... ;

案例演示:插入兩條學生元組,插入信息自選。

INSERT INTO Student (Sno, Sname, Ssex, Sdept, Sage) 
VALUES('201215129','小明','男','MA',29), ('201215130','小黃','女','CS',30) ;
3.9.1.3、帶子查詢的插入

語法格式:

INSERT INTO < 表名 > [ (< 屬性列1 > [, < 屬性列2 >) ] 
子查詢 ;

案例演示:對每一個系,求學生的平均年齡,並把結果存入數據庫。

第一步:建表

CREATE TABLE Dept_age (
  Sdept CHAR(15) ,
  Avg_age INT
) ;

第二步:插入:

INSERT INTO Dept_age (Sdept, Avg_age) 
SELECT 
  Sdept,AVG(Sage) 
FROM
  Student 
GROUP BY Sdept ;

3.9.2、修改

3.9.2.1、修改一條數據

語法格式:

UPDATE 
  < 表名 > 
SET
  < 列名 >= < 表達式 > [,
  < 列名 >= < 表達式 > ][ WHERE < 條件 > ] ;

案例演示:將學生201215121的年齡改爲22歲。

UPDATE 
  Student 
SET
  Sage = 22 
WHERE Sno = '201215121' ;
3.9.2.2、修改多條數據

語法格式:

UPDATE 
  < 表名 > 
SET
  < 列名 >= < 表達式 > [,
  < 列名 >= < 表達式 > ];

案例演示:將所有學生的年齡增加1歲。

UPDATE 
  Student 
SET
  Sage = Sage + 1 ;
3.9.2.3、帶子查詢的修改

語法格式:

UPDATE 
  < 表名 > 
SET
  < 列名 >= < 表達式 > [,
  < 列名 >= < 表達式 > ][ WHERE < 帶子查詢的條件 > ] ;

案例演示:將計算機科學系全體學生的成績置零。

UPDATE 
  SC 
SET
  Grade = 0 
WHERE Sno IN (SELECT Sno FROM Student WHERE Sdept = 'CS') ;

3.9.3、刪除

3.9.3.1、刪除一條數據

語法格式:

DELETE FROM < 表名 > 
[ WHERE < 條件 > ] ;

案例演示:刪除學號爲201215128的學生記錄。

DELETE FROM Student 
WHERE Sno = '201215128' ;
3.9.3.2、刪除多條數據

語法格式:

DELETE FROM < 表名 > ;

案例演示:刪除所有的學生選課記錄。

DELETE FROM SC ;
3.9.3.3、帶子查詢的刪除

語法格式:

DELETE FROM < 表名 > 
[ WHERE < 帶子查詢的條件 > ] ;

案例演示:刪除計算機科學系所有學生的選課記錄。

DELETE FROM SC 
WHERE Sno IN (SELECT Sno FROM Student WHERE Sdept = 'CS') ;

第四章 數據庫安全性

4.1、數據庫安全性概述

4.1.1、不安全的因素

  1. 非授權用戶對數據庫的惡意存取和破壞
  2. 數據庫中重要或敏感的數據被泄露
  3. 安全環境的脆弱性

4.1.2、安全標準簡介

1985年美國國防部(DoD)正式頒佈《DoD可信計算機系統評估準則》(簡稱TCSEC或DoD85),不同國家建立在TCSEC概念上的評估準則。

  • 歐洲的信息技術安全評估準則(ITSEC)
  • 加拿大的可信計算機產品評估準則(CTCPEC)
  • 美國的信息技術安全聯邦標準(FC)

1993年,CTCPEC、FC、TCSEC和ITSEC聯合行動,解決原標準中概念和技術上的差異,稱爲CC(Common Criteria)項目。

1999年 CC V2.1版被ISO採用爲國際標準。

2001年 CC V2.1版被我國採用爲國家標準,目前CC已基本取代了TCSEC,成爲評估信息產品安全性的主要標準。

image-20201124104442601

1991年4月美國NCSC(國家計算機安全中心)頒佈了《可信計算機系統評估標準關於可信數據庫系統的解釋》( Trusted Database Interpretation 簡稱TDI),TDI又稱紫皮書。它將TCSEC擴展到數據庫管理系統,TDI中定義了數據庫管理系統的設計與實現中需滿足和用以進行安全性級別評估的標準,TCSEC/TDI,從四個方面來描述安全性級別劃分的指標:

  1. 安全策略
  2. 責任
  3. 保證
  4. 文檔

TCSEC/TDI安全級別劃分:

image-20201124104913275

4.2、數據庫安全性控制

4.2.1、用戶身份鑑別

  1. 靜態口令鑑別
  2. 動態口令鑑別
  3. 生物特徵鑑別
  4. 智能卡鑑別

4.2.2、存取控制機制

常用存取控制方法:

  1. 自主存取控制(Discretionary Access Control ,簡稱DAC)
  2. 強制存取控制(Mandatory Access Control,簡稱 MAC)

4.2.3、權限授權回收

權限授權

語法格式:

GRANT < 權限 > [,< 權限 > ] ...
ON < 對象類型 > < 對象名 > [,< 對象類型 > < 對象名 > ] ...
TO < 用戶 > [,< 用戶 > ] ...
[ WITH GRANT OPTION ] ;

WITH GRANT OPTION子句:指定:可以再授予,沒有指定:不能傳播。

案例演示:把查詢Student表權限授給用戶U1。

GRANT SELECT 
ON TABLE Student 
TO U1 ;

案例演示:把對Student表和Course表的全部權限授予用戶U2和U3。

GRANT ALL PRIVILIGES 
ON TABLE Student,Course 
TO U2,U3 ;

案例演示:把對錶SC的查詢權限授予所有用戶。

GRANT SELECT 
ON TABLE SC 
TO PUBLIC ;

案例演示:把查詢Student表和修改學生學號的權限授給用戶U4。

GRANT UPDATE(Sno), SELECT 
ON TABLE Student 
TO U4 ;

案例演示:把對錶SC的INSERT權限授予U5用戶,並允許他再將此權限授予其他用戶。

GRANT INSERT 
ON TABLE SC 
TO U5 
WITH GRANT OPTION ;

權限回收

語法格式:

REVOKE < 權限 > [, < 權限 > ] ...
ON < 對象類型 > < 對象名 > [,< 對象類型 > < 對象名 > ] ... 
FROM < 用戶 > [,< 用戶 > ] ... [ CASCADE | RESTRICT ] ;

案例演示:把用戶U4修改學生學號的權限收回。

REVOKE UPDATE(Sno) 
ON TABLE Student 
FROM U4 ;

案例演示:收回所有用戶對錶SC的查詢權限。

REVOKE SELECT 
ON TABLE SC 
FROM PUBLIC ;

案例演示:把用戶U5對SC表的INSERT權限收回。

REVOKE INSERT 
ON TABLE SC 
FROM U5 CASCADE ;

第五章 數據庫完整性

5.1、實體完整性

關係模型的實體完整性定義:CREATE TABLE中用PRIMARY KEY定義那些列爲主碼。

  • 單屬性構成的碼有兩種說明方法

    • 定義爲列級約束條件

    • 定義爲表級約束條件

  • 多屬性構成的碼有一種說明方法

    • 定義爲表級約束條件

案例演示:將Student表中的Sno屬性定義爲碼。

(1)在列級定義主碼。

CREATE TABLE Student (
  Sno CHAR(9) PRIMARY KEY,
  Sname CHAR(20) NOT NULL,
  Ssex CHAR(2),
  Sage INT,
  Sdept CHAR(20)
) ;

(2)在表級定義主碼。

CREATE TABLE Student (
  Sno CHAR(9),
  Sname CHAR(20) NOT NULL,
  Ssex CHAR(2),
  Sage INT,
  Sdept CHAR(20),
  PRIMARY KEY (Sno)
) ;

(3)將SC表中的Sno,Cno屬性組定義爲主碼。

CREATE TABLE SC (
  Sno CHAR(9) NOT NULL,
  Cno CHAR(4) NOT NULL,
  Grade INT,
  PRIMARY KEY (Sno, Cno)
) ;

5.2、參照完整性

關係模型的參照完整性定義:在CREATE TABLE中用FOREIGN KEY定義哪些列爲外碼。

案例演示:關係SC中(Sno,Cno)是主碼,Sno,Cno分別參照Student表的主碼和Course表的主碼,請定義SC中的參照完整性。

CREATE TABLE SC (
  Sno CHAR(9) NOT NULL,
  Cno CHAR(4) NOT NULL,
  Grade INT,
  /*在表級定義實體完整性*/
  PRIMARY KEY (Sno, Cno),
  /*在表級定義參照完整性*/
  FOREIGN KEY (Sno) REFERENCES Student (Sno),
  /*在表級定義參照完整性*/
  FOREIGN KEY (Cno) REFERENCES Course (Cno)
) ;

5.3、用戶定義的完整性

用戶定義的完整性是:針對某一具體應用的數據必須滿足的語義要求。

關係數據庫管理系統提供了定義和檢驗用戶定義完整性的機制,不必由應用程序承擔。

CREATE TABLE時定義屬性上的約束條件:

  • 列值非空(NOT NULL)
  • 列值唯一(UNIQUE)
  • 檢查列值是否滿足一個條件表達式(CHECK)

案例演示:在定義SC表時,說明Sno、Cno、Grade屬性不允許取空值。

CREATE TABLE SC (
  Sno CHAR(9) NOT NULL,
  Cno CHAR(4) NOT NULL,
  Grade INT NOT NULL,
  PRIMARY KEY (Sno, Cno),
) ;

案例演示:建立部門表DEPT,要求部門名稱Dname列取值唯一,部門編號Deptno列爲主碼。

CREATE TABLE DEPT (
  Deptno INT,
  Dname CHAR(9) UNIQUE NOT NULL, 
  Location CHAR(10),
  PRIMARY KEY (Deptno)
) ;

案例演示:Student表的Ssex只允許取“男”或“女”。

CREATE TABLE Student (
  Sno CHAR(9) PRIMARY KEY,
  Sname CHAR(8) NOT NULL,
  Ssex CHAR(2) CHECK (Ssex IN ('男', '女')),
  Sage INT,
  Sdept CHAR(20)
) ;

在CREATE TABLE時可以用CHECK短語定義元組上的約束條件,即元組級的限制。

案例演示:當學生的性別是男時,其名字不能以Ms.打頭。

CREATE TABLE Student (
  Sno CHAR(9),
  Sname CHAR(8) NOT NULL,
  Ssex CHAR(2),
  Sage INT,
  Sdept CHAR(20),
  PRIMARY KEY (Sno),
  CHECK (Ssex = '女' OR Sname NOT LIKE 'Ms.%')
) ;

5.4、觸發器

觸發器(Trigger)是用戶定義在關係表上的一類由事件驅動的特殊過程。觸發器保存在數據庫服務器中,任何用戶對錶的增、刪、改操作均由服務器自動激活相應的觸發器,觸發器可以實施更爲複雜的檢查和操作,具有更精細和更強大的數據控制能力。

觸發器又叫做事件-條件-動作(event-condition-action)規則。當特定的系統事件發生時,對規則的條件進行檢查,如果條件成立,則執
行規則中的動作,否則不執行該動作。規則中的動作體可以很複雜,通常是一段SQL存儲過程。

5.4.1、定義觸發器

語法格式:

CREATE TRIGGER < 觸發器名 > 
{ BEFORE | AFTER } < 觸發事件 > 
ON < 表名 > 
REFERENCING NEW | OLD ROW AS < 變量 >
FOR EACH { ROW | STATEMENT } 
[ WHEN < 觸發條件 > ] < 觸發動作體 > ;

定義觸發器的語法說明:

  1. 表的擁有者纔可以在表上創建觸發器。
  2. 觸發器名。
    • 觸發器名可以包含模式名,也可以不包含模式名。
    • 同一模式下,觸發器名必須是唯一的。
    • 觸發器名和表名必須在同一模式下。
  3. 表名。
    • 觸發器只能定義在基本表上,不能定義在視圖上。
    • 當基本表的數據發生變化時,將激活定義在該表上相應觸發事件的觸發器。
  4. 觸發事件。
    • 觸發事件可以是INSERT、DELETE或UPDATE也可以是這幾個事件的組合。
    • 還可以UPDATE OF<觸發列,…>,即進一步指明修改哪些列時激活觸發器。
    • AFTER/BEFORE是觸發的時機,AFTER表示在觸發事件的操作執行之後激活觸發器,BEFORE表示在觸發事件的操作執行之前激活觸發器。
  5. 觸發器類型。
    • 行級觸發器(FOR EACH ROW)
    • 語句級觸發器(FOR EACH STATEMENT)
  6. 觸發條件。
    • 觸發器被激活時,只有當觸發條件爲真時觸發動作體才執行;否則觸發動作體不執行。
    • 如果省略WHEN觸發條件,則觸發動作體在觸發器激活後立即執行。
  7. 觸發動作體。
    • 觸發動作體可以是一個匿名PL/SQL過程塊,也可以是對已創建存儲過程的調用。
    • 如果是行級觸發器,用戶都可以在過程體中使用NEW和OLD引用事件之後的新值和事件之前的舊值。
    • 如果是語句級觸發器,則不能在觸發動作體中使用NEW或OLD進行引用。
    • 如果觸發動作體執行失敗,激活觸發器的事件就會終止執行,觸發器的目標表或觸發器可能影響的其他對象不發生任何變化。

注意:不同的RDBMS產品觸發器語法各不相同。

案例演示:當對錶SC的Grade屬性進行修改時,若分數增加了10%,則將此次操作記錄到下面表中:SC_U(Sno,Cno,Oldgrade,Newgrade),其中Oldgrade是修改前的分數,Newgrade是修改後的分數。

CREATE TRIGGER SC_T 
AFTER UPDATE OF Grade 
ON SC 
REFERENCING OLD ROW AS OldTuple,NEW ROW AS NewTuple 
FOR EACH ROW 
WHEN (NewTuple.Grade >= 1.1 * OldTuple.Grade) 
INSERT INTO SC_U(Sno, Cno, OldGrade, NewGrade) 
VALUES
  (
    OldTuple.Sno,
    OldTuple.Cno,
    OldTuple.Grade,
    NewTuple.Grade
  );

5.4.2、刪除觸發器

語法格式:

DROP TRIGGER < 觸發器名 > ON < 表名 > ;

案例演示:刪除觸發器SC_T。

DROP TRIGGER SC_T ON SC ;

第六章 關係數據庫理論

6.1、依賴

6.1.1、函數依賴

專業定義:設R(U)是一個屬性集U上的關係模式,X和Y是U的子集。若對於R(U)的任意一個可能的關係r,r 中不可能存在兩個元組在X上的屬性值相等, 而在Y上的屬性值不等, 則稱“X函數確定Y”或“Y函數依賴於X”,記作X→Y。

案例演示:在關係Student(Sno, Sname, Ssex, Sage, Sdept),假設不允許重名,有:

  • Sno → Sname
  • Sno → Ssex
  • Sno → Sage
  • Sno → Sdept
  • Sname → Sno
  • Sname → Ssex
  • Sname → Sage
  • Sname → Sdept

6.1.2、平凡函數依賴

專業定義:X→Y,但Y⊆X 則稱X→Y是平凡的函數依賴。

6.1.3、非平凡函數依賴

專業定義:X→Y,但Y⊈X則稱X→Y是非平凡的函數依賴。

6.1.4、完全函數依賴

專業定義:

image-20201124210220386

案例演示:在關係SC(Sno, Cno, Grade)中,有:

image-20201124210037735

6.1.5、部分函數依賴

專業定義:

image-20201124210247938

案例演示:在關係SC(Sno, Cno, Grade)中,則有:

image-20201124210037735

6.1.6、傳遞函數依賴

專業定義:

image-20201124210346365

案例演示:在關係Std(Sno, Sdept, Mname)中,有:

  • Sno → SdeptSdept → Mname

6.2、碼

image-20201124212215419

6.3、範式

6.3.1、1NF

作爲二維表,關係要符合一個最基本的條件:每個分量必須是不可分開的數據項。滿足了這個條件的關係模式就屬於第一範式(1NF)。

6.3.2、2NF

若關係模式R∈1NF,並且每一個非主屬性都完全函數依賴於任何一個候選碼,則R∈2NF。

S-L-C(Sno,Sdept,Sloc,Cno,Grade), Sloc爲學生的住處,並且每個系的學生住在同一個地方。S-L-C的碼爲(Sno,Cno)。函數依賴有:

image-20201124210511182

非主屬性Sdept、Sloc並不完全依賴於碼,關係模式S-L-C不屬於2NF。

一個關係模式不屬於2NF,會產生以下問題:

  • 插入異常:如果插入一個新學生,但該生未選課,即該生無Cno,由於插入元組時,必須給定碼值,因此插入失敗。
  • 刪除異常:如果S4只選了一門課C3,現在他不再選這門課,則刪除C3後,整個元組的其他信息也被刪除了。
  • 修改複雜:如果一個學生選了多門課,則Sdept,Sloc被存儲了多次。如果該生轉系,則需要修改所有相關的Sdept和Sloc,造成修改的複雜化。

出現這種問題的原因,例子中有兩類非主屬性:

  1. 一類如Grade,它對碼完全函數依賴。
  2. 另一類如Sdept、Sloc,它們對碼不是完全函數依賴。

解決方法:用投影分解把關係模式S-L-C分解成兩個關係模式

  • SC(Sno,Cno,Grade)
  • S-L(Sno,Sdept,Sloc)

SC的碼爲(Sno,Cno)、SL的碼爲Sno,這樣使得非主屬性對碼都是完全函數依賴了。

6.3.3、3NF

image-20201124210737877

6.3.4、BCBF

BCNF(Boyce Codd Normal Form)由Boyce和Codd提出,比3NF更進了一步。通常認爲BCNF是修正的第三範式,有時也稱爲擴充的第三範式。設關係模式R<U,F>∈1NF,若X →Y且Y ∉ X時,X必含有碼,則R<U,F>∈BCNF。換言之,在關係模式R<U,F>中,如果每一個決定屬性集都包含候選碼,則R∈BCNF。

BCNF的關係模式所具有的性質:

  • 所有非主屬性都完全函數依賴於每個候選碼
  • 所有主屬性都完全函數依賴於每個不包含它的候選碼
  • 沒有任何屬性完全函數依賴於非碼的任何一組屬性

如果一個關係數據庫中的所有關係模式都屬於BCNF,那麼在函數依賴範疇內,它已實現了模式的徹底分解,達到了最高的規範化程度,消除了插入異常和刪除異常。

考察關係模式C(Cno,Cname,Pcno),它只有一個碼Cno,沒有任何屬性對Cno部分依賴或傳遞依賴,所以C∈3NF。

同時C中Cno是唯一的決定因素,所以C∈BCNF。

第七章 數據庫恢復技術

7.1、事務

7.1.1、事務的概念

所謂事務是用戶定義的一個數據庫操作序列,這些操作要麼全做要麼全不做,是一個不可分割的工作單位。例如,在關係數據庫中,一個事務可以是一條SQL語句、一組SQL語句或整個程序。事務和程序是兩個概念。一般地講,一個程序中包含多個事務。

7.1.2、事務的語句

在SQL語言中,定義事務的語句有三條:

  • begin transaction (或者 BEGIN TRANSACTION)
  • commit (或者 COMMIT)
  • rollback (或者 ROLLBACK)

事務通常是以BEGIN TRANSACTION開始,以COMMIT或ROLLBACK結束。COMMIT表示提交,即提交事務的所有操作。

7.1.3、事務的特性

事務具有四個特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持續性(Durability)。這個四個特性也簡稱爲ACID特性。

  1. 原子性:事務是數據庫的邏輯工作單位,事務中包括的諸操作要麼都做,要麼都不做。
  2. 一致性:事務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。因此當數據庫只包含成功事務提交的結果時,就說數據庫處於一致性狀態。如果數據庫系統運行中發生故障,有些事務尚未完成就被迫中斷,(第一個操作是從賬號A中減去一萬元,第二個操作是向賬號B中加入一萬元。這兩個操作要麼全做,要麼全不做)。
  3. 隔離性:一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數據對其他併發事務是隔離的,併發執行的各個事務之間不能互相干擾。
  4. 持續性:持續性也稱永久性(Permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其執行結果有任何影響。

注:事務是恢復和併發控制的基本單位。

事務ACID特性可能遭到破壞的因素有:

  1. 多個事務並行運行時,不同事務的操作交叉執行
  2. 事務在運行過程中被強行停止

7.2、數據庫恢復

儘管數據庫系統中採取了各種保護措施來防止數據庫的安全性和完整性被破壞,保證併發事務的正確執行,但是計算機系統中硬件的故障、軟件的錯誤、操作員的失誤以及惡意的破壞仍是不可避免的,這些故障輕則造成運行事務非正常中斷,影響數據庫中數據的正確性,重則破壞數據庫,使數據庫中全部或部分數據丟失,因此數據庫管理系統必須具有把數據庫從錯誤狀態恢復到某一已知的正確狀態(亦稱爲一致狀態或完整狀態)的功能,這就是數據庫的恢復。

7.3、故障的種類

  1. 事務內部的故障:事務內部的故障有的是可以通過事務程序本身發現的,有的是非預期的,不能由事務程序處理的。事務內部更多的故障是非預期的,是不能由應用程序處理的。如運算溢出、併發事務發生死鎖而被選中撤銷該事務、違反了某些完整性限制等。以後,事務故障僅指這類非預期的故障。事務故障意味着事務沒有達到預期的終點(COMMIT或者顯式的ROLLBACK),因此,數據庫可能處於不正確狀態。恢復程序要在不影響其他事務運行的情況下,強行回滾(ROLLBACK)該事務,即撤銷該事務已經作出的任何對數據庫的修改,使得該事務好像根本沒有啓動一樣。
  2. 系統故障(俗稱軟故障):系統故障是指造成系統停止運轉的任何事件,使得系統要重新啓動。例如,特定類型的硬件錯誤(CPU故障)、操作系統故障、DBMS代碼錯誤、突然停電等。這類故障影響正在運行的所有事務,但不破壞數據庫。這時主存內容,尤其是數據庫緩衝區(在內存)中的內容都被丟失,所有運行事務都非正常終止。
  3. 介質故障(俗稱硬故障):系統故障常稱爲軟故障(Soft Crash),介質故障稱爲硬故障(Hard Crash)。硬故障指外存故障,如磁盤損壞、磁頭碰撞,瞬時強磁場干擾等。這類故障將破壞數據庫或部分數據庫,並影響正在存取這部分數據的所有事務。這類故障比前兩類故障發生的可能性小得多,但破壞性最大。

7.4、恢復的機制

恢復機制涉及的兩個關鍵問題是:

  1. 第一,如何建立冗餘數據;(最常用的技術是數據轉儲和登錄日誌文件)
  2. 第二,如何利用這些冗餘數據實施數據庫恢復。

7.4.1、數據轉儲

數據轉儲是數據庫恢復中採用的基本技術。所謂轉儲即DBA定期地將整個數據庫複製到磁帶或另一個磁盤上保存起來的過程。這些備用的數據文本稱爲後備副本或後援副本。轉儲是十分耗費時間和資源的,不能頻繁進行。DBA應該根據數據庫使用情況確定一個適當的轉儲週期。轉儲可分爲靜態轉儲和動態轉儲。

  • 靜態轉儲是在系統中無運行事務時進行的轉儲操作。
  • 動態轉儲可克服靜態轉儲的缺點,它不用等待正在運行的用戶事務結束,也不會影響新事務的運行。但是,轉儲結束時後援副本上的數據並不能保證正確有效。

7.4.2、登錄日誌文件

登錄日誌文件的格式:

日誌文件是用來記錄事務對數據庫的更新操作的文件。不同數據庫系統採用的日誌文件格式並不完全一樣。

概括起來日誌文件主要有兩種格式:以記錄爲單位的日誌文件和以數據塊爲單位的日誌文件。

對於以記錄爲單位的日誌文件,日誌文件中需要登記的內容包括:

  • 各個事務的開始(BEGIN TRANSACTION)標記
  • 各個事務的結束(COMMIT或ROLLBACK)標記
  • 各個事務的所有更新操作

注意:這裏每個事務開始的標記、每個事務的結束標記和每個更新操作均作爲日誌文件中的一個日誌記錄(log record)。

登錄日誌文件的內容:

  • 事務標識(標明是哪個事務)
  • 操作的類型(插入、刪除或修改)
  • 操作對象(記錄內部標識)
  • 更新前數據的舊值(對插入操作而言,此項爲空值)
  • 更新後數據的新值(對刪除操作而言, 此項爲空值)

對於以數據塊爲單位的日誌文件,日誌記錄的內容包括事務標識和被更新的數據塊。由於將更新前的整個塊和更新後的整個塊都放入日誌文件中,操作的類型和操作對象等信息就不必放入日誌記錄中。

登錄日誌文件的作用:

  1. 事務故障恢復和系統故障必須用日誌文件。
  2. 在動態轉儲方式中必須建立日誌文件,後援副本和日誌文件綜合起來纔能有效地恢復數據庫。
  3. 在靜態轉儲方式中,也可以建立日誌文件。當數據庫毀壞後可重新裝入後援副本把數據庫恢復到轉儲結束時刻的正確狀態,然後利用日誌文件,把已完成的事務進行重做處理,對故障發生時尚未完成的事務進行撤銷處理。這樣不必重新運行那些已完成的事務程序就可把數據庫恢復到故障前某一時刻的正確狀態。

登錄日誌文件的原則:

爲保證數據庫是可恢復的,登記日誌文件時必須遵循兩條原則:

  • 登記的次序嚴格按併發事務執行的時間次序。
  • 必須先寫日誌文件,後寫數據庫。

7.5、恢復的策略

當系統運行過程中發生故障,利用數據庫後備副本和日誌文件就可以將數據庫恢復到故障前的某個一致性狀態。

不同故障其恢復策略和方法也不一樣。

7.5.1、事務故障的恢復

事務故障是指事務在運行至正常終止點前被終止,這時恢復子系統應利用日誌文件撤銷(UNDO)此事務已對數據庫進行的修改。事務故障的恢復是由系統自動完成的,對用戶是透明的。系統的恢復步驟是:

  1. 反向掃描文件日誌(即從最後向前掃描日誌文件),查找該事務的更新操作。
  2. 對該事務的更新操作執行逆操作。 即將日誌記錄中"更新前的值"寫入數據庫。這樣,如果記錄中是插入操作,則相當於做刪除操作(因此時"更新前的值"爲空);若記錄中是刪除操作,則做插入操作;若是修改操作,則相當於用修改前值代替修改後值。
  3. 繼續反向掃描日誌文件,查找該事務的其他更新操作,並做同樣處理。
  4. 如此處理下去,直至讀到此事務的開始標記,事務故障恢復就完成了。

7.5.2、系統故障的恢復

系統故障造成數據庫不一致狀態的原因有兩個,一是未完成事務對數據庫的更新可能已寫入數據庫,二是已提交事務對數據庫的更新可能還留在緩衝區沒來得及寫入數據庫。因此恢復操作就是要撤銷故障發生時未完成的事務,重做已完成的事務。系統故障的恢復是由系統在重新啓動時自動完成的,不需要用戶干預。系統的恢復步驟是:

  1. 正向掃描日誌文件(即從頭掃描日誌文件),找出在故障發生前已經提交的事務(這些事務既有BEGIN TRANSACTION記錄,也有COMMIT 記錄),將其事務標識記入重做(REDO)隊列。同時找出故障發生時尚未完成的事務(這些事務只有BEGIN TRANSACTION記錄,無相應的COMMIT記錄),將其事務標識記入撤銷隊列。
  2. 對撤銷隊列中的各個事務進行撤銷(UNDO)處理。進行UNDO處理的方法是,反向掃描日誌文件,對每個UNDO事務的更新操作執行逆操作,即將日誌記錄中"更新前的值"寫入數據庫。
  3. 對重做隊列中的各個事務進行重做(REDO)處理。進行REDO處理的方法是:正向掃描日誌文件,對每個REDO事務重新執行日誌文件登記的操作。即將日誌記錄中"更新後的值"寫入數據庫。

7.5.3、介質故障的恢復

發生介質故障後,磁盤上的物理數據和日誌文件被破壞,這是最嚴重的一種故障,恢復方法是重裝數據庫,然後重做已完成的事務。具體地說就是:

  1. 裝入最新的數據庫後備副本(離故障發生時刻最近的轉儲副本),使數據庫恢復到最近一次轉儲時的一致性狀態。對於動態轉儲的數據庫副本,還需同時裝入轉儲開始時刻的日誌文件副本,利用恢復系統故障的方法(即REDO+UNDO),才能將數據庫恢復到一致性狀態。
  2. 裝入相應的日誌文件副本(轉儲結束時刻的日誌文件副本),重做已完成的事務。即首先掃描日誌文件,找出故障發生時已提交的事務的標識,將其記入重做隊列。然後正向掃描日誌文件,對重做隊列中的所有事務進行重做處理。即將日誌記錄中"更新後的值"寫入數據庫。

第八章 數據庫併發控制

8.1、併發控制概述

事務是併發控制的基本單位,併發控制機制的任務,對併發操作進行正確調度,保證事務的隔離性,保證數據庫的一致性,併發操作帶來的數據不一致性會導致以下問題:

  • 丟失修改(Lost Update)
  • 不可重複讀(Non-repeatable Read)
  • 讀“髒”數據(Dirty Read)

爲了充分利用系統資源發揮數據庫共享資源的特點,應該允許多個事務並行地執行。

在單處理機系統中,事務的並行執行實際上是這些並行事務的並行操作輪流交叉運行。這種並行執行方式稱爲交叉併發方式(Interleaved Concurrency)。雖然單處理機系統中的並行事務並沒有真正地並行運行,但是減少了處理機的空閒時間,提高了系統的效率。

在多處理機系統中,每個處理機可以運行一個事務,多個處理機可以同時運行多個事務,實現多個事務真正的並行運行。這種並行執行方式稱爲同時併發方式(Simultaneous Concurrency)。本章討論的數據庫系統併發控制技術是以單處理機系統爲基礎的。這些理論可以推廣到多處理機的情況。

當多個用戶併發地存取數據庫時就會產生多個事務同時存取同一數據的情況。若對併發操作不加控制就可能會存取和存儲不正確的數據,破壞數據庫的一致性。所以數據庫管理系統必須提供併發控制機制。併發控制機制是衡量一個數據庫管理系統性能的重要標誌之一。

8.2、封鎖概述

封鎖是實現併發控制的一個非常重要的技術。所謂封鎖就是事務T在對某個數據對象例如表、記錄等操作之前,先向系統發出請求,對其加鎖。在事務T釋放它的鎖之前,其他的事務不能更新此數據對象。
確切的控制由封鎖的類型決定。基本的封鎖類型有兩種: 排它鎖(Exclusive Locks,簡稱X鎖) 和共享鎖(Share Locks,簡稱S鎖)。

1. 排它鎖又稱爲寫鎖(X)。若事務T對數據對象A加上X鎖,則只允許T讀取和修改A,其他任何事務都不能再對A加任何類型的鎖,直到T釋放A上的鎖。
2. 共享鎖又稱爲讀鎖(S)。若事務T對數據對象A加上S鎖,則事務T可以讀A但不能修改A,其他事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。這就保證了其他事務可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改。

8.3、封鎖協議

在運用X鎖和S鎖這兩種基本封鎖,對數據對象加鎖時,還需要約定一些規則,例如何時申請X鎖或S鎖、持鎖時間、何時釋放等。稱這些規則爲封鎖協議(Locking Protocol)。

  • 一級封鎖協議: 事務T在修改數據R之前必須先對其加X鎖,直到事務結束才釋放。事務結束包括正常結束(COMMIT)和非正常結束(ROLLBACK)。一級封鎖協議可防止丟失修改,並保證事務T是可恢復的。在一級封鎖協議中,如果僅僅是讀數據不對其進行修改,是不需要加鎖的,所以它不能保證可重複讀和不讀"髒"數據。
  • 二級封鎖協議: 一級封鎖協議加上事務T在讀取數據R之前必須先對其加S鎖,讀完後即可釋放S鎖。二級封鎖協議除防止了丟失修改,還可進一步防止讀"髒"數據。在二級封鎖協議中,由於讀完數據後即可釋放S鎖,所以它不能保證可重複讀。
  • 三級封鎖協議: 一級封鎖協議加上事務T在讀取數據R之前必須先對其加S鎖,直到事務結束才釋放。三級封鎖協議除防止了丟失修改和不讀"髒"數據外,還進一步防止了不可重複讀。

上述三級協議的主要區別在於什麼操作需要申請封鎖,以及何時釋放鎖(即持鎖時間)。

8.4、活鎖和死鎖

和操作系統一樣,封鎖的方法可能引起活鎖和死鎖。
活鎖 :如果事務T1封鎖了數據R,事務T2又請求封鎖R,於是T2等待。T3也請求封鎖R,當T1釋放了R上的封鎖之後系統首先批准了T3的請求,T2仍然等待。然後T4又請求封鎖R,當T3釋放了R上的封鎖之後系統又批准了T4的請求……T2有可能永遠等待,這就是活鎖的情形。避免活鎖的簡單方法是採用先來先服務的策略
死鎖 :如果事務T1封鎖了數據R1,T2封鎖了數據R2,然後T1又請求封鎖R2,因T2已封鎖了R2,於是T1等待T2釋放R2上的鎖。接着T2又申請封鎖R1,因T1已封鎖了R1,T2也只能等待T1釋放R1上的鎖。這樣就出現了T1在等待T2,而T2又在等待T1的局面,T1和T2兩個事務永遠不能結束,形成死鎖。

死鎖的預防:

  1. 一次封鎖法:要求每個事務必須一次將所有要使用的數據全部加鎖,否則就不能繼續執行,一次封鎖法雖然可以有效地防止死鎖的發生,但也存在問題:
    • 擴大了封鎖的範圍,從而降低了系統的併發度。
    • 數據庫中數據是不斷變化的,原來不要求封鎖的數據,在執行過程中可能會變成封鎖對象,所以很難事先精確地確定每個事務所要封鎖的數據對象,爲此只能擴大封鎖範圍,將事務在執行過程中可能要封鎖的數據對象全部加鎖,這就進一步降低了併發度。
  2. 順序封鎖法:順序封鎖法是預先對數據對象規定一個封鎖順序,所有事務都按這個順序實行封鎖。例如在B樹結構的索引中,可規定封鎖的順序必須是從根結點開始,然後是下一級的子女結點,逐級封鎖。順序封鎖法可以有效地防止死鎖,但也同樣存在問題:
    • 數據庫系統中封鎖的數據對象極多,並且隨數據的插入、刪除等操作而不斷地變化,要維護這樣的資源的封鎖順序非常困難,成本很高。
    • 事務的封鎖請求可以隨着事務的執行而動態地決定,很難事先確定每一個事務要封鎖哪些對象,因此也就很難按規定的順序去施加封鎖。

死鎖的診斷:

  1. 超時法:如果一個事務的等待時間超過了規定的時限,就認爲發生了死鎖。
  2. 等待圖法:事務等待圖是一個有向圖G=(T,U)。T爲結點的集合,每個結點表示正運行的事務;U爲邊的集合,每條邊表示事務等待的情況。若T1等待T2,則T1,T2之間劃一條有向邊,從T1指向T2。事務等待圖動態地反映了所有事務的等待情況。併發控制子系統週期性地(比如每隔1 min)檢測事務等待圖,如果發現圖中存在迴路,則表示系統中出現了死鎖。

8.5、併發調度的可串行性

多個事務的併發執行是正確的,當且僅當其結果與按某一次序串行地執行它們時的結果相同,我們稱這種調度策略爲可串行化(Serializable)的調度。可串行性(Serializability)是併發事務正確性的準則。按這個準則規定,一個給定的併發調度,當且僅當它是可串行化的,才認爲是正確調度。爲了保證併發操作的正確性,DBMS的併發控制機制必須提供一定的手段來保證調度是可串行化的。從理論上講,在某一事務執行時禁止其他事務執行的調度策略一定是可串行化的調度,這也是最簡單的調度策略,但這種方法實際上是不可取的,這使用戶不能充分共享數據庫資源。目前DBMS普遍採用封鎖方法實現併發操作調度的可串行性,從而保證調度的正確性。兩段鎖(Two-Phase Locking,簡稱2PL)協議就是保證併發調度可串行性的封鎖協議。除此之外還有其他一些方法,如時標方法、樂觀方法等來保證調度的正確性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章