數據庫概念數據庫
數據庫(Database,簡稱DB)是長期儲存在計算機內、有組織的、可共享的大量數據的集合。編程
- 數據庫系統的特色
- 數據結構化
- 數據的共享性高,冗餘度低,易擴充
- 數據獨立性高
- 數據由DBMS統一管理和控制
- 兩大類數據模型
- 概念模型也稱信息模型,它是按用戶的觀點來對數據和信息建模,用於數據庫設計。
- 邏輯模型和物理模型,邏輯模型主要包括網狀模型、層次模型、關係模型、面向對象模型等,按計算機系統的觀點對數據建模,用於DBMS實現。物理模型是對數據最底層的抽象,描述數據在系統內部的表示方式和存取方法,在磁盤或磁帶上的存儲方式和存取方法。
- 關係數據庫
- 關係數據庫系統採用關係模型做爲數據的組織方式,在用戶觀點下,關係模型中數據的邏輯結構是一張二維表,它由行和列組成。關係的每個份量必須是一個不可分的數據項, 不容許表中還有表。
- 數據庫系統的三級模式結構
- 模式(Schema)
- 外模式(External Schema)
- 內模式(Internal Schema)
- 關係模式
-
關係模式能夠形式化地表示爲:數組
R(U,D,DOM,F)安全
R 關係名服務器
U 組成該關係的屬性名集合數據結構
D 屬性組U中屬性所來自的域閉包
DOM 屬性向域的映象集合框架
F 屬性間的數據依賴關係集合less
- 實體完整性規則(Entity Integrity)
- 若屬性A是基本關係R的主屬性,則屬性A不能取空值;關係模型中以主碼做爲惟一性標識。
- 參照完整性規則
-
若屬性(或屬性組)F是基本關係R的外碼它與基本關係S的主碼Ks相對應(基本關係R和S不必定是不一樣的關係),則對於R中每一個元組在F上的值必須爲:
- 或者取空值(F的每一個屬性值均爲空值)
- 或者等於S中某個元組的主碼值
- 關係代數運算符
關係數據庫標準語言SQL
SQL(Structured Query Language)結構化查詢語言,是關係數據庫的標準語言。集數據定義語言(DDL),數據操縱語言(DML),數據控制語言(DCL)功能於一體。能夠獨立完成數據庫生命週期中的所有活動:
- 定義關係模式,插入數據,創建數據庫;
- 對數據庫中的數據進行查詢和更新;
- 數據庫重構和維護
- 數據庫安全性、完整性控制等
- 能完成核心功能9個動詞
- SQL的基本概念
- 數據定義
-
定義模式
- 定義模式實際上定義了一個命名空間
- 在這個空間中能夠定義該模式包含的數據庫對象,例如基本表、視圖、索引等。
-
在CREATE SCHEMA中能夠接受CREATE TABLE,CREATE VIEW和GRANT子句。
CREATE SCHEMA <模式名> AUTHORIZATION <用戶名>[<表定義子句>|<視圖定義子句>|<受權定義子句>]
-
刪除模式
DROP SCHEMA <模式名> <CASCADE|RESTRICT>
- CASCADE(級聯)
刪除模式的同時把該模式中全部的數據庫對象所有刪除
- RESTRICT(限制)
若是該模式中定義了下屬的數據庫對象(如表、視圖等),則拒絕該刪除語句的執行。當該模式中沒有任何下屬的對象時 才能執行。
-
定義基本表
CREATE TABLE <表名>
(<列名> <數據類型>[ <列級完整性約束條件> ]
[,<列名> <數據類型>[ <列級完整性約束條件>] ] …
[,<表級完整性約束條件> ] );
若是完整性約束條件涉及到該表的多個屬性列,則必須定義在表級上,不然既能夠定義在列級也能夠定義在表級。
-
數據類型
-
模式與表
- 每個基本表都屬於某一個模式
- 一個模式包含多個基本表
- 定義基本表所屬模式
-
方法一:在表名中明顯地給出模式名
Create table "S-T".Student(......); /*模式名爲 S-T*/
Create table "S-T".Cource(......);
Create table "S-T".SC(......);
- 方法二:在建立模式語句中同時建立表
- 方法三:設置所屬的模式
-
修改基本表
ALTER TABLE <表名>
[ ADD <新列名> <數據類型> [ 完整性約束 ] ]
[ DROP <完整性約束名> ]
[ ALTER COLUMN<列名> <數據類型> ];
-
刪除基本表
DROP TABLE <表名>[RESTRICT| CASCADE];
-
RESTRICT:刪除表是有限制的。
- 欲刪除的基本表不能被其餘表的約束所引用
- 若是存在依賴該表的對象,則此表不能被刪除
-
CASCADE:刪除該表沒有限制。
- 在刪除基本表的同時,相關的依賴對象一塊兒刪除
-
-
索 引
-
RDBMS中索引通常採用B+樹、HASH索引來實現
- B+樹索引具備動態平衡的優勢
- HASH索引具備查找速度快的特色
- 採用B+樹,仍是HASH索引 則由具體的RDBMS來決定
- 索引是關係數據庫的內部實現技術,屬於內模式的範疇
- CREATE INDEX語句定義索引時,能夠定義索引是惟一索引、非惟一索引或聚簇索引
-
-
創建索引
-
語句格式
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
- 在最常常查詢的列上創建聚簇索引以提升查詢效率
- 一個基本表上最多隻能創建一個聚簇索引
- 常常更新的列不宜創建聚簇索引
-
-
刪除索引
DROP INDEX <索引名>;
- 數據查詢
-
語句格式
SELECT [ALL|DISTINCT] <目標列表達式>[,<目標列表達式>] …
FROM <表名或視圖名>[, <表名或視圖名> ] …
[ WHERE <條件表達式> ]
[ GROUP BY <列名1> [ HAVING <條件表達式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
-
單表查詢
- 選擇表中的若干列
- 選擇表中的若干元組
-
ORDER BY子句
- 能夠按一個或多個屬性列排序
- 升序:ASC;降序:DESC;缺省值爲升序
- 當排序列含空值時
- ASC:排序列爲空值的元組最後顯示
- DESC:排序列爲空值的元組最早顯示
-
彙集函數
- 計數
- COUNT([DISTINCT|ALL] *)
- COUNT([DISTINCT|ALL] <列名>)
- 計算總和
- SUM([DISTINCT|ALL] <列名>)
- 計算平均值
- AVG([DISTINCT|ALL] <列名>)
- 最大最小值
- MAX([DISTINCT|ALL] <列名>)
- MIN([DISTINCT|ALL] <列名>)
- GROUP BY子句
- 查詢的通常規律:先依據條件查詢獲得結果集,再將分組後的結果集篩選並排序。
-
HAVING短語與WHERE子句的區別:
- 做用對象不一樣
- WHERE子句做用於基表或視圖,從中選擇知足條件的元組
- HAVING短語做用於組,從中選擇知足條件的組。
- 經常使用的查詢條件
查 詢 條 件
謂 詞
比 較
=,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比較運算符
肯定範圍
BETWEEN AND,NOT BETWEEN AND
肯定集合
IN,NOT IN
字符匹配
LIKE,NOT LIKE
空 值
IS NULL,IS NOT NULL
多重條件(邏輯運算)
AND,OR,NOT
- ESCAPE '\' 表示" \" 爲換碼字符
-
鏈接查詢
- 等值與非等值鏈接查詢
-
自身鏈接
-
一個表與其本身進行鏈接
- 須要給表起別名以示區別
- 因爲全部屬性名都是同名屬性,所以必須使用別名前綴
-
-
外鏈接
-
外鏈接與普通鏈接的區別
- 普通鏈接操做只輸出知足鏈接條件的元組
- 外鏈接操做以指定表爲鏈接主體,將主體表中不知足鏈接條件的元組一併輸出
-
左外鏈接
- 列出左邊關係(如本例Student)中全部的元組
-
右外鏈接
- 列出右邊關係中全部的元組
-
- 複合條件鏈接
-
嵌套查詢
一個SELECT-FROM-WHERE語句稱爲一個查詢塊
將一個查詢塊嵌套在另外一個查詢塊的WHERE子句或HAVING短語的條件中的查詢稱爲嵌套查詢
-
子查詢的限制
-
不能使用ORDER BY子句
- 層層嵌套方式反映了 SQL語言的結構化
- 有些嵌套查詢能夠用鏈接運算替代
-
-
嵌套查詢求解方法
-
子查詢的查詢條件不依賴於父查詢
- 由裏向外 逐層處理。即每一個子查詢在上一級查詢處理以前求解,子查詢的結果用於創建其父查詢的查找條件。
- 首先取外層查詢中表的第一個元組,根據它與內層查詢相關的屬性值處理內層查詢,若WHERE子句返回值爲真,則取此元組放入結果表
- 而後再取外層表的下一個元組
- 重複這一過程,直至外層表所有檢查完爲止
-
-
帶有比較運算符的子查詢
- 當能確切知道內層查詢返回單值時,可用比較運算符(>,<,=,>=,<=,!=或< >)。
- 與ANY或ALL謂詞配合使用
-
帶有ANY(SOME)或ALL謂詞的子查詢
-
須要配合使用比較運算符
- > ANY 大於子查詢結果中的某個值
- > ALL 大於子查詢結果中的全部值
- < ANY 小於子查詢結果中的某個值
- < ALL 小於子查詢結果中的全部值
- >= ANY 大於等於子查詢結果中的某個值
- >= ALL 大於等於子查詢結果中的全部值
- <= ANY 小於等於子查詢結果中的某個值
- <= ALL 小於等於子查詢結果中的全部值
- = ANY 等於子查詢結果中的某個值
- =ALL 等於子查詢結果中的全部值(一般沒有實際意義)
- !=(或<>)ANY 不等於子查詢結果中的某個值
- !=(或<>)ALL 不等於子查詢結果中的任何一個值
-
-
帶有EXISTS謂詞的子查詢
- 1. EXISTS謂詞,存在量詞$
-
帶有EXISTS謂詞的子查詢不返回任何數據,只產生邏輯真值"true"或邏輯假值"false"。
- 若內層查詢結果非空,則外層的WHERE子句返回真值
- 若內層查詢結果爲空,則外層的WHERE子句返回假值
- 由EXISTS引出的子查詢,其目標列表達式一般都用* ,由於帶EXISTS的子查詢只返回真值或假值,給出列名無實際意義
-
2. NOT EXISTS謂詞
- 若內層查詢結果非空,則外層的WHERE子句返回假值
- 若內層查詢結果爲空,則外層的WHERE子句返回真值
-
-
集合查詢
-
集合操做的種類
- 並操做UNION
- 交操做INTERSECT
- 差操做EXCEPT
- 參加集合操做的各查詢結果的列數必須相同;對應項的數據類型也必須相同
-
-
SELECT語句的通常格式
SELECT [ALL|DISTINCT]
<目標列表達式> [別名] [ ,<目標列表達式> [別名]] …
FROM <表名或視圖名> [別名]
[ ,<表名或視圖名> [別名]] …
[WHERE <條件表達式>]
[GROUP BY <列名1>
[HAVING <條件表達式>]]
[ORDER BY <列名2> [ASC|DESC]
- 數據更新
-
插入數據
-
插入元組
- 語句格式
INSERT
INTO <表名> [(<屬性列1>[,<屬性列2 >…)]
VALUES (<常量1> [,<常量2>] … )
-
插入子查詢結果
- 語句格式
INSERT
INTO <表名> [(<屬性列1> [,<屬性列2>… )]
子查詢;
- 子查詢
SELECT子句目標列必須與INTO子句匹配
- 值的個數
- 值的類型
-
- 修改數據
-
語句格式
UPDATE <表名>
SET <列名>=<表達式>[,<列名>=<表達式>]…
[WHERE <條件>];
- 刪除數據
-
語句格式
DELETE
FROM <表名>
[WHERE <條件>];
- 視 圖
- 虛表,是從一個或幾個基本表(或視圖)導出的表
- 只存放視圖的定義,不存放視圖對應的數據
- 基表中的數據發生變化,從視圖中查詢出的數據也隨之改變
-
創建視圖
- 語句格式
CREATE VIEW
<視圖名> [(<列名> [,<列名>]…)]
AS <子查詢>
[WITH CHECK OPTION];
-
刪除視圖
DROP VIEW <視圖名>;
-
查詢視圖
- 用戶角度:查詢視圖與查詢基本表相同
- 視圖的做用
- 視圖可以簡化用戶的操做
- 視圖使用戶能以多種角度看待同一數據
- 視圖對重構數據庫提供了必定程度的邏輯獨立性
- 視圖可以對機密數據提供安全保護
- 適當的利用視圖能夠更清晰的表達查詢
數據庫安全性
- 數據庫安全性控制的經常使用方法
- 用戶標識和鑑定
- 存取控制
- 視圖
- 審計
- 密碼存儲
-
關係數據庫系統中存取控制對象
- 受權與回收
-
GRANT
- GRANT語句的通常格式:
GRANT <權限>[,<權限>]...
[ON <對象類型> <對象名>]
TO <用戶>[,<用戶>]...
[WITH GRANT OPTION];
- 語義:將對指定操做對象的指定操做權限授予指定的用戶
-
WITH GRANT OPTION子句
-
WITH GRANT OPTION子句:
- 指定:能夠再授予
- 沒有指定:不能傳播
- 不容許循環受權
-
-
REVOKE
- 授予的權限能夠由DBA或其餘受權者用REVOKE語句收回
- REVOKE語句的通常格式爲:
REVOKE <權限>[,<權限>]...
[ON <對象類型> <對象名>]
FROM <用戶>[,<用戶>]...;
-
建立數據庫模式的權限
- DBA在建立用戶時實現
- CREATE USER語句格式
CREATE USER <username>
[WITH][DBA | RESOURCE | CONNECT]
- 數據庫角色
-
數據庫角色:被命名的一組與數據庫操做相關的權限
- 角色是權限的集合
- 能夠爲一組具備相同權限的用戶建立一個角色
- 簡化受權的過程
-
角色的建立
CREATE ROLE <角色名>
-
給角色受權
GRANT <權限>[,<權限>]…
ON <對象類型>對象名
TO <角色>[,<角色>]…
-
將一個角色授予其餘的角色或用戶
GRANT <角色1>[,<角色2>]…
TO <角色3>[,<用戶1>]…
[WITH ADMIN OPTION]
-
角色權限的收回
REVOKE <權限>[,<權限>]…
ON <對象類型> <對象名>
FROM <角色>[,<角色>]…
數據庫完整性
-
數據庫的完整性
- 數據的正確性和相容性
-
數據的完整性和安全性是兩個不一樣概念
-
數據的完整性
- 防止數據庫中存在不符合語義的數據,也就是防止數據庫中存在不正確的數據
- 防範對象:不合語義的、不正確的數據
-
數據的安全性
- 保護數據庫防止惡意的破壞和非法的存取
- 防範對象:非法用戶和非法操做
-
-
實體完整性
-
關係模型的實體完整性
- CREATE TABLE中用PRIMARY KEY定義
-
單屬性構成的碼有兩種說明方法
- 定義爲列級約束條件
- 定義爲表級約束條件
-
對多個屬性構成的碼只有一種說明方法
- 定義爲表級約束條件
- 插入或對主碼列進行更新操做時,RDBMS按照實體完整性規則自動進行檢查。包括:
-
- 檢查主碼值是否惟一,若是不惟一則拒絕插入或修改
- 檢查主碼的各個屬性是否爲空,只要有一個爲空就拒絕插入或修改
- 檢查記錄中主碼值是否惟一的一種方法是進行全表掃描
-
參照完整性
-
關係模型的參照完整性定義
- 在CREATE TABLE中用FOREIGN KEY短語定義哪些列爲外碼
-
用REFERENCES短語指明這些外碼參照哪些表的主碼
例如,關係SC中一個元組表示一個學生選修的某門課程的成績,(Sno,Cno)是主碼。Sno,Cno分別參照引用Student表的主碼和Course表的主碼
[例3] 定義SC中的參照完整性
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno, Cno), /*在表級定義實體完整性*/
FOREIGN KEY (Sno) REFERENCES Student(Sno),
/*在表級定義參照完整性*/
FOREIGN KEY (Cno) REFERENCES Course(Cno)
/*在表級定義參照完整性*/
);
-
-
用戶定義的完整性
-
屬性上的約束條件的定義
- CREATE TABLE時定義
- 列值非空(NOT NULL)
- 列值惟一(UNIQUE)
- 檢查列值是否知足一個布爾表達式(CHECK)
-
屬性上的約束條件檢查和違約處理
- 插入元組或修改屬性的值時,RDBMS檢查屬性上的約束條件是否被知足
- 若是不知足則操做被拒絕執行
-
元組上的約束條件的定義
- 在CREATE TABLE時能夠用CHECK短語定義元組上的約束條件,即元組級的限制
- 同屬性值限制相比,元組級的限制能夠設置不一樣屬性之間的取值的相互約束條件
-
元組上的約束條件檢查和違約處理
- 插入元組或修改屬性的值時,RDBMS檢查元組上的約束條件是否被知足
- 若是不知足則操做被拒絕執行
-
-
完整性約束命名子句
-
CONSTRAINT 約束
CONSTRAINT <完整性約束條件名>
[PRIMARY KEY短語
|FOREIGN KEY短語
|CHECK短語]
- 使用ALTER TABLE語句修改表中的完整性限制
- SQL支持域的概念,並能夠用CREATE DOMAIN語句創建一個域以及該域應該知足的完整性約束條件。
-
-
觸發器
-
定義觸發器
-
CREATE TRIGGER語法格式
CREATE TRIGGER <觸發器名>
{BEFORE | AFTER} <觸發事件> ON <表名>
FOR EACH {ROW | STATEMENT}
[WHEN <觸發條件>]
<觸發動做體>
-
-
定義觸發器的語法說明:
- 1. 建立者:表的擁有者
- 2. 觸發器名
- 3. 表名:觸發器的目標表
- 4. 觸發事件:INSERT、DELETE、UPDATE
-
5. 觸發器類型
- 行級觸發器(FOR EACH ROW)
- 語句級觸發器(FOR EACH STATEMENT)
-
6. 觸發條件
- 觸發條件爲真
- 省略WHEN觸發條件
-
7. 觸發動做體
- 觸發動做體能夠是一個匿名PL/SQL過程塊
- 也能夠是對已建立存儲過程的調用
-
激活觸發器
- 觸發器的執行,是由觸發事件激活的,並由數據庫服務器自動執行
-
一個數據表上可能定義了多個觸發器
- 同一個表上的多個觸發器激活時遵循以下的執行順序:
- (1) 執行該表上的BEFORE觸發器;
- (2) 激活觸發器的SQL語句;
- (3) 執行該表上的AFTER觸發器。
-
刪除觸發器
-
刪除觸發器的SQL語法:
DROP TRIGGER <觸發器名> ON <表名>;
- 觸發器必須是一個已經建立的觸發器,而且只能由具備相應權限的用戶刪除。
-
-
關係數據理論
-
數據依賴
-
數據依賴的類型
- 函數依賴(Functional Dependency,簡記爲FD)
- 多值依賴(Multivalued Dependency,簡記爲MVD)
- 其餘
-
數據依賴對關係模式的影響
-
"好"的模式:
- 不會發生插入異常、刪除異常、更新異常,
- 數據冗餘應儘量少
- 緣由:由存在於模式中的某些數據依賴引發的
- 解決方法:經過分解關係模式來消除其中不合適的數據依賴
-
-
函數依賴
- 定義6.1 設R(U)是一個屬性集U上的關係模式,X和Y是U的子集。若對於R(U)的任意一個可能的關係r,r中不可能存在兩個元組在X上的屬性值相等, 而在Y上的屬性值不等, 則稱 "X函數肯定Y" 或 "Y函數依賴於X",記做X→Y。
-
在關係模式R(U)中,對於U的子集X和Y,
- 若是X→Y,但Y Í X,則稱X→Y是非平凡的函數依賴
- 若X→Y,但Y Í X, 則稱X→Y是平凡的函數依賴
- 若X→Y,則X稱爲這個函數依賴的決定屬性組,也稱爲決定因素(Determinant)。
- 若X→Y,Y→X,則記做X←→Y。
- 若Y不函數依賴於X,則記做X→Y。
-
徹底函數依賴與部分函數依賴
- 定義6.2 在R(U)中,若是X→Y,而且對於X的任何一個真子集X',都有X' Y, 則稱Y對X徹底函數依賴,記做X→F Y 。 若X→Y,但Y不徹底函數依賴於X,則稱Y對X部分函數依賴,記做X→P Y。
-
傳遞函數依賴
- 定義6.3 在R(U)中,若是X→Y,(Y ÍX) ,Y→X Y→Z, 則稱Z對X傳遞函數依賴。記爲:X →傳遞 Z
- 注: 若是Y→X, 即X←→Y,則Z直接依賴於X。
-
碼
- 定義6.4 設K爲R<U,F>中的屬性或屬性組合。若K U, 則K稱爲R的侯選碼(Candidate Key)。若候選碼多於一個,則選定其中的一個作爲主碼(Primary Key)。
-
主屬性與非主屬性
- 包含在任何一個候選碼中的屬性 ,稱爲主屬性(Prime attribute)
- 不包含在任何碼中的屬性稱爲非主屬性(Nonprime attribute)或非碼屬性(Non-key attribute)
-
全碼
- 整個屬性組是碼,稱爲全碼(All-key)
-
外部碼
- 定義6.5 關係模式 R 中屬性或屬性組X 並不是 R的碼,但 X 是另外一個關係模式的碼,則稱 X 是R 的外部碼(Foreign key)也稱外碼
-
-
範式
- 範式是符合某一種級別的關係模式的集合
- 關係數據庫中的關係必須知足必定的要求。知足不一樣程度要求的爲不一樣範式
-
範式的種類:
- 第一範式(1NF)
- 第二範式(2NF)
- 第三範式(3NF)
- BC範式(BCNF)
- 第四範式(4NF)
- 第五範式(5NF)
- 各類範式之間存在聯繫:
- 某一關係模式R爲第n範式,可簡記爲R∈nNF。
- 一個低一級範式的關係模式,經過模式分解能夠轉換爲若干個高一級範式的關係模式的集合,這種過程就叫規範化
-
1NF
-
1NF的定義
- 若是一個關係模式R的全部屬性都是不可分的基本數據項,則R∈1NF
- 第一範式是對關係模式的最起碼的要求。不知足第一範式的數據庫模式不能稱爲關係數據庫
- 可是知足第一範式的關係模式並不必定是一個好的關係模式
-
-
2NF
-
2NF的定義
- 定義6.6 若R∈1NF,且每個非主屬性徹底函數依賴於碼,則R∈2NF。
-
-
3NF
-
3NF的定義
- 定義6.7 關係模式R<U,F> 中若不存在這樣的碼X、屬性組Y及非主屬性Z(Z Í Y), 使得X→Y,Y→Z成立, Y → X,則稱R<U,F> ∈ 3NF。
- 若R∈3NF,則每個非主屬性既不部分依賴於碼也不傳遞依賴於碼。
-
-
BC範式(BCNF)
- 定義6.8 關係模式R<U,F>∈1NF,若X→Y且Y Í X時,X必含有碼,則R<U,F> ∈BCNF。
- 等價於:每個決定屬性因素都包含碼
-
若R∈BCNF
- 全部非主屬性對每個碼都是徹底函數依賴
- 全部的主屬性對每個不包含它的碼,也是徹底函數依賴
- 沒有任何屬性徹底函數依賴於非碼的任何一組屬性
- R ∈BCNF R ∈3NF
-
多值依賴
-
定義6.9
- 設R(U)是一個屬性集U上的一個關係模式, X、 Y和Z是U的子集,而且Z=U-X-Y。關係模式R(U)中多值依賴 X→→Y成立,當且僅當對R(U)的任一關係r,給定的一對(x,z)值,有一組Y的值,這組值僅僅決定於x值而與z值無關
-
多值依賴的另外一個等價的形式化的定義:
- 在R(U)的任一關係r中,若是存在元組t,s 使得t[X]=s[X],那麼就必然存在元組 w,vÎ r,(w,v能夠與s,t相同),使得w[X]=v[X]=t[X],而w[Y]=t[Y],w[Z]=s[Z],v[Y]=s[Y],v[Z]=t[Z](即交換s,t元組的Y值所得的兩個新元組必在r中),則Y多值依賴於X,記爲X→→Y。 這裏,X,Y是U的子集,Z=U-X-Y。
-
平凡多值依賴和非平凡的多值依賴
- 若X→→Y,而Z=φ,則稱X→→Y爲平凡的多值依賴
- 不然稱X→→Y爲非平凡的多值依賴
-
多值依賴的性質
- (1)多值依賴具備對稱性。若X→→Y,則X→→Z,其中Z=U-X-Y
- (2)多值依賴具備傳遞性。若X→→Y,Y→→Z, 則X→→Z –Y
- (3)函數依賴是多值依賴的特殊狀況。若X→Y,則X→→Y。
- (4)若X→→Y,X→→Z,則X→→YÈ Z。
- (5)若X→→Y,X→→Z,則X→→Y∩Z。
- (6)若X→→Y,X→→Z,則X→→Y-Z,X→→Z -Y。
-
多值依賴與函數依賴的區別
- (1) 多值依賴的有效性與屬性集的範圍有關
-
(2)
- 若函數依賴X→Y在R(U)上成立,則對於任何Y' Ì Y均有X→Y' 成立
- 多值依賴X→→Y若在R(U)上成立,不能斷言對於任何Y' Ì Y有X→→Y' 成立
-
4NF
- 定義6.10 關係模式R<U,F>∈1NF,若是對於R的每一個非平凡多值依賴X→→Y(Y Í X),X都含有碼,則R∈4NF。
-
若是R ∈ 4NF, 則R ∈ BCNF
- 不容許有非平凡且非函數依賴的多值依賴
- 容許的非平凡多值依賴是函數依賴
-
-
數據依賴的公理系統
-
邏輯蘊含
- 定義6.11 對於知足一組函數依賴 F 的關係模式R <U,F>,其任何一個關係r,若函數依賴X→Y都成立, (即r中任意兩元組t,s,若tX]=sX],則tY]=sY]),則稱F邏輯蘊含X →Y
-
關係模式R <U,F >來講有如下的推理規則:
- A1.自反律(Reflexivity):若Y Í X Í U,則X →Y爲F所蘊含。
- A2.增廣律(Augmentation):若X→Y爲F所蘊含,且Z Í U,則XZ→YZ爲F所蘊含。
-
A3.傳遞律(Transitivity):若X→Y及Y→Z爲F所蘊含,則X→Z爲F所蘊含。
-
自反律: 若Y Í X Í U,則X →Y爲F所蘊含
證: 設Y Í X Í U
對R <U,F> 的任一關係r中的任意兩個元組t,s:
若t[X]=s[X],因爲Y Í X,有t[y]=s[y],
因此X→Y成立,自反律得證
-
增廣律: 若X→Y爲F所蘊含,且Z Í U,則XZ→YZ 爲F所蘊含。
證:設X→Y爲F所蘊含,且Z Í U。
設R<U,F> 的任一關係r中任意的兩個元組t,s:
若t[XZ]=s[XZ],則有t[X]=s[X]和t[Z]=s[Z];
由X→Y,因而有t[Y]=s[Y],因此t[YZ]=s[YZ],因此
XZ→YZ爲F所蘊含,增廣律得證。
-
傳遞律:若X→Y及Y→Z爲F所蘊含,則X→Z爲 F所蘊含。
證:設X→Y及Y→Z爲F所蘊含。
對R<U,F> 的任一關係 r中的任意兩個元組 t,s:
若t[X]=s[X],因爲X→Y,有 t[Y]=s[Y];
再由Y→Z,有t[Z]=s[Z],因此X→Z爲F所蘊含,傳遞律得證。
-
-
導出規則
-
1.根據A1,A2,A3這三條推理規則能夠獲得下面三條推理規則:
-
合併規則:由X→Y,X→Z,有X→YZ。
(A2, A3)
-
僞傳遞規則:由X→Y,WY→Z,有XW→Z。
(A2, A3)
-
分解規則:由X→Y及 ZÍY,有X→Z。
(A1, A3)
-
-
2.根據合併規則和分解規則,可得引理6.1
- 引理6.l X→A1 A2…Ak成立的充分必要條件是X→Ai成立(i=l,2,…,k)
-
-
函數依賴閉包
- 定義6.l2 在關係模式R<U,F>中爲F所邏輯蘊含的函數依賴的全體叫做 F的閉包,記爲F+。
- 定義6.13 設F爲屬性集U上的一組函數依賴,X ÍU, XF+ ={ A|X→A能由F 根據Armstrong公理導出},XF+稱爲屬性集X關於函數依賴集F 的閉包
-
函數依賴集等價
- 定義6.14 若是G+=F+,就說函數依賴集F覆蓋G(F是G的覆蓋,或G是F的覆蓋),或F與G等價。
-
引理6.3 F+ = G+ 的充分必要條件是F Í G+ ,和G Í F+
證: 必要性顯然,只證充分性。
(1)若FÍG+ ,則XF+ Í XG++ 。
(2)任取X→YÎF+ 則有 Y Í XF+ Í XG++ 。
因此X→Y Î (G+)+= G+。即F+ Í G+。
(3)同理可證G+ Í F+ ,因此F+ = G+。
-
最小依賴集
-
定義6.15 若是函數依賴集F知足下列條件,則稱F爲一個極小函數依賴集。亦稱爲最小依賴集或最小覆蓋。
- (1) F中任一函數依賴的右部僅含有一個屬性。
- (2) F中不存在這樣的函數依賴X→A,使得F與F-{X→A}等價。
- (3) F中不存在這樣的函數依賴X→A, X有真子集Z使得F-{X→A}∪{Z→A}與F等價。
-
-
極小化過程
-
定理6.3 每個函數依賴集F均等價於一個極小函數依賴集Fm。此Fm稱爲F的最小依賴集。
證實: 構造性證實,找出F的一個最小依賴集。
(1)逐一檢查F中各函數依賴FDi:X→Y,若Y=A1A2 …Ak,k > 2,
則用 { X→Aj |j=1,2,…, k} 來取代X→Y。
(2)逐一檢查F中各函數依賴FDi:X→A,令G=F-{X→A},
若AÎXG+, 則從F中去掉此函數依賴。
(3)逐一取出F中各函數依賴FDi:X→A,設X=B1B2…Bm,
逐一考查Bi (i=l,2,…,m),若A Î(X-Bi )F+ ,
則以X-Bi 取代X。
-
-
模式的分解
-
三種模式分解等價的定義:
- ⒈ 分解具備無損鏈接性
- ⒉ 分解要保持函數依賴
- ⒊ 分解既要保持函數依賴,又要具備無損鏈接性
- 定義6.16 關係模式R<U,F>的一個分解:ρ={ R1<U1,F1>,R2<U2,F2>,…,Rn<Un,Fn>},U= ∪Ui,且不存在 Ui Í Uj,Fi 爲 F在 Ui 上的投影
- 定義6.17 函數依賴集合{X→Y | X→Y Î F+∧XY ÍUi} 的一個覆蓋 Fi 叫做 F 在屬性 Ui 上的投影
-
-
具備無損鏈接性的模式分解
- 關係模式R<U,F>的一個分解 ρ={ R1<U1,F1>,R2<U2,F2>, …,Rn<Un,Fn>},若R與R一、R二、…、Rn天然鏈接的結果相等,則稱關係模式R的這個分解ρ具備無損鏈接性(Lossless join)
- 具備無損鏈接性的分解保證不丟失信息
- 無損鏈接性不必定能解決插入異常、刪除異常、修改複雜、數據冗餘等問題
-
保持函數依賴的模式分解
- 設關係模式R<U,F>被分解爲若干個關係模式,R1<U1,F1>,R2<U2,F2>,…,Rn<Un,Fn> ,(其中U=U1∪U2∪…∪Un,且不存在Ui Í Uj,Fi爲F在Ui上的投影),若F所邏輯蘊含的函數依賴必定也由分解獲得的某個關係模式中的函數依賴Fi所邏輯蘊含,則稱關係模式R的這個分解是保持函數依賴的(Preserve dependency)
-
關係模式的規範化,其基本思想:
-
小結
- 若要求分解具備無損鏈接性,那麼模式分解必定可以達到4NF
- 若要求分解保持函數依賴,那麼模式分解必定可以達到3NF,但不必定可以達到BCNF
- 若要求分解既具備無損鏈接性,又保持函數依賴,則模式分解必定可以達到3NF,但不必定可以達到BCNF
-
數據庫設計
-
數據庫設計的特色
- 數據庫設計方法
-
基本思想:過程迭代和逐步求精
-
新奧爾良(New Orleans)方法
- 將數據庫設計分爲若干階段和步驟
-
基於E-R模型的數據庫設計方法
- 概念設計階段普遍採用
-
3NF(第三範式)的設計方法
- 邏輯階段可採用的有效方法
-
ODL(Object Definition Language)方法
- 面向對象的數據庫設計方法
-
計算機輔助設計
- ORACLE Designer 2000
- SYBASE PowerDesigner
-
-
數據庫設計的基本步驟
-
數據庫設計分6個階段
- 需求分析
- 概念結構設計
- 邏輯結構設計
- 物理結構設計
- 數據庫實施
- 數據庫運行和維護
- 需求分析和概念設計獨立於任何數據庫管理系統
- 邏輯設計和物理設計與選用的DBMS密切相關
-
- 數據庫設計過程當中的各級模式
-
數據庫設計不一樣階段造成的數據庫各級模式
- 結構化分析方法(Structured Analysis,簡稱SA方法)
- 從最上層的系統組織機構入手
-
自頂向下、逐層分解分析系統
- 1.首先把任何一個系統都抽象爲:
-
2.分解處理功能和數據
-
(1)分解處理功能
- 將處理功能的具體內容分解爲若干子功能
-
(2)分解數據
- 處理功能逐步分解同時,逐級分解所用數據,造成若干層次的數據流圖
-
(3)表達方法
- 處理邏輯:用斷定表或斷定樹來描述
- 數據:用數據字典來描述
-
-
3.將分析結果再次提交給用戶,徵得用戶的承認
- 數據字典
-
數據字典的用途
- 進行詳細的數據收集和數據分析所得到的主要結果
-
數據字典的內容
- 數據項
- 數據結構
- 數據流
- 數據存儲
- 處理過程
-
⒈ 數據項
- 數據項是不可再分的數據單位
-
對數據項的描述
數據項描述={數據項名,數據項含義說明,別名,
數據類型,長度,取值範圍,取值含義,
與其餘數據項的邏輯關係,數據項之間的聯繫 }
-
⒉ 數據結構
- 數據結構反映了數據之間的組合關係。
- 一個數據結構能夠由若干個數據項組成,也能夠由若干個數據結構組成,或由若干個數據項和數據結構混合組成。
-
對數據結構的描述
數據結構描述={數據結構名,含義說明,
組成:{數據項或數據結構}}
-
⒊ 數據流
- 數據流是數據結構在系統內傳輸的路徑。
-
對數據流的描述
數據流描述={ 數據流名,說明,數據流來源,
數據流去向,組成:{數據結構},
平均流量,高峯期流量}
-
⒋ 數據存儲
- 數據存儲是數據結構停留或保存的地方,也是數據流的來源和去向之一。
-
對數據存儲的描述
數據存儲描述={數據存儲名,說明,編號,
輸入的數據流 ,輸出的數據流 ,
組成:{數據結構},數據量,存取頻度,存取方式}
-
⒌ 處理過程
- 具體處理邏輯通常用斷定表或斷定樹來描述
-
處理過程說明性信息的描述
處理過程描述={處理過程名,說明,輸入:{數據流},
輸出:{數據流},處理:{簡要說明}}
- 概念結構設計
-
設計概念結構的四類方法
- 自頂向下
- 首先定義全局概念結構的框架,而後逐步細化
- 自底向上
- 首先定義各局部應用的概念結構,而後將它們集成起來,獲得全局概念結構
- 逐步擴張
- 首先定義最重要的核心概念結構,而後向外擴充,以滾雪球的方式逐步生成其餘概念結構,直至整體概念結構
- 混合策略
- 將自頂向下和自底向上相結合,用自頂向下策略設計一個全局概念結構的框架,以它爲骨架集成由自底向上策略中設計的各局部概念結構。
-
經常使用策略
- 自頂向下地進行需求分析
-
自底向上地設計概念結構
-
自底向上設計概念結構的步驟
- 第1步:抽象數據並設計局部視圖
-
第2步:集成局部視圖,獲得全局概念結構
-
數據抽象與局部視圖設計
-
數據抽象
-
三種經常使用抽象
-
1. 分類(Classification)
- 定義某一類概念做爲現實世界中一組對象的類型
- 抽象了對象值和型之間的"is member of"的語義
-
-
2. 彙集(Aggregation)
- 定義某一類型的組成成分
- 抽象了對象內部類型和成分之間"is part of"的語義
- 複雜的彙集,某一類型的成分還是一個彙集
-
3. 歸納(Generalization)
- 定義類型之間的一種子集聯繫
- 抽象了類型之間的"is subset of"的語義
- 繼承性
-
-
局部視圖設計
-
設計分E-R圖的步驟:
-
⒈選擇局部應用
- 在多層的數據流圖中選擇一個適當層次的數據流圖,做爲設計分E-R圖的出發點
- 一般以中層數據流圖做爲設計分E-R圖的依據
-
-
⒉逐一設計分E-R圖
-
任務
- 將各局部應用涉及的數據分別從數據字典中抽取出來
- 參照數據流圖,標定各局部應用中的實體、實體的屬性、標識實體的碼
- 肯定實體之間的聯繫及其類型(1:1,1:n,m:n)
-
兩條準則:
- (1)屬性不能再具備須要描述的性質。即屬性必須是不可分的數據項,不能再由另外一些屬性組成
- (2)屬性不能與其餘實體具備聯繫。聯繫只發生在實體之間
- 舉例
-
-
-
- 邏輯結構設計
- E-R圖向關係模型的轉換
-
數據模型的優化
-
優化數據模型的方法
-
1肯定數據依賴
- 按需求分析階段所獲得的語義,分別寫出每一個關係模式內部各屬性之間的數據依賴以及不一樣關係模式屬性之間數據依賴
-
2消除 冗餘的聯繫
- 對於各個關係模式之間的數據依賴進行極小化處理,消除 冗餘的聯繫。
-
3肯定所屬範式
- 按照數據依賴的理論對關係模式逐一進行分析
- 考查是否存在部分函數依賴、傳遞函數依賴、多值依賴等
- 肯定各關係模式分別屬於第幾範式
- 4按照需求分析階段獲得的各類應用對數據處理的要求,分析對於這樣的應用環境這些模式是否合適,肯定是否要對它們進行合併或分解。
- 注意:並非規範化程度越高的關係就越優,通常說來,第三範式就足夠了
- 5按照需求分析階段獲得的各類應用對數據處理的要求,對關係模式進行必要的分解,以提升數據操做的效率和存儲空間的利用率
-
-
-
設計用戶子模式
-
定義用戶外模式時應該注重的問題
-
包括三個方面:
- (1) 使用更符合用戶習慣的別名
- (2) 針對不一樣級別的用戶定義不一樣的View ,以知足系統對安全性的要求。
- (3) 簡化用戶對系統的使用
-
-
- 數據庫的物理設計
- 數據庫物理設計的內容和方法
-
關係模式存取方法選擇
-
DBMS經常使用存取方法
-
索引方法
- 目前主要是B+樹索引方法
- 經典存取方法,使用最廣泛
-
聚簇(Cluster)方法
- HASH方法
-
-
選擇索引存取方法的通常規則
- 若是一個(或一組)屬性常常在查詢條件中出現,則考慮在這個(或這組)屬性上創建索引(或組合索引)
- 若是一個屬性常常做爲最大值和最小值等彙集函數的參數,則考慮在這個屬性上創建索引
- 若是一個(或一組)屬性常常在鏈接操做的鏈接條件中出現,則考慮在這個(或這組)屬性上創建索引
-
聚簇
- 爲了提升某個屬性(或屬性組)的查詢速度,把這個或這些屬性(稱爲聚簇碼)上具備相同值的元組集中存放在連續的物理塊稱爲聚簇
-
聚簇的用途
- 1. 大大提升按聚簇碼進行查詢的效率
-
2. 節省存儲空間
- 聚簇之後,聚簇碼相同的元組集中在一塊兒了,於是聚簇碼值沒必要在每一個元組中重複存儲,只要在一組中存一次就好了
-
聚簇的侷限性
- 1. 聚簇只能提升某些特定應用的性能
-
2. 創建與維護聚簇的開銷至關大
- 對已有關係創建聚簇,將致使關係中元組移動其物理存儲位置,並使此關係上原有的索引無效,必須重建
- 當一個元組的聚簇碼改變時,該元組的存儲位置也要作相應移動
-
-
肯定數據的存放位置
-
根據應用狀況將
- 易變部分與穩定部分分開存放
- 存取頻率較高部分與存取頻率較低部分,分開存放
-
- 評價物理結構
- 小結(續)
- 在邏輯設計階段將E-R圖轉換成具體的數據庫產品支持的數據模型如關係模型,造成數據庫邏輯模式。而後根據用戶處理的要求,安全性的考慮,在基本表的基礎上再創建必要的視圖(VIEW)造成數據的外模式
- 在物理設計階段根據DBMS特色和處理的須要,進行物理存儲安排,設計索引,造成數據庫內模式
數據庫編程
- 嵌入式SQL
- 嵌入式SQL的處理過程
-
數據庫工做單元與源程序工做單元之間的通訊:
-
1. SQL通訊區
- 向主語言傳遞SQL語句的執行狀態信息
- 使主語言可以據此控制程序流程
-
2. 主變量
- 主語言向SQL語句提供參數
- 將SQL語句查詢數據庫的結果交主語言進一步處理
-
3. 遊標
- 解決集合性操做語言與過程性操做語言的不匹配
-
- 嵌入式SQL與主語言的通訊
-
在SQL語句中使用主變量和指示變量的方法
-
1) 說明主變量和指示變量
BEGIN DECLARE SECTION
.........
......... (說明主變量和指示變量)
.........
END DECLARE SECTION
-
2) 使用主變量
- 說明以後的主變量能夠在SQL語句中任何一個可以使用表達式的地方出現
- 爲了與數據庫對象名(表名、視圖名、列名等)區別,SQL語句中的主變量名前要加冒號(:)做爲標誌
-
3) 使用指示變量
- 指示變量前也必須加冒號標誌
- 必須緊跟在所指主變量以後
-
-
在SQL語句以外(主語言語句中)使用主變量和指示變量的方法
- 能夠直接引用,沒必要加冒號
-
遊標(cursor)
- SQL語言與主語言具備不一樣數據處理方式
- SQL語言是面向集合的,一條SQL語句原則上能夠產生或處理多條記錄
- 主語言是面向記錄的,一組主變量一次只能存放一條記錄
- 僅使用主變量並不能徹底知足SQL語句嚮應用程序輸出數據的要求
- 嵌入式SQL引入了遊標的概念,用來協調這兩種不一樣的處理方式
- 遊標是系統爲用戶開設的一個數據緩衝區,存放SQL語句的執行結果
- 每一個遊標區都有一個名字
- 用戶能夠用SQL語句逐一從遊標中獲取記錄,並賦給主變量,交由主語言進一步處理
-
創建和關閉數據庫鏈接
-
創建數據庫鏈接
EXEC SQL CONNECT TO target [AS connection-name] [USER user-name];
-
target是要鏈接的數據庫服務器:
- 常見的服務器標識串,如<dbname>@<hostname>:<port>
- 包含服務器標識的SQL串常量
- DEFAULT
- connect-name是可選的鏈接名,鏈接必須是一個有效的標識符 在整個程序內只有一個鏈接時能夠不指定鏈接名
-
-
關閉數據庫鏈接
EXEC SQL DISCONNECT [connection];
-
程序運行過程當中能夠修改當前鏈接 :
EXEC SQL SET CONNECTION connection-name | DEFAULT;
-
-
不用遊標的SQL語句的種類
- 說明性語句
- 數據定義語句
- 數據控制語句
- 查詢結果爲單記錄的SELECT語句
- 非CURRENT形式的增刪改語句
-
使用遊標的SQL語句
-
查詢結果爲多條記錄的SELECT語句
-
使用遊標的步驟
-
1. 說明遊標
- 使用DECLARE語句
-
語句格式
EXEC SQL DECLARE <遊標名> CURSOR
FOR <SELECT語句>;
-
功能
是一條說明性語句,這時DBMS並不執行SELECT指定的查詢操做。
-
2. 打開遊標
- 使用OPEN語句
-
語句格式
EXEC SQL OPEN <遊標名>;
-
功能
打開遊標其實是執行相應的SELECT語句,把全部知足查詢條件的記錄從指定表取到緩衝區中這時遊標處於活動狀態,指針指向查詢結果集中第一條記錄
-
3.推動遊標指針並取當前記錄
- 使用FETCH語句
-
語句格式
EXEC SQL FETCH [[NEXT|PRIOR|
FIRST|LAST] FROM] <遊標名>
INTO <主變量>[<指示變量>][,<主變量>[<指示變量>]]...;
-
功能
指定方向推進遊標指針,而後將緩衝區中的當前記錄取出來送至主變量供主語言進一步處理
NEXT|PRIOR|FIRST|LAST:指定推進遊標指針的方式
NEXT:向前推動一條記錄
PRIOR:向回退一條記錄
FIRST:推向第一條記錄
LAST:推向最後一條記錄
缺省值爲NEXT
-
4. 關閉遊標
- 使用CLOSE語句
-
語句格式
EXEC SQL CLOSE <遊標名>;
-
功能
關閉遊標,釋放結果集佔用的緩衝區及其餘資源
-
說明
遊標被關閉後,就再也不和原來的查詢結果集相聯繫
被關閉的遊標能夠再次被打開,與新的查詢結果相聯繫
-
-
-
CURRENT形式的UPDATE語句
-
CURRENT形式的UPDATE語句和DELETE語句的用途
- 面向集合的操做
- 一次修改或刪除全部知足條件的記錄
-
若是隻想修改或刪除其中某個記錄
- 用帶遊標的SELECT語句查出全部知足條件的記錄
- 從中進一步找出要修改或刪除的記錄
- 用CURRENT形式的UPDATE語句和DELETE語句修改或刪除之
-
UPDATE語句和DELETE語句中的子句:
WHERE CURRENT OF <遊標名>
表示修改或刪除的是最近一次取出的記錄,即遊標指針指向的記錄
-
不能使用CURRENT形式的UPDATE語句和DELETE語句 :
- 當遊標定義中的SELECT語句帶有UNION或ORDER BY子句
- 該SELECT語句至關於定義了一個不可更新的視圖
-
-
- 動態SQL
-
靜態嵌入式SQL
- 靜態嵌入式SQL語句可以知足通常要求
- 沒法知足要到執行時纔可以肯定要提交的SQL語句
-
動態嵌入式SQL
- 容許在程序運行過程當中臨時"組裝"SQL語句
- 支持動態組裝SQL語句和動態參數兩種形式
-
SQL語句主變量:
- 程序主變量包含的內容是SQL語句的內容,而不是原來保存數據的輸入或輸出變量
- SQL語句主變量在程序執行期間能夠設定不一樣的SQL語句,而後當即執行
-
動態參數
- SQL語句中的可變元素
- 使用參數符號(?)表示該位置的數據在運行時設定
-
和主變量的區別
- 動態參數的輸入不是編譯時完成綁定
- 而是經過 (prepare)語句準備主變量和執行(execute)時綁定數據或主變量來完成
-
使用動態參數的步驟:
- 1.聲明SQL語句主變量。
-
2.準備SQL語句(PREPARE)。
EXEC SQL PREPARE <語句名> FROM <SQL語句主變量>;
-
3.執行準備好的語句(EXECUTE)
EXEC SQL EXECUTE <語句名> [INTO <主變量表>] [USING < 主變量或常量>];
- 存儲過程
- PL/SQL的塊結構
-
PL/SOL塊的基本結構:
-
1.定義部分
DECLARE
------變量、常量、遊標、異常等
- 定義的變量、常量等只能在該基本塊中使用
- 當基本塊執行結束時,定義就再也不存在
-
2.執行部分
BEGIN
------SQL語句、PL/SQL的流程控制語句
EXCEPTION
------異常處理部分
END;
-
-
變量常量的定義
-
1. PL/SQL中定義變量的語法形式是:
- 變量名 數據類型 [ [NOT NULL]:=初值表達式]或
- 變量名 數據類型 [ [NOT NULL]初值表達式]
-
2. 常量的定義相似於變量的定義:
- 常量名 數據類型 CONSTANT :=常量表達式
- 常量必需要給一個值,而且該值在存在期間或常量的做用域內不能改變。若是試圖修改它,PL/SQL將返回一個異常。
-
3. 賦值語句
- 變量名稱:=表達式
- 控制結構
-
-
1、條件控制語句
-
IF-THEN, IF-THEN-ELSE和嵌套的IF語句
1. IF condition THEN
Sequence_of_statements;
END IF
2. IF condition THEN
Sequence_of_statements1;
ELSE
Sequence_of_statements2;
END IF;
3. 在THEN和ELSE子句中還能夠再包括IF語句,即IF語句能夠嵌套
-
-
2、循環控制語句
-
LOOP, WHILE-LOOP和FOR-LOOP
1.最簡單的循環語句LOOP
LOOP
Sequence_of_statements;
END LOOP;
多數數據庫服務器的PL/SQL都提供EXIT、BREAK或LEAVE等循環結束語句,保證LOOP語句塊可以結束。
2. WHILE-LOOP
WHILE condition LOOP
Sequence_of_statements;
END LOOP;
每次執行循環體語句以前,首先對條件進行求值
若是條件爲真,則執行循環體內的語句序列。
若是條件爲假,則跳過循環並把控制傳遞給下一個語句
3. FOR-LOOP
FOR count IN [REVERSE]bound1 … bound2 LOOP
Sequence_of_statements;
END LOOP;
-
- 存儲過程的用戶接口
-
1. 建立存儲過程:
CREATE Procedure 過程名([參數1,參數2,...]) AS
<PL/SQL塊>;
- 過程名:數據庫服務器合法的對象標識
- 參數列表:用名字來標識調用時給出的參數值,必須指定值的數據類型。參數也能夠定義輸入參數、輸出參數或輸入/輸出參數。默認爲輸入參數。
- 過程體:是一個<PL/SQL塊>。包括聲明部分和可執行語句部分
-
重命名存儲過程
ALTER Procedure 過程名1 RENAME TO 過程名2;
-
2. 執行存儲過程:
CALL/PERFORM Procedure 過程名([參數1,參數2,...]);
- 使用CALL或者PERFORM等方式激活存儲過程的執行。
- 在PL/SQL中,數據庫服務器支持在過程體中調用其餘存儲過程
-
3. 刪除存儲過程
DROP PROCEDURE 過程名();
- ODBC編程
對象關係數據庫系統
- 對象關係數據庫系統(Object Relational Database System,ORDBS)是面向對象數據模型(Object Oriented Data Model,簡稱OO模型)和關係數據模型相結合的產物
- 面向對象數據模型
- OO模型的核心概念
-
1.對象
- 定義:對象是由一組數據結構和在這組數據結構上的操做的程序代碼封裝起來的基本單位。
-
組成部分
-
屬性(Attribute)集合
- 屬性描述對象的狀態、組成和特性
-
方法(Method)集合
- 描述了對象的行爲特性
-
-
2. 對象標識OID(Object IDentifier)
- 概念:面向對象數據庫中的每一個對象都有一個惟一的不變的標識稱爲對象標識(OID)
-
特色:
- 永久持久性
- 獨立於值的、系統全局惟一的
-
3. 封裝(Encapsulation)
- 每個對象是其狀態與行爲的封裝
- 封裝是對象的外部界面與內部實現之間實行清晰隔離的一種抽象,外部與對象的通訊只能經過消息
- 對象封裝以後查詢屬性值必須經過調用方法
-
4. 類(Class)
- 對象類(簡稱類):共享一樣屬性和方法集的全部對象構成了一個對象類
- 實例:一個對象是某一類的一個實例(instance)
- 在OODB中,類是"型",對象是某一類的一個"值"
- 類層次(結構)
- 繼承
- 對象的嵌套
-
關係數據模型與OO模型的比較
- 對象-關係數據庫
- 對象關係數據庫系統中擴展的關係數據類型
-
1.大對象LOB(Large OBject )類型
- LOB可存儲多達十億字節的串。
-
LOB分類
- 二進制大對象BLOB(Binary Large OBject)
- BLOB用於存儲音頻、圖像數據
- 字符串大對象CLOB(Character Large OBject)。
- CLOB用於存儲長字符串數據
-
2.BOOLEAN類型
- 布爾類型,支持3個真值:true、false和unknown
-
操做符:NOT、AND、OR、EVERY、ANY
- 例如 WHERE EVERY(QTY>200)
- 或WHERE ANY(QTY>200)
- QTY列爲空值:返回unknown;
- QTY列爲非空:
- 當該列的每個值都使(QTY>200)爲true時,EVERY返回true,不然爲false;
- 當該列的每個值都使(QTY>200)爲false時,ANY返回false,不然爲true。
-
3.集合類型(Collection Type)ARRAY
-
相同類型元素的有序集合稱爲數組ARRAY
- SQL3新增的集合類型
- 容許在數據庫的一列中存儲數組
-
SQL3的數組只能是一維的
- 數組中的元素不能再是數組
-
[例2]
CREATE TABLE SALES
(
ITEM_NO CHAR(20), /*商品號*/
QTY INTEGER ARRAY[12], /*整數數組,存放銷售額*/
PRIMARY KEY(ITEM_NO)
);
- 向SALES表插入一個元組:
INSERT INTO SALES(ITEM_NO,QTY)VALUES
('T-shirt2000',ARRAY[200,150,200,100,50,70,
80,200,10,20,100,200]);
-
查找三月份銷售額大於100的商品號:
SELECT ITEM_NO
FROM SALES
WHERE QTY[3]>100;
-
-
4. DISTINCT類型
- SQL3新加了一種DISTINCT類型
-
定義DISTINCT數據類型語法
CREAT TYPE <type name>
AS <built in scalar type name> FINAL
[ <cast option>]
[ <method specification commalist>];
-
沒有使用DISTINCT類型
- 例如,職工的智商字段(IQ)和鞋號字段(SHOE_SIZE)定義成INTEGER類型
- WHERE SHOE_SIZE > IQ
-
使用DISTINCT類型
-
從新定義這兩字段類型
CREAT TYPE SHOE_SIZE_TYPE AS INTEGER FINAL;
CREAT TYPE IQ_TYPE AS INTEGER FINAL;
- SHOE_SIZE_TYPE和IQ _TYPE成爲兩種不一樣的數據類型
- 表達式:WHERE SHOE_SIZE > IQ 是非法的
- 若是在定義類型時設置了選項<cast option>,下面用法也是合法的:WHERE MY_SHOE_SIZE > CAST (MY_IQ AS SHOE_SIZE)
-
- 對象關係數據庫系統中擴展的對象類型及其定義
-
在ORDBMS中,類型(TYPE)具備類(CLASS)的特徵,能夠當作類
-
1.行對象與行類型
-
定義行類型(ROW TYPE) :
CREATE ROW TYPE <row_type_name>
(<component declarations>);
-
建立行類型
-
[例3]
CREATE ROW TYPE Person_type
(pno NUMBER,
name VARCHAR2(100),
address VARCHAR2(100) );
-
-
建立基於行類型的表
CREATE TABLE <table_name> OF <row_type_name>;
-
[例4]
CREATE TABLE person_extent OF Person_type
(pno PRIMARY KEY );
-
-
-
2.列對象與對象類型
- 能夠建立一個對象類型,表的屬性能夠是該對象類型。
-
建立列對象語句以下:
CREATE TYPE <type_name> AS OBJECT
(<component declarations>);
-
[例5]
CREATE TYPE address_objtyp AS OBJECT
(street VARCHAR2(50),
city VARCHAR2(50) );
CREATE TYPE name_objtyp AS OBJECT
(first_name VARCHAR2(30),
last_name VARCHAR2(30) ) ;
- 建立表,定義其中的屬性是對象類型
-
[例6]
CREATE TABLE people_reltab (
Id NUMBER(10),
name_obj name_objtyp,
address_obj address_objtyp);
-
3. 抽象數據類型(Abastract Data Type,ADT)
- 概念:SQL3容許用戶建立指定的帶有自身行爲說明和內部結構的用戶定義類型稱爲抽象數據類型
-
定義ADT的通常形式爲
CREATE TYPE <type_name> (
全部屬性名及其類型說明,
[定義該類型的等於=和小於<函數,]
定義該類型其餘函數(方法));
-
- 參照類型(Reference Type)
-
REF類型(參照類型、引用類型)
-
引入的緣由:
- 類型之間可能具備相互參照的聯繫
-
形式
- REF <類型名>
-
特色:
- REF類型老是和某個特定的類型相聯繫。
- 它的值是OID
-
建立兩個表:Employee和Company,兩表之間存在相互參照關係,即某個職工在某個公司工做
- (1)建立行類型
-
[例7]
CREATE ROW TYPE employee_type(
name VARCHAR(35),
age INTEGER );
CREATE ROW TYPE Comp_type(
compname VARCHAR(20),
location VARCHAR(20) );
-
(2)建立基於行類型的表:
CREATE TABLE Employee OF employee_type;
CREATE TABLE Company OF Comp_type
-
(3)描述參照關係
CREATE ROW TYPE Employment_type (
employee REF (employee_type),
company REF (Comp_type) );
CREATE TABLE Employment OF Employment _type
- 表Employment中某一個元組的employee屬性值是某個職工的OID
- company屬性值是該職工所在公司的OID
-
[例8]
CREATE ROW TYPE employee_type(
name VARCHAR(35),
age INTEGER,
emp_id REF(employee_type) );
-
[例9]
CREATE TABLE Employee OF employee_type
VALUES FOR emp_id ARE SYSTEM GENERATED;
-
創建參照屬性:
<參照屬性名>[REF(<類型名>)]SCOPE IS <關係名>
- [例10]
CREATE TABLE address_objtab OF address_objtyp ;
-
[例11]
CREATE TABLE people_reltab2 (
id NUMBER(4) PRIMARY KEY,
name_obj name_objtyp,
addresss_ref REF(address_objtyp) SCOPE IS address_objtab )
- [例12]
CREATE INDEX address_ref_idx ON people_reltab2(address_ref) ;
-
[例13]
SELECT id
FROM people_reltab2 p
WHERE p.address_ref.city='北京' and
p.address_ref.street='牛街';
-
- 繼承性
-
ORDBMS應該支持繼承性
-
通常是單繼承性
-
[例14]
CREATE TYPE emp_type
UNDER person_type AS(
emp_id INTEGER,
salary REAL )
NOT FINAL;
- NOT FINAL:表示不是類層次結構中最後的"葉結點"
- FINAL:該類型是類層次結構的葉結點
-
-
- 子表和超表
-
[例15] 對於下面的類型層次,先定義這些類型TYPE,而後建立基於這些類型的表
CREATE TYPE person /*建立person 類型,根類型*/
(id INTEGER,
name VARCHAR(20),
birthyear INTEGER,
address VARCHAR(40))
NOT FINAL; /*NOT FINAL表示能夠有子類型*/
CREATE TYPE employee /*建立person的子類型employee*/
UNDER person /*類型employee繼承person的屬性*/
(salary INTEGER) /* employee定義本身的屬性*/
NOT FINAL;
CREATE TYPE executive /*建立employee的子類型executive*/
UNDER employee
(bonus INTEGER)
FINAL;
CREATE TYPE student /*建立person的子類型student */
UNDER person
(major VARCHAR(10),wage DECIMAL)
FINAL
-
例16]Department類型和employee具備相互參照的聯繫,使用REF來表示這種聯繫
CREATE TYPE department
(ID INTEGER,
manager REF(employee),
Budget INTEGER);
ALTER TYPE employee
ADD ATTRIBUTE dept REF(department);
-
定義基於這些類型的基本表和表層次:
CREATE TABLE person_table OF person
(name WITH OPTIONS NOT NULL);
CREATE TABLE employee_table OF employee
UNDER person_table;
CREATE TABLE exec_table of executive
UNDER employee_table
CREATE TABLE student_table OF student
UNDER person_table;
CREATE TABLE dept_table OF department
(manager SCOPE IS employee_table);
ALTER TABLE employee_table
ALTER COLUMN dept ADD SCOPE IS dept_table;
-
查詢[例16]所建立的表
-
[例17]
SELECT name,address
FROM person_table
WHERE birthyear <=1970;
-
-
關閉子表的檢索
-
[例18]
SELECT name,address
FROM ONLY person_table
WHERE birthyear <=1970;
-
INSERT、DELETE、UPDATE對子表和超表的操做規則
- INSERT:向子表插入一行時通常會在該子表的超表上也插入一行。
- DELETE:從表刪除一行時通常會在該表的超表和子表上也刪除相應的一行
-