1. 程式人生 > >資料庫系統期末複習

資料庫系統期末複習

資料庫期末複習

文章目錄

2. 關係模式介紹

2.1 關係資料庫的結構

  1. 關係資料庫由表的集合構成,每個表有唯一的名字。
  2. 在關係模型的術語中,關係用來指代表, 而元組用來指代行。屬性指代的是表的列。
  3. 關係例項(relation instance)指代的是一個關係的特定例項,也就是所包含的一組特定的行。
  4. 對於表中的每個屬性,都有一個允許取值的集合,稱為該屬性的域(domain)
  5. 表中所有屬性的值都必須的原子的(即不可再分的)。
  6. 每個域中都包含null(表示空的、不存在的)。
  7. 關係:兩個集合的笛卡爾積的任意子集叫做關係。

2.2 資料庫模式

  1. 資料庫模式:資料庫的邏輯設計
  2. 資料庫例項:給定時刻資料庫中資料的一個快照
  3. 關係的概念對應程式語言中變數的概念,而關係模式對應程式語言中型別定義的概念。
  4. R = ( A 1 , A 2 , , A n ) R = (A1, A2, …, An ) `就是一個關係模式,我們使用大寫字母開頭 的名字來代表關係模式如,Instructor_schema = (ID, name, dept_name, salary),用小寫字母開頭的名字來代表關係,如 instructor (Instructor _schema)

2.3 碼(key)

  1. 一個元組的屬性值必須是能夠唯一區分元組的。即一個關係中沒有兩個元組在所有屬性的取值上相同。
  2. 超碼(superkey)是一個或多個屬性的集合,這些屬性的集合可以使我們在一個關係中唯一的標識一個元組。
  3. 如果K是一個超碼,那麼K的任意超集也都是超碼。
  4. 如果K是一個超碼,且它的任意真子集都不能稱為超碼,那麼稱K是候選碼(candidate key)
  5. 候選碼可能有多個。
  6. 主碼(primary key)代表被資料庫設計者選中的,主要用來在一個關係中區分不同元組的候選碼
  7. 一個關係模式(如r1)可能在它的屬性中包含另一個關係模式(r2)的主碼。這個屬性在r1上被稱為參照r2的外碼。
  8. 參照完整性約束:要求在參照關係中任意元組在特定屬性上的取值必然等於被參照關係中某個元組在特定屬性上的取值。

2.4 模式圖

  1. 一個含有主碼和外碼依賴的資料庫模式可以用模式圖(schema diagram)表示。

2.6 關係運算

  1. 最常用的關係運算是從單個關係(如instructor)中選出一些滿足特定謂語(如salary>85000)的特殊元組,其結果是一個新關係,它是原始關係的一個子集。
  2. 另一個常用的運算是從一個關係中選出特定的屬性(列)。其結果是一個只包含那些被選擇屬性的新關係。
  3. 連線運算可以通過一些方式把分別來自兩個關係的元組對合併成單個元組。
  4. 關係代數提供了一組運算,他們以一個或多個關係作為輸入,返回一個關係作為輸出。

3.SQL

1. 資料型別:

  • char(n):固定長度的字串,使用者指定長度。
  • varchar(n):可變長度的字串,使用者指定最大長度n。等價於全稱character varying。
  • Int:整數型別。
  • smallInt:小整數型別。
  • numeric(p, d):定點數,精度由使用者指定。這個數有p位數字(加上一個符號位)。其中d位數字在小數點右邊。
  • real, double precision:浮點數與雙精度浮點數。
  • float(n):精度至少為n位的浮點數。

2. 建表結構:

create table instructor(
    ID char(5),
    name varchar(20),
    dept_name varchar(20),
    salary numeric(8,2)
    primaey key (ID)
);

3. 指定主鍵

create table instructor(
    ID char(5) primary key,
    name varchar(20),
    dept_name varchar(20),
    salary numeric(8,2)
);create table instructor(
    ID char(5) constraint PK_1 primary key,
    name varchar(20),
    dept_name varchar(20),
    salary numeric(8,2)
    primaey key (ID)
);

主鍵如有多個屬性值則

create table instructor(
    ID char(5),
    name varchar(20),
    dept_name varchar(20),
    salary numeric(8,2)
    primaey key (ID, name, salary)
);

4. 指定外碼

create table instructor(
    ID char(5),
    name varchar(20),
    dept_name varchar(20) references department,
    salary numeric(8,2)
);create table instructor(
    ID char(5),
    name varchar(20),
    dept_name varchar(20),
    salary numeric(8,2),
    foreign key(dept_name) references department
);

5. 刪除表

//從資料庫中刪除一個關係,連資料庫模式一併刪除
drop table instructor

6. 刪除表中內容

//僅刪除表中內容
delete from instructor

7. 為現有關係新增屬性

alter table instructor add varchar(20) address

關係中所有元組的新增屬性的值都為null。

8. 從現有關係中刪去屬性

alter instructor drop address

9. 單關係查詢

select name
from instructor

上面的程式碼即為從instructor中查詢所有的name,有時候我們想要刪掉重複,可加入關鍵詞distinct,例如

select distinct name
from instructor

select子句還可帶有算術表示式,例如

select ID, name, dept_name, salary*1.1
from instructor

上面這段程式碼會返回一個與insructor一樣的關係,只是salary屬性是原來的1.1倍,注意原關係並不發生改變。

where子句允許我們只需選出那些在from子句的結果關係中滿足特定謂詞的元組。例如

select name
from instructor
where dept_name = 'Comp.Sci' and salary > 70000;
**上面這段程式碼意為找出所有在Computer Science系並且工資超過70000的教師的名字。**

10. 多關係查詢

select name, instructor. dept_name, building
from instructor, department
where instructor.dept_name = department.dept_name;

上述程式碼的意圖是“找出所有教師的姓名,以及他們所在系的名稱和系所在建築的名稱。”

注:1、dept_name屬性既出現在instructor關係中,也出現在department中,關係名被用作字首來說明我們是用的是哪個屬性。2、儘管子句是以select,from,where的次序寫出,但是實際運算的順序是from,where,select。即先求出from選中的關係的笛卡爾積,這個笛卡爾積有大量無效的元組,然後where子句中的位於可用來限制笛卡爾積所建立的組合,最後輸出select子句中指定的屬性。

11. 自然連線(natural join)

自然連線運算作用於兩個關係,併產生一個關係作為結果。自然連線只考慮那些在兩個關係模式中都出現的屬性上取值相同的元組對。所以對於查詢“大學中所有講授課程的教師,找出他們的姓名以及所講述的所有課程標識”,我們可以這麼寫

select name, course_id
from instructor natural join teaches

為了避免不必要的相等屬性帶來的危險,我們還可以使用自然連線的另一種構造形式

select name, title
from (instructor natural join teaches) join course using(course_id);

注:join…using…運算中需要給定一個屬性名列表,其兩個輸入都必須具有指定名稱的屬性。(using用來指定需要相同的是哪個屬性)

12. 更名運算

我們並不總能直接使用屬性名。原因在於首先,from子句中的兩個關係可能存在同名的屬性。其次,如果在select子句中使用了算術表示式,那麼屬性就沒有名字。因此,我們可以使用old-name as new-name的語法來改變結果中屬性的名字

select name as instructor_name, course_id
from instructor, teaches
where instructor.ID = teaches.ID;

重新命名還可以把一個長的關係名替換成短的,這樣在查詢的其他地方使用時就會方便。例如

select T.name , S.course_id
from instructor as T, teaches as S
where T.ID = S.ID;

重新命名的另一個重要原因是為了適用於需要比較同一個關係中元組的情況。為此我們需要把一個關係與他自身進行笛卡爾積運算,如果不重新命名就不可能把一個元組與另一個區分開來。例如我們要查詢“滿足條件的所有教師的名字,他們的工資至少比Biology系的某一個教師的工資要高”

select distinct T.name
from instructor as T, instructor as S
where T.ID = S.ID;

T、S準確的說是被宣告為instructor的別名。在SQL標準中被稱作相關名稱(correlation name),但也經常被稱為表別名(table alias),或相關變數(correlation variable),或者 元組變數(tuple variable)

13. 排列元組的顯示次序

order by子句可以讓查詢結果按排列順序顯示,例如

select name
from instructor
where dept_name = 'Physics'
order by name;

該段程式碼可以按字母序列出Physics系的所有教師名字。

order by語句預設使用升序,要使用降序可以用desc來表示,或者使用asc來明確是升序。假設我們想按salary的降序列出整個instructor關係,如果有工資相同的,則按姓名升序排列,則表示如下:

select *
from instructor
order by salary desc, name asc;

14. where子句謂語

SQL提供betwenn比較運算子來說明一個值是小於或等於某個值,同時大於或等於某個值。如果我們想找出工資在90000美元和100000美元之間的教師的名字,可以這樣寫:

select name
from instructor
where salary between 90000 and 100000;

類似的也可以使用not between語法

15. 並運算

為了找出在2009年秋季,或者在2010年春季開課或兩個學期都開課的所有課程。程式碼如下:

select course_id
  from section
  where semester = 'Fall' and year = 2009unionselect course_id
  from section
  where semester = 'Spring' and year = 2010;

注:union運算自動去重。若想保留重複則用union all語句。

16. 交運算

為了找出在2009年秋季和2010年春季同時開課的所有課程的集合。程式碼如下:

select course_id
  from section
  where semester = 'Fall' and year = 2009Intersectselect course_id
  from section
  where semester = 'Spring' and year = 2010;

同樣的若想保留重複,可以使用Intersect all語句。

17. 差語句

為了找出在2009年秋季開課但沒有在2010年春季開課的所有課程,程式碼如下:

select course_id
  from section
  where semester = 'Fall' and year = 2009exceptselect course_id
  from section
  where semester = 'Spring' and year = 2010;

注:使用except all可以保留重複。

3. 中級SQL

1. 左外連線、右外連線、全外連線

2. 連線條件(on)

select *
from student join takes on student.ID = takes.ID
//與下面的查詢相同

select *
from student, takes
where student.ID = takes.ID

與自然連線不同的是上述查詢會導致ID出現兩遍。

3. 檢視

1. 虛關係

SQL允許通過查詢來定義虛關係,它在概念上包含查詢的結果。虛關係並不預先計算和儲存。而是在使用虛關係的時候才執行查詢被計算出來。

2. 檢視的定義

使用create view命令來定義檢視。

create view v as <查詢表示式>

例如,

create view faculty as
select ID,name,dept_name
from instructor

還可以顯式指定檢視中的屬性名

create view department_total_salary(dept_name, total_salary) as
select dept_name. sum(salary)
from instructor
group by dept_name

4. 在查詢中使用檢視

例如

select dept_name
from department_total_salary
where total_salary > 10000;

5. 物化檢視

特定資料庫系統允許儲存檢視關係,但是它們保證:如果用於定義檢視的實際關係改變,檢視也跟著的修改。這樣的檢視稱為物化檢視

保持物化檢視一直在最新狀態的過程稱為物化檢視維護(materialized view maintainance)。通常簡稱檢視維護

6. 檢視更新

如果定義檢視的查詢滿足下列條件,則稱SQL檢視是可更新的:

  • from子句中只有一個數據庫關係
  • select子句中只包含關係的屬性名,不包含任何表示式、聚集或distinct宣告。
  • 任何沒有出現在select子句中的屬性可以取空值,也就是這些屬性沒有not null約束,也不構成主碼的一部分。
  • 查詢中不包括group by和having子句。

2. 完整性約束

完整性約束保證授權使用者對資料庫所做的修改不會破壞資料的一致性。因此,完整性約束防止的是對資料的意外破壞。

1.not null 約束

例如

name varchar(20) not null

2. unique約束

例如

unique(ID,dept_name)

unique宣告指出了括號中的屬性形成了一個候選碼。即在關係中沒有兩個元組能在所有列出的屬性上取值相同。然而 候選碼的取值可以為空。因為空值不等於其他任何值。

3. check約束

通常用check子句來保證屬性值滿足指定的條件。例如,

create table section
(
    course_id varchar(20),
    semester varchar(10),
    check(semester in ('Fall', 'Summer', 'Autumn', 'Winter'))
);

3. 參照完整性

我們往往希望保證在一個關係中給定屬性集上的取值也在另一關係的特定屬性集的取值中出現,這種情況稱為參照完整性。

外碼宣告foreign key(dept_name) references department表名在每個課程元組中指定的系名必須在department關係中存在。沒有這個約束,就會為一門課程指定了一個不存在的系名。

這種要求稱為參照完整性約束(referential-intergrity constraint)或子集依賴(subset dependency)。

當違反參照完整性約束時,通常的處理是拒絕執行導致完整性破壞的操作。但是,在foreign key子句中可以致命如果被參照關係上的刪除或更新動作違反了約束,那麼系統必須採取一些步驟通過修改參照關係中的元組來恢復完整性約束。例如,on delete cascade 或 on update cascade

這種情況下如果刪除了department中的元組導致了此參照的完整性約束被違反,則該刪除不被系統拒絕,而是做級聯的刪除操作。即刪除參照了被刪除關係中的元組。

4. 事務中對完整性約束的違反

可能會在事務處理的中間步驟違反了完整性約束,而事務結束後沒有違反。為了處理這樣的情況,SQL標準允許將initially deferred 子句加入到約束宣告中。這樣的話完整性約束不是在事務的中間步驟上檢查,而是在事務結束時檢查。

5.複雜check條件與斷言

check子句中的謂語可以是包含子查詢的任意謂詞,例如,在關係section上宣告如下所示的參照完整性約束

check(time_slot_id in (select time_slot_id from time_slot))))

這個check條件檢測,檢查在section關係中每個元組的time_slot_id的確是在time_slot關係中的。

6. SQL的資料型別與模式

1.預設值

SQL允許為屬性指定預設值,例如

create table student
(
    ID varchar(5),
    name varchar(20) not null,
    dept_name varchar(20) default 'normal'primary key(ID)
);

2. 大物件型別

SQL提供字元資料的大物件資料型別(clob)和二進位制資料的大物件資料型別blob。lob代表(Large Object)。例如

book_review clob (10KB)
image blob (10MB)
movie blob (2GB)

7. 許可權的授予與收回

SQL標準包括select、insert、update和delete許可權。所有許可權(all privileges)可以作為所有允許許可權的簡寫形式。語句的基本形式如下

grant <許可權列表>
on <關係名或檢視名>
to <使用者/使用者列表>

授予查詢許可權:

grant select on department to User

許可權列表後可以接屬性名,意思是為該關係中的這些屬性授予相應許可權。例如

grant update (budget) on department to User

意思是授予使用者User在department關係的budget屬性上的更新許可權。

我們使用revoke語句來收回使用者許可權,形式與grant一致。

4. 資料庫設計和E-R模型

4.1 實體-聯絡模型(entity-relationship)

E-R模型在將顯示世界實體的含義和和互動對映到概念模式上非常有效,因此,許多資料庫設計工具都利用了E-R模型的概念。E-R資料模型採用了三個基本概念:實體集、聯絡集和屬性

4.2 實體集

實體是現實世界中可區別與所有其他物件的一個“事物”或“物件”。例如,大學中每一個人都是一個實體。每個實體有一組性質,其中的一些性質課以唯一的標識一個實體。例如身份證號可以唯一的標識一個人。

實體集(entity set) 是相同型別即具有相同性質或屬性的一個實體集合。例如,一所大學的所有老師的集合可定義為實體集。

實體通過一組屬性來表示。屬性是實體集中每個成員所擁有的描述性性質。為某實體集指定一個屬性表名資料庫為該實體集中每個實體儲存相似的資訊,但每個實體在每個屬性上都有各自不同的值。

因此,資料庫包含一組實體集,每個實體集包括任意數量的相同型別的實體。

4.3 聯絡集

聯絡(relation) 是指多個實體間的相互關聯。例如,我們可以定義關聯某個老師和某個學生的聯絡advisor,這一關係表面該名老師是該名學生的導師。

聯絡集(relationship set) 是相同型別聯絡的集合。正規的說,聯絡集是 n 2 n≥2 個實體集上的數學關係。如果$E_1,E_2,...,E_n$為實體集,那麼聯絡集R是,

|(e_1,e_2,...,e_n)|e_1∈E_1, e_2∈E_2,..,e_n∈E_n|

的一個子集。而 ( e 1 , e 2 , . . . , e n ) (e_1,e_2,...,e_n) `是一個聯絡。

