數據庫概念數據庫
數據庫(Database,簡稱DB)是長期儲存在計算機內、有組織的、可共享的大量數據的集合。編程
關係模式能夠形式化地表示爲:數組
R(U,D,DOM,F)安全
R 關係名服務器
U 組成該關係的屬性名集合數據結構
D 屬性組U中屬性所來自的域閉包
DOM 屬性向域的映象集合框架
F 屬性間的數據依賴關係集合less
若屬性(或屬性組)F是基本關係R的外碼它與基本關係S的主碼Ks相對應(基本關係R和S不必定是不一樣的關係),則對於R中每一個元組在F上的值必須爲:數據庫設計
關係數據庫標準語言SQL
SQL(Structured Query Language)結構化查詢語言,是關係數據庫的標準語言。集數據定義語言(DDL),數據操縱語言(DML),數據控制語言(DCL)功能於一體。能夠獨立完成數據庫生命週期中的所有活動:
定義模式
在CREATE SCHEMA中能夠接受CREATE TABLE,CREATE VIEW和GRANT子句。
CREATE SCHEMA <模式名> AUTHORIZATION <用戶名>[<表定義子句>|<視圖定義子句>|<受權定義子句>]
刪除模式
DROP SCHEMA <模式名> <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索引來實現
創建索引
語句格式
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
刪除索引
DROP INDEX <索引名>;
語句格式
SELECT [ALL|DISTINCT] <目標列表達式>[,<目標列表達式>] …
FROM <表名或視圖名>[, <表名或視圖名> ] …
[ WHERE <條件表達式> ]
[ GROUP BY <列名1> [ HAVING <條件表達式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
單表查詢
ORDER BY子句
彙集函數
HAVING短語與WHERE子句的區別:
查 詢 條 件
謂 詞
比 較
=,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比較運算符
肯定範圍
BETWEEN AND,NOT BETWEEN AND
肯定集合
IN,NOT IN
字符匹配
LIKE,NOT LIKE
空 值
IS NULL,IS NOT NULL
多重條件(邏輯運算)
AND,OR,NOT
鏈接查詢
自身鏈接
一個表與其本身進行鏈接
外鏈接
外鏈接與普通鏈接的區別
左外鏈接
右外鏈接
嵌套查詢
一個SELECT-FROM-WHERE語句稱爲一個查詢塊
將一個查詢塊嵌套在另外一個查詢塊的WHERE子句或HAVING短語的條件中的查詢稱爲嵌套查詢
子查詢的限制
不能使用ORDER BY子句
嵌套查詢求解方法
子查詢的查詢條件不依賴於父查詢
帶有比較運算符的子查詢
帶有ANY(SOME)或ALL謂詞的子查詢
須要配合使用比較運算符
帶有EXISTS謂詞的子查詢
帶有EXISTS謂詞的子查詢不返回任何數據,只產生邏輯真值"true"或邏輯假值"false"。
2. NOT EXISTS謂詞
集合查詢
集合操做的種類
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 <權限>[,<權限>]...
[ON <對象類型> <對象名>]
TO <用戶>[,<用戶>]...
[WITH GRANT OPTION];
WITH GRANT OPTION子句
WITH GRANT OPTION子句:
REVOKE
REVOKE <權限>[,<權限>]...
[ON <對象類型> <對象名>]
FROM <用戶>[,<用戶>]...;
建立數據庫模式的權限
CREATE USER <username>
[WITH][DBA | RESOURCE | CONNECT]
數據庫角色:被命名的一組與數據庫操做相關的權限
角色的建立
CREATE ROLE <角色名>
給角色受權
GRANT <權限>[,<權限>]…
ON <對象類型>對象名
TO <角色>[,<角色>]…
將一個角色授予其餘的角色或用戶
GRANT <角色1>[,<角色2>]…
TO <角色3>[,<用戶1>]…
[WITH ADMIN OPTION]
角色權限的收回
REVOKE <權限>[,<權限>]…
ON <對象類型> <對象名>
FROM <角色>[,<角色>]…
數據庫完整性
數據庫的完整性
數據的完整性和安全性是兩個不一樣概念
數據的完整性
數據的安全性
實體完整性
關係模型的實體完整性
單屬性構成的碼有兩種說明方法
對多個屬性構成的碼只有一種說明方法
參照完整性
關係模型的參照完整性定義
用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)
/*在表級定義參照完整性*/
);
用戶定義的完整性
屬性上的約束條件的定義
屬性上的約束條件檢查和違約處理
元組上的約束條件的定義
元組上的約束條件檢查和違約處理
完整性約束命名子句
CONSTRAINT 約束
CONSTRAINT <完整性約束條件名>
[PRIMARY KEY短語
|FOREIGN KEY短語
|CHECK短語]
觸發器
定義觸發器
CREATE TRIGGER語法格式
CREATE TRIGGER <觸發器名>
{BEFORE | AFTER} <觸發事件> ON <表名>
FOR EACH {ROW | STATEMENT}
[WHEN <觸發條件>]
<觸發動做體>
定義觸發器的語法說明:
5. 觸發器類型
6. 觸發條件
7. 觸發動做體
激活觸發器
一個數據表上可能定義了多個觸發器
刪除觸發器
刪除觸發器的SQL語法:
DROP TRIGGER <觸發器名> ON <表名>;
關係數據理論
數據依賴
數據依賴的類型
數據依賴對關係模式的影響
"好"的模式:
函數依賴
在關係模式R(U)中,對於U的子集X和Y,
徹底函數依賴與部分函數依賴
傳遞函數依賴
碼
主屬性與非主屬性
全碼
外部碼
範式
範式的種類:
1NF
1NF的定義
2NF
2NF的定義
3NF
3NF的定義
BC範式(BCNF)
若R∈BCNF
多值依賴
定義6.9
多值依賴的另外一個等價的形式化的定義:
平凡多值依賴和非平凡的多值依賴
多值依賴的性質
多值依賴與函數依賴的區別
(2)
4NF
若是R ∈ 4NF, 則R ∈ BCNF
數據依賴的公理系統
邏輯蘊含
關係模式R <U,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.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爲一個極小函數依賴集。亦稱爲最小依賴集或最小覆蓋。
極小化過程
定理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。
模式的分解
三種模式分解等價的定義:
具備無損鏈接性的模式分解
保持函數依賴的模式分解
關係模式的規範化,其基本思想:
小結
數據庫設計
數據庫設計的特色
基本思想:過程迭代和逐步求精
新奧爾良(New Orleans)方法
基於E-R模型的數據庫設計方法
3NF(第三範式)的設計方法
ODL(Object Definition Language)方法
計算機輔助設計
數據庫設計的基本步驟
數據庫設計分6個階段
數據庫設計不一樣階段造成的數據庫各級模式
自頂向下、逐層分解分析系統
2.分解處理功能和數據
(1)分解處理功能
(2)分解數據
(3)表達方法
3.將分析結果再次提交給用戶,徵得用戶的承認
數據字典的用途
數據字典的內容
⒈ 數據項
對數據項的描述
數據項描述={數據項名,數據項含義說明,別名,
數據類型,長度,取值範圍,取值含義,
與其餘數據項的邏輯關係,數據項之間的聯繫 }
⒉ 數據結構
對數據結構的描述
數據結構描述={數據結構名,含義說明,
組成:{數據項或數據結構}}
⒊ 數據流
對數據流的描述
數據流描述={ 數據流名,說明,數據流來源,
數據流去向,組成:{數據結構},
平均流量,高峯期流量}
⒋ 數據存儲
對數據存儲的描述
數據存儲描述={數據存儲名,說明,編號,
輸入的數據流 ,輸出的數據流 ,
組成:{數據結構},數據量,存取頻度,存取方式}
⒌ 處理過程
處理過程說明性信息的描述
處理過程描述={處理過程名,說明,輸入:{數據流},
輸出:{數據流},處理:{簡要說明}}
設計概念結構的四類方法
經常使用策略
自底向上地設計概念結構
自底向上設計概念結構的步驟
第2步:集成局部視圖,獲得全局概念結構
數據抽象與局部視圖設計
數據抽象
三種經常使用抽象
1. 分類(Classification)
2. 彙集(Aggregation)
3. 歸納(Generalization)
局部視圖設計
設計分E-R圖的步驟:
⒈選擇局部應用
⒉逐一設計分E-R圖
任務
兩條準則:
數據模型的優化
優化數據模型的方法
1肯定數據依賴
2消除 冗餘的聯繫
3肯定所屬範式
設計用戶子模式
定義用戶外模式時應該注重的問題
包括三個方面:
關係模式存取方法選擇
DBMS經常使用存取方法
索引方法
聚簇(Cluster)方法
選擇索引存取方法的通常規則
聚簇
聚簇的用途
2. 節省存儲空間
聚簇的侷限性
2. 創建與維護聚簇的開銷至關大
肯定數據的存放位置
根據應用狀況將
數據庫編程
數據庫工做單元與源程序工做單元之間的通訊:
1. SQL通訊區
2. 主變量
3. 遊標
在SQL語句中使用主變量和指示變量的方法
1) 說明主變量和指示變量
BEGIN DECLARE SECTION
.........
......... (說明主變量和指示變量)
.........
END DECLARE SECTION
2) 使用主變量
3) 使用指示變量
在SQL語句以外(主語言語句中)使用主變量和指示變量的方法
遊標(cursor)
創建和關閉數據庫鏈接
創建數據庫鏈接
EXEC SQL CONNECT TO target [AS connection-name] [USER user-name];
target是要鏈接的數據庫服務器:
關閉數據庫鏈接
EXEC SQL DISCONNECT [connection];
程序運行過程當中能夠修改當前鏈接 :
EXEC SQL SET CONNECTION connection-name | DEFAULT;
不用遊標的SQL語句的種類
使用遊標的SQL語句
查詢結果爲多條記錄的SELECT語句
使用遊標的步驟
1. 說明遊標
語句格式
EXEC SQL DECLARE <遊標名> CURSOR
FOR <SELECT語句>;
功能
是一條說明性語句,這時DBMS並不執行SELECT指定的查詢操做。
2. 打開遊標
語句格式
EXEC SQL OPEN <遊標名>;
功能
打開遊標其實是執行相應的SELECT語句,把全部知足查詢條件的記錄從指定表取到緩衝區中這時遊標處於活動狀態,指針指向查詢結果集中第一條記錄
3.推動遊標指針並取當前記錄
語句格式
EXEC SQL FETCH [[NEXT|PRIOR|
FIRST|LAST] FROM] <遊標名>
INTO <主變量>[<指示變量>][,<主變量>[<指示變量>]]...;
功能
指定方向推進遊標指針,而後將緩衝區中的當前記錄取出來送至主變量供主語言進一步處理
NEXT|PRIOR|FIRST|LAST:指定推進遊標指針的方式
NEXT:向前推動一條記錄
PRIOR:向回退一條記錄
FIRST:推向第一條記錄
LAST:推向最後一條記錄
缺省值爲NEXT
4. 關閉遊標
語句格式
EXEC SQL CLOSE <遊標名>;
功能
關閉遊標,釋放結果集佔用的緩衝區及其餘資源
說明
遊標被關閉後,就再也不和原來的查詢結果集相聯繫
被關閉的遊標能夠再次被打開,與新的查詢結果相聯繫
CURRENT形式的UPDATE語句
CURRENT形式的UPDATE語句和DELETE語句的用途
若是隻想修改或刪除其中某個記錄
UPDATE語句和DELETE語句中的子句:
WHERE CURRENT OF <遊標名>
表示修改或刪除的是最近一次取出的記錄,即遊標指針指向的記錄
不能使用CURRENT形式的UPDATE語句和DELETE語句 :
靜態嵌入式SQL
動態嵌入式SQL
SQL語句主變量:
動態參數
和主變量的區別
使用動態參數的步驟:
2.準備SQL語句(PREPARE)。
EXEC SQL PREPARE <語句名> FROM <SQL語句主變量>;
3.執行準備好的語句(EXECUTE)
EXEC SQL EXECUTE <語句名> [INTO <主變量表>] [USING < 主變量或常量>];
PL/SOL塊的基本結構:
1.定義部分
DECLARE
------變量、常量、遊標、異常等
2.執行部分
BEGIN
------SQL語句、PL/SQL的流程控制語句
EXCEPTION
------異常處理部分
END;
變量常量的定義
1. PL/SQL中定義變量的語法形式是:
2. 常量的定義相似於變量的定義:
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塊>;
重命名存儲過程
ALTER Procedure 過程名1 RENAME TO 過程名2;
2. 執行存儲過程:
CALL/PERFORM Procedure 過程名([參數1,參數2,...]);
3. 刪除存儲過程
DROP PROCEDURE 過程名();
對象關係數據庫系統
1.對象
組成部分
屬性(Attribute)集合
方法(Method)集合
2. 對象標識OID(Object IDentifier)
特色:
3. 封裝(Encapsulation)
4. 類(Class)
關係數據模型與OO模型的比較
1.大對象LOB(Large OBject )類型
LOB分類
2.BOOLEAN類型
操做符:NOT、AND、OR、EVERY、ANY
3.集合類型(Collection Type)ARRAY
相同類型元素的有序集合稱爲數組ARRAY
SQL3的數組只能是一維的
[例2]
CREATE TABLE SALES
(
ITEM_NO CHAR(20), /*商品號*/
QTY INTEGER ARRAY[12], /*整數數組,存放銷售額*/
PRIMARY KEY(ITEM_NO)
);
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類型
定義DISTINCT數據類型語法
CREAT TYPE <type name>
AS <built in scalar type name> FINAL
[ <cast option>]
[ <method specification commalist>];
沒有使用DISTINCT類型
使用DISTINCT類型
從新定義這兩字段類型
CREAT TYPE SHOE_SIZE_TYPE AS INTEGER FINAL;
CREAT TYPE IQ_TYPE AS INTEGER FINAL;
在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)
定義ADT的通常形式爲
CREATE TYPE <type_name> (
全部屬性名及其類型說明,
[定義該類型的等於=和小於<函數,]
定義該類型其餘函數(方法));
REF類型(參照類型、引用類型)
引入的緣由:
形式
特色:
建立兩個表:Employee和Company,兩表之間存在相互參照關係,即某個職工在某個公司工做
[例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
[例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 <關係名>
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 )
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;
[例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對子表和超表的操做規則