首页 理论教育SQL兼具对象特色|分布式数据库技术

SQL兼具对象特色|分布式数据库技术

【摘要】:SQL:1999[7]是ISO制定的一个国际标准。可以说SQL3是为面向对象SQL而定义的,计划作为对象-关系数据库管理系统的基础。与SQL-92相比,新的语言增加了面向对象的特征。JTC 1中的分委员会SC32负责数据库的标准问题,其中,WG3负责SQL标准,而WG4关注SQL/MM。

关系型数据库系统的语言接口是SQL语言。因此这里讨论SQL语言的面向对象扩展问题,特别是SQL3(SQL:1999)的特征。

SQL:1999[7](原称SQL3,为了简洁,下面也称SQL3)是ISO制定的一个国际标准。可以说SQL3是为面向对象SQL(object-oriented SQL)而定义的,计划作为对象-关系数据库管理系统的基础。这类系统如Oracle公司的Oracle 8及以后的系统,原Informix公司的Universal Server,IBM公司的DB2 Universal Database等。原计划3~4年完成,结果花了将近7年的时间。与SQL-92相比,新的语言增加了面向对象的特征。

国际上,ISO/IEC JTC 1(Joint Technical Committee 1)和联合国际电工委员会(International Electrotechnical Commission)负责信息技术的标准问题。JTC 1中的分委员会SC32(数据管理与交换分技术委员会)负责数据库的标准问题,其中,WG3负责SQL标准,而WG4关注SQL/MM(SQL Multi Media,使用SQL的面向对象工具指定类型库的一套标准)。

同时,在美国,美国国家标准学会(ANSI)也在从事类似的工作,如ANSI的国家信息技术标准化委员会(National Committee for Information Technology Standardization,NCITS,前称为“X3”)。NCITS的技术委员会H2(前称为“X3 H2”)负责一些和数据管理相关的标准,包括SQL和SQL/MM。

1.类型

第一代SQL语言及其继承者是SQL-86和SQL-89,随后诞生SQL-92。作为后继,SQL:1999首先引入了以下几个新的数据类型。

第一个数据类型是大对象(LARGE OBJECT),即LOB类型。引入的原因是传统的数据类型无法满足大对象的描述。这类大对象如大型文本文件、图像数据、视频数据等。LOB类型又可以分为两种:CLOB(CHARACTER LARGE OBJECT)和BLOB(BINARY LARGE OBJECT)。

CLOB面向文本数据,BLOB面向图像、视频和二进制程序代码等。CLOB具有大部分字符串的特性,但对其有一些限制,例如不能作为主键(PRIMARY KEY),也不能限定它为唯一性(UNIQUE)。与BLOB的限制类似,LOB类型也不能用在GROUP BY或ORDER BY子句里。应用程序不能将整个LOB值存放后在数据库里传来传去,但可以使用类似指针的东西来操纵,即使用LOB指示符(LOB locator)。在SQL:1999中,指示符是一个唯一性的二进制值,可以把它看成是LOB的一个别名。可以将指示符用在操作里。

第二个数据类型是布尔值,允许SQL直接使用记录的真值true、false和unknown,例如:

WHERE COL1>COL2 AND COL3=COL4 OR UNIQUE(COL6)IS NOT FALSE

SQL:1999还有两个新的组合类型:ARRAY和ROW。ARRAY允许用户在数据库表的一列里存放成组数据,例如:

WEEKDAYS VARCHAR(10)ARRAY[7]

这个例子说明,可以在数据库的一列里存放一周7天的名字。ROW可以看成是SQL中(匿名)行的扩展,它可以让数据库的表格嵌套构造。显然,按照传统的关系数据库理论,这样嵌套的结果破坏了数据库的规范性。

2.谓词

谓词也是SQL:1999的新增特色。按照标准定义,谓词定义如下:

<p redi cate>::=

<compar ison predicate>

|<between predicate>

|<in p redicate>

|<l ike p redi cate>

|<nu l l p redi cate>

|<quant i f ied compar ison predicate>

|<exis ts predi cate>

|<unique predi cate>

|<mat ch p redi cate>

|<over laps p redi cate>

|<simi lar predicate>

|<dis t inc t p redi cate>

|<t ype p redi cate>

SQL:1999包含几个新的谓词,其中类型测试谓词与面向对象概念密切相关。类型测试谓词的定义如下:

<t ype p redi cate>::=

<user-de f ined t ype val ue exp ression>IS[NOT]OF

<l e f t paren><type l is t><r ight paren>

<t ype l ist>::=

<user-de f ined t ype spec i f icat ion>

[{<comma><user-def ined t ype spec i f i cat ion>}...]

<user-de f ined t ype spec i f icat ion>::=

<inc lusive user-def ined t ype spec i f i cat ion>