實體集之間的關聯稱為參與。也就是說,實體集 E 1 , E 2 , . . . , E n E_1,E_2,...,E_n `參與(participate)聯絡集R。E-R模型中的一個聯絡例項(relationship instance)表示在所建模的現實世界中命名實體間的一個關聯。

實體在聯絡中扮演的功能稱為實體的角色(role)。參與一個聯絡集的實體集通常是互異的,因此角色是隱含的並且一般並不指定。但是,當聯絡的含義需要解釋時角色是很有用的。當參與聯絡集的實體集並非互異的時候就是這種情況。也就是說,同樣的實體集以不同的角色參與一個聯絡節多於一次。 在這類聯絡集中,即稱為**自環(recursive)**的聯絡集中有必要用顯式的角色名來指明實體是如何參與聯絡實體的。例如,一門課是另一門課的先修課。

聯絡也可以具有描述性屬性(descriptive attribute),例如導師跟學生之間的實體集advisor,我們可以將屬性date與該聯絡關聯起來。

給定的聯絡集中的一個聯絡例項必須是由其參與實體唯一標識的。

參與到聯絡集的實體的數目稱為聯絡集的度(degree)。二元聯絡集的度為2,三元聯絡集的度為3。

4.4 屬性

每個屬性都有一個可取值的範圍,稱為屬性的域(domain),或者值集(value set)

E-R模型中的屬性可以按照如下的屬性型別來進行劃分:

  • 簡單(simple)和複合(composite)屬性:簡單屬性就是不能劃分為更小部分的屬性。複合屬性則可以再分。
  • 單值(single-value)和多值(multivalued) 屬性:
    單值屬性就是一個屬性對一個特定實體只有單獨的一個值。例如身份證號。多值屬性就是指一個屬性可以對應多個值。例如,手機號。
  • 派生(derived)屬性:這類屬性可以從別的相關屬性或實體派生出來。例如人的年齡,可以從生日計算得來。

4.5 約束

4.5.1 對映基數

對映基數(mapping cardinality),或基數比率,表示一個實體通過一個聯絡集能關聯的實體的個數。

對映基數在描述二元聯絡集時非常有用,儘管他們可以用於描述設計多於兩個實體集的聯絡集。

對於實體集A和B之間的二元聯絡集R來說,對映基數必然是以下情況之一:

  • 一對一(one to one):A中的一個實體至多與B中的一個實體相關聯,並且B中的一個實體也至多與A中的一個實體相關聯。
  • 一對多(one to many):A中的一個實體可以與B中任意數目的實體相關聯,而B中的一個實體至多與A中的一個實體相關聯。
  • 多對一(many to one):A中的一個實體至多與B中的一個實體相關聯,而B中的一個實體可以與A中任意數目實體相關聯。
  • 多對多(many to many):A中的一個實體可以與B中任意數目實體相關聯,而且B中的一個實體也可以與A中任意數目實體相關聯。

4.5.2 參與約束

如果實體集E中的每個實體都參與到聯絡集R的至少一個聯絡中,實體集E在聯絡R中的參與稱為**全部(total)的。如果E中只有部分實體參與到R的聯絡中,實體集E到聯絡集R的參與稱為部分(partial)**的。

4.5.3 碼

聯絡集的主碼結構依賴於聯絡集的對映基數。若果聯絡集是多對多的,那麼聯絡集的主碼由參與聯絡集的實體集的主碼的並集組成。

4.6 實體-聯絡圖

4.6.1 基本結構

  • 分成兩部分的矩形代表實體集
  • 菱形代表聯絡集
  • 線段將實體集連線到聯絡集
  • 虛線將聯絡集屬性;連線到聯絡集
  • 雙線顯示實體在聯絡集中的參與度(雙線是全部參與)
  • 雙菱形代表連線到弱實體集的標誌性聯絡集

image

4.6.2 對映基數

實體集之間的聯絡集可以是一對一,一對多,多對一,多對多的。

  • 一對一:聯絡集向兩個實體集各畫一個箭頭

image

  • 一對多:從聯絡集advisor畫一個箭頭到實體集instructor,以及一條線段到實體集student。

image

  • 多對多:從聯絡集advisor向實體集instructor和student各畫一條線段。

image

實體集和二元聯絡集之間的一條邊可以有一個關聯的最大和最小對映基數,用L…h的形式表示,其中l表示最小的對映基數,而h表示最大的對映基數。如下圖,

image

0…*表示教師可以有零個或多個學生,而1…1表示每個學生必須有且僅有一個導師。

4.6.3 弱實體集

沒有足夠的屬性以性成主碼的實體集稱為弱實體集稱作弱實體集(week entity set)。有主碼的實體集稱作強實體集

弱實體集必須與另一個稱作標識(identitying)或屬主實體集(owner entity set)的實體集關聯才能有意義。也就是說,弱實體集存在依賴(existence dependent)於標識實體集。我們稱標識實體集擁有(own)它所標識的弱實體集。將弱實體集與其標識實體集相聯的聯絡稱為標識性聯絡(identitying relationship)

**標識性聯絡是從弱實體集到標識實體集多對一的,並且弱實體