4使用SQL语言创建数据对象.docx
- 文档编号:30192512
- 上传时间:2023-08-07
- 格式:DOCX
- 页数:15
- 大小:24.22KB
4使用SQL语言创建数据对象.docx
《4使用SQL语言创建数据对象.docx》由会员分享,可在线阅读,更多相关《4使用SQL语言创建数据对象.docx(15页珍藏版)》请在冰豆网上搜索。
4使用SQL语言创建数据对象
上一章:
数据存放
第四章使用SQL语言创建数据对象
让我们使用SQL语句创建某些数据对象。
在本章的开头,我们曾经把SQL语言分为三部分:
·DDL数据定义语言
·DCL数据控制语言
·DML数据操纵语言
允许我们定义和修改数据库对象的SQL语句组叫做DDL或数据定义语言(DataDefinintionLanguage)。
数据定义语言包含三类SQL语句:
·CREATE
·ALTER
·DROP
4.1CREATE语句
CREATE
CREATE语句用来对数据库对象进行初始定义。
被创建的
·表
·窗口
·别名
·用户自定义函数(FUNCTION)
·触发器
·事件监视器
·索引
·用户自定义数据类型(DISTINCTTYPE)
·表空间
使用DDL语言创建任何数据库对象的结果将产生对系统编目表的更新。
创建这些数据库对象需要特殊的数据库。
数据库对象可以用于各种目的。
某些数据库对象用来定义一种条件或联系(索引、监视器、触发器),其它数据库对象只是简单的定义用户数据(表、表空间)的位置。
4.2DROP语句
DROP
DROP(去除)语句用来删除系统编目表内的约束条件或定义。
因为系统编目表不能被直接删除,DROP语句用来从这些表中删除数据记录。
因为数据库对象可能依赖于其它数据库对象,去除一个对象的动作可能会导致一个相关的对象成为无效。
被去除的
·表
·窗口
·别名
·用户自定义函数(FUNCTION)
·触发器
·事件监视器
·索引
·用户自定义数据类型(DISTINCTTYPE)
·表空间
4.3ALTER语句
ALTER
ALTER(更改)语句允许用户更改某些数据库对象信息(数据库对象必须已经存在于数据库中)。
用户可以更改一个表或表空间。
被更改的
1.表(Table)。
2.表空间(TableSpace)
[注解]:
用户不能更改窗口或索引。
用户必须去除原有的窗口或索引,然后再创建新的窗
口或索引。
每次用户发出一条DDL语句,系统编目表将被更新。
这种更新包括创建或修改时间印
戳和创建者(修改者)的HPuthid(权限标识)。
[注解]:
以下的做法是有益的:
将针对数据库的所有DDL语句存储到命令行处理器(CLP)输入文件中,以便允许更容易地创建数据库对象。
4.4创建DB2数据库
在创建任何数据库对象之前,必须存在某个DB2数据库。
必须给数据库一个名字。
(该
数据库不与任何模式相关。
)一旦创建了数据库之后,下一个逻辑步骤是要创建表空间。
[注解]:
CREATEDATABASE命令不是一条SQL语句。
其中的数据库名的长度是1至8个字符。
表空间类型
在DB2中,有两种类型的表空间:
·系统管理存储器(SMS──SystemManagedStorage)表空间
·数据库管理存储器(DMS──DatabaseManagedStorages)表空间
系统管理的表空间(SMS)
在系统管理存储器(SMS)中,DB2使用它自己的管理机制去存储和定位数据库对象。
执行CREATETABLESPACE命令期间,为这些表空间分配磁盘空间。
数据库管理的表空间(DMS)
在系统管理的表空间(DMS)的表空间中,DB2使用它自己的存储器机制去存储和定位数据库对象。
这类表空间的磁盘空间在执行CREATETABLESPACE语句期间分配。
[注解]:
如果使用DMS表空间,用户将需要计算表所期望的磁盘空间。
默认的表空间
当创建数据库时,DB2将按照默认方式创建三种表空间:
这些表空间是SMS(系统管理的表空间)。
它们是
SYSCATSPACE──包含系统编目
TEMPSPACE1──保存临时表
USERSPACE1──包含所有用户数据
4.5视图
视图是使用CREATEVIEW语句创建的逻辑表。
一旦视图被定义,就可以使用DML语句(SELECT、INSERT、UPDATE、DELETE)去访问它,就仿佛它是一个基表一样。
视图是一个临时表,视图只能在查询期间被访问。
现在让我们来为DB2课程授证考试数据库创建基于test_taken表之间的一个视图。
这个表用来存储所有的应考学员标识符、考试编号和考试中心编号,应考学员需要在考试中心参加DB2课程授证考试。
出于安全性的考虑,一个考试场所只能安排应考学员在他们所在地区的考试。
用户可以不去为每个考试中心创建一个单独的表,而是为每个引用单个表的考试中心创建一个视图。
如果我们为每个考试中心创建了一个单独的表,并且用户想要得到有关所有考试中心的报告,这将需要大量的表进行连接。
在创建视图之后,可以指定存取特权。
这将提供数据的安全性,因为只有基表的受限制的视图可以被访问。
窗口可以包含一条WHERE子名去将存取操作限定至针对某些行,或者一个视图只包含一部分列,以将访问限制到某些数据列上。
在我们的例子中,视图需要将访问限制在test_taken表的某些行上。
在图4.18中给出了视图db2.test_taken_tx01的定义,该视图用来将行限制到只能由考试中心tx01存取的那些考试(行)上。
如图4.18所示,我们从test_taken表中选择所有的列,但是我们正在限定到tcid列上。
这一定义将仅显示已经报名参加在考试中心tx01举行的考试的那些应考学员的信息。
CREATEVIEW语句用来定义视图名及其它的列。
视图总是通过对一个或多个表使用SELECT语句来定义。
[注解]:
视图总是使用一条SELECT语句来定义。
在视图中的列名不需要与基表中的列名相匹配。
表名有一个相关的模式,视图名也同样有一个相关的模式。
在图4.18中,基表和视图对应的模式名都是db2。
CREATEVIEWdb2.test_taken_tx01
(tcid,
cid,
number,
date_taken,
start_time,
finish_time,
score,
seat_no)
AS
SELECT
tcid,
cid,
number,
date_taken,
start_time,
finsh_time,
score,
seat_no
FROMdb2.test_taken
WHERECHAR(tcid)=′TX01′
图4.18定义视图Test_Taken_Tx01
一旦定义了视图后,视图就可以(带有限制条件)被用于象SELECT、INSERT、UPDATE和DELETE这样的DML语句中。
数据库管理员可以决定为一组用户提供对于视图而不是基表的更高一级的存取特权。
例如,一个考试中心协调员能够更新有关视图db2.text_taken_tx01的特权,而同时不更新表db2.test_taken的特权。
如果视图db2.test_taken_tx01作为更新操作的目标表,其中的WHERE条件将不进行验证。
因此,如图4.18中所定义的视图不能保证某个INSERT或UPDATE操作将不影响其它考试中心的数据。
[注解]:
按照默认方式,视图定义中的谓词(WHERE句子)对UPDATE不起作用。
4.5.1带有CheckOption成分的视图
如果视图定义语句包含条件(比如,一条WHERE子句)并且试图保证,任何引用该视图的INSERT或UPDATE语句都应用一条WHERE子句,这个视图必须使用WITHCHECKOPTION成分来定义,这样的视图也叫做调和视图(symmetricview)。
这一选区项可以保证数据库中被修改数据的完整性。
如果执行INSERT或UPDATE操作期间,违反条件,那么将返回一个SQL错误。
图4.19是使用WITHCHECKOPTION成分对视图进行定义的例子。
让我们假设,考试中心TX01只有两个座位。
想限制表中的值以便确保座位号码是1或2。
这时需要用到WITHCHECKOPTION选项去保证不断对条件进行检查。
CREATEVIEWdb2.tx01_seats
(tcid,
cid,
number,
date_taken,
start_time,
finish_time,
score,
seat_no)
AS
SELECT
tcid,
cid,
number,
date_taken,
start_time,
finsh_time,
score,
seat_no
FROMdb2.test_taken
WHERECHAR(tcid)=′TX01′
ANDseat_no
BETWEEN′1′AND′2′
WITHCHECKOPTION
图4.19带有WITHCHECKOPTION成分的视图定义
在图4.19中的视图包含WITHCHECK选项。
这将是seat_no列的输入值。
当视图被用来插入新值时,WITHCHECKOPTION部分的功能总会被实施。
如果图4.19中的视图被用于INSERT语句中,对于其seat_no列值不是1或2的那些行将被拒绝。
重要的是要记住,如果不规定WITHCHECKOPTION,当遇到修改时,将不进行数据的有效性检查。
如果图4.19中的视图被用于SELECT语句中,那么条件(WHERE子句)将被调用并且结果表将只包含匹配的数据行。
对于象在图4.19中所定义的视图,还有一些管理问题需要强调。
如果考试中心tx01为其考试设施增加了更多的座位,那么需要改变BETWEEN子句的内容。
为此,我们可以创建一个稍有不同的视图,它可以通过增加一个子查询来避免这个修改问题。
这个子查询有单值的结果,如图4.20中所示。
在图4.20中,视图用表db2.test_center的值定义,以便在使用该视图插入新值的时候对座位值的有效性进行核查。
第二条SELECT语句是确保不返回1个以上的值,因为tcid列是主码。
CREATEVIEWdb2.tx01_seats
(tcid,
cid,
number,
date_taken,
start_time,
finish_time,
score,
seat_no)
AS
SELECT
tcid,
cid,
number,
date_taken,
start_time,
finsh_time,
score,
seat_no
FROMdb2.test_taken
WHERECHAR(tcid)=′TX01′
ANDSMALLINT(seat_no)
BETWEEN′1′AND
(SELECTno_seatFROMdb2.test_center
WHERECHAR(TCID)=′TX01′)
WITHCHECKOPTION
图4.20在谓词中带有子查询的视图
4.5.2嵌套视图定义
如果一个窗口基于另一个视图之上,那么谓词核查的量是基于短语WITHCHECKOOPTION的使用之上。
如果视图V2是基于视图V1之上,并且有关V2的核查选项是WITHCASADEDCHECKOPTION,那么在使用V2视图的INSERT和UPDATE活动期间,对两个视图的谓词都需要计算。
如果视图V2是基于视图V1之上,并且有关V2的核查选项是WITHLOCALCHECKOPTION,那么使用V2视图的INSERT和UPDATE活动期间,仅对视图V2的谓词进行计算。
[注解]:
WITHCHECKOPTION并不影响只读视图的结果集。
4.5.3修改视图
视图是临时的表定义。
视图存储在系统编目表中。
因此,如果执行数据库的备份,视图定义便被保存在被备份的影象中。
在视图中包含的数据,只能在SQL中引用视图时可以被访问。
与其它DB2对象不同,不能使用ALTER语句去更改视图。
如果需要以某种方式去改变视图,则必须去除原有的视图,再创建视图。
如果某个被引用的数据库对象从数据库中被去除,那么该视图将变成不可操作的(inoperative)。
这些视图的依赖关系存储在叫做SYSCAT.VIEWDEP的系统表中。
系统编目表SYSCAT.VIEWS保存着一个叫做VALID的列,如果视图变成不可操作的,该列将包含字符X。
如果去除表db2.test_taken,那么db2.test_taken和窗口db2.tx01_seats将变成如图4.21所示的不可操作视图。
SELECTVIEWNAME,VIEWCHECK,READONLY,VALID
FROMSYSCAT.VIEWS
WHEREVIEWSCHEMA=ˊDB2ˊ
VIEWNAMEVIEWCHECKREADONLYVALID
----------------
TEST_TAKEN_TX01NNX
TE01_SEATSCNX
图4.21不可操作的视图
图4.21中显示了两个不可操作的视图。
Valid列包含X值(Y的值表示视图是有效的)。
图4.21中的询问没有显示正文列的内容。
这个列包含原始的CREATEVIEW语句正文。
viewcheck列与CREATEVIEW语句中的WITHCHECKOPTION相对应。
N值表示没有规定任何核查选项,L表示规定的是local(本地)核查选项,C表示指定了cascaded(级联)核查选项。
[注解]:
视图总是实施基表的约束条件。
这些约束条件可能包括主码、外来码、表核查或非空约束条件。
4.5.4可删除的视图
根据视图的定义,决定视图能够或不能够用于DELETE语句。
在图4.21中,只读列用来决定该视图是否只能用于SELECT语句。
我们已经定义的视图被认为是可更新的和可删除的,因为read-only列包含的值是N。
如果视图的定义坚持以下的规则,那么该视图可以用于DELETE语句中。
·外层完全选择(fullselect)的FROM语句只标识基表、可删除的表、可删除的嵌套表表达式或可删除的常用表表达式。
·外层完全选择不包含VALUE子句。
·外层完全选择不包含GROUPBYHAVING子句。
·外层完全选择不包含选择列表中的列函数。
·外层完全选择不包含集合操作(UNION、EXCEPT或INTERSECT),UNIONALL操作列外。
·当使用UNIONALL操作时,所有的操作数必须是可删除的,并且不能是同一个表。
·外层完全选择的选定不包含DISTINCT。
4.5.5可更新的视图
如果视图满足一个可删除视图的要求以及所有以下的条件,那么这个视图就被认为是可更新的。
·被更新的列必须是求解基表中的一列。
它不能是一个派生列。
·基于UNIONALL之上的视图的所有列必须有匹配的数据类型和默认值。
4.5.6可插入的视图
如果视图的所有列都是可更新的,并且该视图的完全选择不包括UNIONALL,那么这个视图被认为是可插入的视图。
4.6索引
索引代表了数据库内数据的复制。
当插入、更新或删除数据时,按照指定的次序(升序或降序)维护索引。
·以保证值的唯一性。
·以便改变查询性能。
如果对于单列或多列已经定义了一个UNIQUE(唯一性)索引,就能够保证数据唯一性。
查询选择期间可以使用唯一性的索引,以便更快地检索数据。
通过维护数据的一种排序次序,NON-UNIQUE(非唯一性)索引也能改进查询性能。
如果对表定义了一个唯一性索引,那么DB2将不允许有任何重复的键值。
索引键值由DB2基于索引定义(CREATEINDEX语句)之上产生。
索引键可由一个或多个列组成。
[注解]:
存储到数据库中的数据记录没有定义任何次序。
相应的索引用CREATEINDEX语句定义
的次序存储。
索引保持的键值与基表中的数据行相对应。
对表可以定义多重索引,但是要记住,每个索引都必须由DB2维护(这可能增加了更新、删除、插入的时间)。
因此,如果有一个表有三个索引,并且该表含有100行数据,将需要产生300个索引键值。
索引包括一个指针,即记录识码(RID-recordid),它指向表中对应表行的物理位置。
让我们用列Iname、fname、initial在db2.candidate表上创建一个唯一性索引。
db2.icandidate_by_Iname将按照键列(Inames、fname、initial)组合值的升序排列去存储RIDs(记录标识码)。
[注解]:
默认的索引排序次序是ascending(升序)。
让我们发出以下的SQL语句:
SELECTIname,fname,initial
FROMdb2.candidate
LDDERBYIname
db2.icandidate_by_Iname将可能用来检索结果,因为所有要求的数据都驻留在索引中,并且索引已经按照适当的次序(升序)排列好。
不需要使用临时表去对数据排序。
如果SQL语句已经声明了一个升序结果表,那么图4.22中的索引不大可能用于求解这一查询。
DB2索引不能同时跨越两个方向(沿升序和降序)。
因此,用户可以在同一键列上定义两个索引,一个索引按照升序排列,一个索引按照降序排列。
要按照降序排列,可以在列名后加上关键字DESC。
CREATEUNIQUEINDEXdb2.icandidate_by_Iname
ONdb2.candidate
(Iname,
fname,
initial)
图4.22建立索引的例子
图4.23中定义的索引表明,指定降序索引列的一个例子。
要创建非唯一性的索引,可略去CREATEINDEX语句中的关键字UNIQUE。
在图4.23中,索引可能已经被定义为非唯一性索引,因为可能存在有姓、名和姓名起首字母相同的应考学员。
CREATEUNIQUEINDEXdb2.icandidate_by_Iname
ONdb2.candidate
(InameDESC,
fname,
initial)
图4.23降序排列
DB2用的唯一性索引去实现声明的引用约束条件。
当我们为DB2课程授证考试数据库创建这个表(图4.15)时,我们声明了一个主码约束条件。
这个索引保证每个数据记录的唯一性,并且它不能使用DROPINDEX命令去除。
4.6.1一般的索引指导原则
索引需要消耗磁盘空间。
所消耗磁盘空间的数量与索引键列的长度密切相关。
索引占据空间的大小随着被插入基列表的数据日而增加。
因此当规划数据库的大小时,要考虑索引所需要的磁盘空间。
有关建立索引的一些考虑包括:
·主码约束条件将总会创建一个唯一性索引。
·在外来码约束条件列上创建索引,通常是有益的。
·选择带有最高基数(cardinality)(不同值)的列作索引键列。
4.6.2更改索引
要想改变索引属性,只有通过重新创建索引定义才行。
例如,用户不能不去除原有的索引定义并创建一个新索引,把一列增加到键列序列中。
用户可以决定使用COMMENTON语句增加注释,描述索引的目的。
[注解]:
有一条ALTERINDEX(更改索引)语句。
4.6.3引用的完整性和索引
我们曾经讨论过定义主码怎样保证列值唯一性以及怎样使用索引维护主码键。
这一索引被称为表的主索引。
这些索引给出的名字是SYSIBM.SQL
样列系统产生的索引可看第一章中介绍“VisualExplain快照”小节的内容。
为了删除主索引,可以使用带选项DROPPRIMARYKEYCONSTRAINT的ALTERTABLE语句。
[注解]:
DB2使用唯一性索引和NOTNULL选项去维护主码约束条件。
当用户在表上定义外来码时,将不能创建系统定义的索引。
出于性能上的考虑,在外来码上创建索引是有益的。
4.6.4空值和索引
重要的是要理解主码约束条件与唯一性索引的区别。
DB2使用唯一性索引和NOTNULL这两个要素去实现主码的关系数据库概念。
所以,唯一性索引不强制实施主码约束条件,因为决不能在表中使用空值。
使用允许空值的列可以创建一个非唯一性索引。
表4.8中给出了这样的一个表。
该表由三列组成:
名字、姓名起首字母、姓。
用这三列定义一个索引,并将initial(姓名起首字母)列定义为允许包含空值。
空值是未知的值,但在索引中,空值被处理为等于所有其空值。
在我们例子中,在执行INSERT语句期间,第二条语句将产生错误,因为它违反了索引的唯一性规律。
[注解]:
在唯一性索引定义内,避免使用空值列。
表4.8随索引使用的空值
Firstname(名字)
Initial(姓名起首字母)
Lastname(姓)
Anna
Anna
NULL
NULL
Padilla
Padella
下一章:
数据移动
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 SQL 语言 创建 数据 对象