|<exc lusive user-def ined type speci f icat ion>

<inc lusive user-def ined t ype spec i f i cat ion>::=

<user-de f ined t ype>

<exc lusive user-def ined t ype spec i f i cat ion>::=

ONLY<user-def ined type>

注意SIMILAR和DISTINCT两个谓词。

第一版SQL标准中有LIKE谓词,可以用来满足子串匹配,例如:

where NAME LIKE'% hong'表示匹配NAME值中有准确匹配的子串hong才为真。

SQL:1999的SIMILAR谓词对此进行了扩展,使得更适用于模式匹配,例如:(www.chuimin.cn)

where NAME SIMILAR TO'(SQL-(86|89|92|99))|(SQL(1|2|3))'

DISTINCT谓词与常规的UNIQUE谓词类似,主要区别在于NULL值。DISTINCT谓词把两个NULL值看成非distinct。

3.新的语义、安全性和其他

SQL:1999对视图的范围进行了扩展,使之可以直接更新。此外,SQL:1999提供了一种称为递归查询(recursive query)的功能,例如:

WITH RECURSIVE

Q1 AS Se l ec t...f rom...where...,

Q2 AS Se l ec t...f rom...where...Se l ec t...f rom Q1,Q2 where...

这样,对于ARRAY和LOB值来说,处理起来更方便。

SQL:1999还增加了savepoints的功能。SQL:1999的安全性提升也要注意,尤其是角色(role)支持功能。有了角色支持,安全性有了更好的保证。

SQL:1999具备一定的主动数据库功能,这里起作用的是触发器,例如:

Create TRIGGER log_salupdate

BEFOREUpdate OF sal ar y

ON emp loyees

REFERENCING OLD ROW as ol drow NEW ROW as newrow FOR EACH ROW

Inser t INTO l og_tabl e

VALUES(CURRENT_USER,o l drow.sal ar y,newrow.sa l ar y)

这个触发器表示在修改雇员的薪水时,要注意保存日志,将原来的数据记录为NEW ROW,将新的数据记录为EACH ROW。

触发器在使数据库获得主动功能上是十分有用的工具。触发器的用途很广,例如,可以使用触发器保证人的年龄只能增加不能减少、年龄不能为负数,等等。

对关系模型的重要扩展可以表达在用户自定义类型上:SQL:1999支持面向对象特性,允许结构化用户定义的类型,也允许属性深度嵌套。还有方法和过程的支持,允许构造类型层次,从而让子型具有继承的性质,例如:

从以上语句可以看出,用户定义的新类型emp_type是person_type的一个子型,所以具有继承性。换言之,雇员(employee)继承人(person)具有的所有属性(如姓名、地址等)也有自己定义的新属性:工号(EMP_ID)和工资(SALARY)等。

注意,有些面向对象程序设计语言允许对封装(encapsulation)分级,例如可分为PUBLIC、PRIVATE或PROTECTED,但SQL:1999尚未提供此功能。

4.函数和方法

与SQL调用函数不同,SQL:1999包含SQL调用的方法。简言之,可将方法看成一个函数,但有一定的限制和提升。它们之间的具体区别:方法与用户定义的类型密切关联。

存取一个用户定义类型可以采用两种不同的表示方法,即函数表示法与Dot表示法。

Dot表示法为:

where emp.sa lar y>10000

函数表示法为:

where sa l ar y(emp)>10000

SQL:1999同时支持这两种表示法。这可以看成是同一个事物的不同描述。

5.SQL3的数据类型

与SQL3数据类型对应的是方法,get XXX方法用于获得结果集,set XXX方法负责存储,updateXXX用于更新,如表15.1所示。

表15.1 SQL3类型所对应的方法

下面是查阅一个学生成绩的例子,输出方式是一次读出它们。

这里,变量“成绩”(scores)是一个指向SQLARRAY的指针,这个学生的学号是20060821。

下面是一个用于登记成绩的例子。

6.Blob、Clob、Array对象和类型

Blob、Clob和Array对象是新的SQL的一个重要特征。SQL BLOB、CLOB或ARRAY对象可以非常大,从而大大改善数据库系统的性能,尤其是对多媒体数据、流媒体数据管理来说。

SQL的结构化用户定义类型(user-defined types,UDTs)可以采用CREATE TYPE语句实现,例如:

这个例子定义了平面上的点,两个属性分别是X值和Y值。Collection类型定义在集合(set)、列表(list)等上,例如:

Create TABLE employees(id INTEGER PRIMARY KEY,name VARCHAR(30),address ROW(street VARCHAR(40),city CHAR(20),start CHAR(2),zip INTEGER),projects SET(INTEGER),children LIST(person),hobbies SET(VARCHAR(20)));