数据库概念数据库
数据库(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对子表和超表的操做规则