《SQL与关系数据库理论——如何编写健壮的SQL代码》一3.4 关系及其主体

本节书摘来华章计算机《SQL与关系数据库理论——如何编写健壮的SQL代码》一书中的第3章 ,第3.4节 C. J. Date 著 单世民 何英昊 许侃 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.4 关系及其主体

要讨论的第一点是,主体的任何子集仍是主体;或者,不严格地说,关系的任何子集仍是关系。(第1章讨论过,不过现在要多说几句。)特别的,因为空集是任何集合的子集,所以,一个关系的主体可以由空的元组集合构成,这样的关系称为空关系(empty relation)。比如,假设现在没有任何出货(shipment)。那么,关系变量SP的当前值就是一个空的出货关系,如下图所示(现在我们回归在非正式场合省略标题中类型名称的惯例;在本书的剩余部分,标题中是否包括类型名称取决于是否适合达到最佳表达目的)。
《SQL与关系数据库理论——如何编写健壮的SQL代码》一3.4 关系及其主体

注意,对于确定的特定关系类型只有一个该类型的空关系;而不同类型的空关系并不相同,因为它们的类型不同。比如,供应商空关系就不等于零件空关系(它的主体相等,但是标题不等)。
考虑下述关系:
《SQL与关系数据库理论——如何编写健壮的SQL代码》一3.4 关系及其主体

这个关系只包含一个元组(等价于其基数为1)。如果想存取该关系包含的唯一元组,那么就必须以某种方式从包含它的关系中提取元组。Tutorial D使用TUPLE FROM rx语法形式达到此目的。其中,rx表示基数为1的关系的任意表达式。比如,它可以是表达式RELATION{TUPLE{SNO 'S1', PNO 'P1', QTY 300}}。这个表达式事实上是一个关系选择器调用(实际上是文字的)。相反,SQL使用型转;如果:tx是用作行子查询的表表达式(其出现在期望行表达式之处),则由tx表示的表t应只包含一行r,并且表t型转为行r。示例如下(此例是2.9节“SQL中的行类型和表类型”中的行赋值示例):
SET SRV = ( S WHERE SNO = 'S1' ) ;
我们还要检测在确定的关系r中是否出现元组t,在Tutorial D中:
t 《SQL与关系数据库理论——如何编写健壮的SQL代码》一3.4 关系及其主体 r
当t在r中出现时返回TRUE,否则返回FALSE。符号“《SQL与关系数据库理论——如何编写健壮的SQL代码》一3.4 关系及其主体”表示集合成员(set membership)运算符;表达式t《SQL与关系数据库理论——如何编写健壮的SQL代码》一3.4 关系及其主体r可读为“t[是]在r中”或“t出现在r中”。
你可能已经想到了,“《SQL与关系数据库理论——如何编写健壮的SQL代码》一3.4 关系及其主体”实质上就是SQL的IN。只不过,SQL的IN左运算元通常是个标量而不是行(这意味着又要进行一些型转,即标量型转为包含标量的行)。注5示例如下(“得到至少供应一种零件型号的供应商”):

SELECT SNO , SNAME , STATUS , CITY 
FROM   S
WHERE  SNO IN     /* “SNO” coerced to “ROW(SNO)” */
     ( SELECT SNO
       FROM   SP )

注意:你肯定知道,SQL也支持NOT IN。Tutorial D对应的是“”。换句话说,Tutorial D表达式“tr”的意思是“t不在关系r中”。

上一篇:智慧城市的软肋:网络攻击威胁公共安全


下一篇:中国联通云数据有限公司总经理焦刚:沃筑生态,共创未来