开发者社区> 华章计算机> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

《SQL与关系数据库理论——如何编写健壮的SQL代码》一2.10 小结

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

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

2.10 小结

人们通常错误地认为关系模型处理的都只是简单的类型:数字、字符串、日期和时间等等,除此之外就没什么别的类型了。本章试图说明此种认识确实错了。关系可以有任何类型的属性(不限于刚才提到的类型)——关系模型根本没规定必须是什么类型,类型实际上可以随你所愿。换句话说,对于类型的支持和对于关系模型本身的支持根本是无关的。或者,不精确但是更好记的是,类型与表是正交的(Types are orthogonal to tables)。
我还要提醒你,前面的情况根本没有违反第一范式的要求。第一范式只是说每个关系中的每个元组在每个属性的位置包含适当类型的单一值。现在,我们知道所谓的那些适当类型可以是任何东西,我们也知道了从定义上讲任何关系都属于第一范式。
最后,本章导言中提到“关系属性可以是任意类型”这一规则是存在例外的。事实上,有两个例外(为了当前目标稍微进行了简化)。首先,如果关系r的类型是T,那么r中没有属性可以是类型T(好好想想)。其次,数据库中没有关系能够具有指针类型的属性。关系型数据库出现之前存在的数据库都有指针,存取这样的数据库要进行大量的指针追踪,这使得应用程序编程易于出错,并导致最终用户不可能存取。(这些并不是指针仅有的问题,但却是最明显的。)Codd就是想在他的关系模型中避开这些问题。他做到了。
2.11 练习题
2.1 类型是什么?域和类型有什么区别?
2.2 怎样理解“选择器”?字面值到底是什么?
2.3 THE_ 运算符是什么?
2.4 “物理表示总是对用户隐藏的。”这样的表述是对还是错?
2.5 本章涉及多个逻辑差异(如果记不清楚逻辑差异是什么可以回顾第1章),包括:
实参 vs. 形参
数据库 vs. 数据库管理系统(DBMS)
外键 vs. 指针
生成式类型 vs. 非生成式类型
关系 vs. 类型
类型 vs. 表示
用户定义类型 vs. 系统定义类型
用户定义运算符 vs. 系统定义运算符
这些情况的逻辑差异到底是什么?
2.6 用自己的话解释“标量”和“非标量”概念的差异。
2.7 怎么理解“型转”?为什么说“型转”不好?
2.8 为什么域检查重载没有意义?
2.9 类型生成器是什么?
2.10 定义第一范式?你觉得它为什么叫这个名?
2.11 设x为表达式,那么x的类型是什么?为什么“x是某种类型的”是重要的?
2.12 用本章中REFLECT运算符的定义(2.4节“类型是什么”)作为模版,定义一个Tutorial D运算符,对于确定的一个整数,返回该整数的立方。
2.13 设LENGTH为用户定义类型,并有明显的语义。使用Tutorial D定义一个运算符,对于确定的两个矩形相邻边长度,返回对应的面积。
2.14 举一个关系类型的例子。区分关系类型、关系值和关系变量。
2.15 使用SQL或Tutorial D或同时使用两者,根据suppliers-and-parts数据库定义关系变量P和SP。如果你同时给出了SQL和Tutorial D定义,那么请尽可能多地标出它们之间的差异。假设“关系变量P的类型是某种关系”有什么重要意义?
2.16 以第1章的departments-and-employees数据库为例(参见图1.1),假设所有的属性都是用户定义类型

DNO     : DNO 
DNAME    : NAME 
BUDGET     : MONEY 
ENO     : ENO 
ENAME    : NAME 
SALARY     : MONEY

假设部门也有一个LOCATION属性,类型为用户定义类型CITY。下列哪些标量表达式是合法的?对于那些合法的表达式,说出结果的类型。对于其他的表达式,给出能得到预期结果的表达式。

    a.     LOCATION = 'London'
    b.     ENAME = DNAME
    c.     SALARY * 5
    d.     BUDGET + 50000
    e.     ENO > 'E2'
    f.     ENAME || DNAME
    g.     LOCATION || 'burg'

2.17 有时,类型在某种意义上被认为实际是变量。比如,随着业务扩大,员工编号可能从3位数增长到4位数,所以我们需要更新“所有可能的雇员编号”集合。请讨论这个问题。
2.18 类型是值的集合,而空集是合法的集合。因此,可以定义一个值集合为空集的空类型,你能想到此种类型的用处吗?
2.19 在关系世界中,相等运算符“=”适用于所有类型。相反,SQL不要求“=”适用于所有类型,并且SQL没有对运用相等运算符的全部情况都定义其语义,这意味着什么?
2.20 根据前面的练习,我们可以说,如果v1=v2在关系世界中为TRUE,那么对所有可能的运算符Op而言,对v1和v2执行同一运算符Op总会得到完全一样的结果。然而,这是SQL违反的一项准则,你能想到这种违反的例子吗?这意味着什么?
2.21 为什么指针被排除在关系模型之外?
2.22 赋值原理(非常简单但却是基础性的)说明在将值v赋值给变量V之后,比较V=v会得到TRUE(参见第5章)。然而,这是SQL违反的又一个准则(事实上,相当普遍)。你能想到此种违反的例子吗?这意味着什么?
2.23 如果说关系变量“属于”数据库,那么你认为类型也是如此吗?
2.24 在本章的第一个SQL SELECT表达式示例中,我指出:没有用分号来结束是因为该表达式是表达式而不是语句。这两者到底有什么差异?
2.25 尽可能仔细地解释具有关系值属性(RVA)的“关系”与具有重复组的“关系”之间的逻辑差异。
2.26 子查询是什么?
2.27 重复练习2.19。在关系世界中,相等运算符“=”适用于任何类型。但是,对于BOOLEAN类型呢?对于SQL的行类型和表类型又会怎样?
2.1 类型是什么?域和类型有什么区别?
2.2 怎样理解“选择器”?字面值到底是什么?
2.3 THE_ 运算符是什么?
2.4 “物理表示总是对用户隐藏的。”这样的表述是对还是错?
2.5 本章涉及多个逻辑差异(如果记不清楚逻辑差异是什么可以回顾第1章),包括:

实参            vs.    形参
   数据库        vs.    数据库管理系统(DBMS)
   外键            vs.    指针
   生成式类型    vs.    非生成式类型
   关系            vs.    类型
   类型            vs.    表示
   用户定义类型    vs.    系统定义类型
   用户定义运算符    vs.    系统定义运算符

这些情况的逻辑差异到底是什么?
2.6 用自己的话解释“标量”和“非标量”概念的差异。
2.7 怎么理解“型转”?为什么说“型转”不好?
2.8 为什么域检查重载没有意义?
2.9 类型生成器是什么?
2.10 定义第一范式?你觉得它为什么叫这个名?
2.11 设x为表达式,那么x的类型是什么?为什么“x是某种类型的”是重要的?
2.12 用本章中REFLECT运算符的定义(2.4节“类型是什么”)作为模版,定义一个Tutorial D运算符,对于确定的一个整数,返回该整数的立方。
2.13 设LENGTH为用户定义类型,并有明显的语义。使用Tutorial D定义一个运算符,对于确定的两个矩形相邻边长度,返回对应的面积。
2.14 举一个关系类型的例子。区分关系类型、关系值和关系变量。
2.15 使用SQL或Tutorial D或同时使用两者,根据suppliers-and-parts数据库定义关系变量P和SP。如果你同时给出了SQL和Tutorial D定义,那么请尽可能多地标出它们之间的差异。假设“关系变量P的类型是某种关系”有什么重要意义?
2.16 以第1章的departments-and-employees数据库为例(参见图1.1),假设所有的属性都是用户定义类型

     DNO       : DNO 
    DNAME      : NAME 
    BUDGET     : MONEY 
    ENO        : ENO 
    ENAME      : NAME 
    SALARY     : MONEY

假设部门也有一个LOCATION属性,类型为用户定义类型CITY。下列哪些标量表达式是合法的?对于那些合法的表达式,说出结果的类型。对于其他的表达式,给出能得到预期结果的表达式。

    a.     LOCATION = 'London'
    b.     ENAME = DNAME
    c.     SALARY * 5
    d.     BUDGET + 50000
    e.     ENO > 'E2'
    f.     ENAME || DNAME
    g.     LOCATION || 'burg'

2.17 有时,类型在某种意义上被认为实际是变量。比如,随着业务扩大,员工编号可能从3位数增长到4位数,所以我们需要更新“所有可能的雇员编号”集合。请讨论这个问题。
2.18 类型是值的集合,而空集是合法的集合。因此,可以定义一个值集合为空集的空类型,你能想到此种类型的用处吗?
2.19 在关系世界中,相等运算符“=”适用于所有类型。相反,SQL不要求“=”适用于所有类型,并且SQL没有对运用相等运算符的全部情况都定义其语义,这意味着什么?
2.20 根据前面的练习,我们可以说,如果v1=v2在关系世界中为TRUE,那么对所有可能的运算符Op而言,对v1和v2执行同一运算符Op总会得到完全一样的结果。然而,这是SQL违反的一项准则,你能想到这种违反的例子吗?这意味着什么?
2.21 为什么指针被排除在关系模型之外?
2.22 赋值原理(非常简单但却是基础性的)说明在将值v赋值给变量V之后,比较V=v会得到TRUE(参见第5章)。然而,这是SQL违反的又一个准则(事实上,相当普遍)。你能想到此种违反的例子吗?这意味着什么?
2.23 如果说关系变量“属于”数据库,那么你认为类型也是如此吗?
2.24 在本章的第一个SQL SELECT表达式示例中,我指出:没有用分号来结束是因为该表达式是表达式而不是语句。这两者到底有什么差异?
2.25 尽可能仔细地解释具有关系值属性(RVA)的“关系”与具有重复组的“关系”之间的逻辑差异。
2.26 子查询是什么?
2.27 重复练习2.19。在关系世界中,相等运算符“=”适用于任何类型。但是,对于BOOLEAN类型呢?对于SQL的行类型和表类型又会怎样?
第3章
元组、关系、行、表
[I] have reduced several great confused Volumes into a few perspicuous Tables.
——John Graunt (1662)
从前两章中,读者已经在直观上很好地理解了元组是什么,关系是什么。现在,我要对这些概念进行更为精确的定义,并且探索这些精确定义的推论。另外,我还要描述一下SQL的对应结构(即行和表),并且给出一些以关系化方式使用SQL的建议。这里提醒一下,形式化定义可能看起来有点吓人(可是形式化定义就是这样,没什么好奇怪的)。不过,只要熟悉了形式化,你就会发现这些概念本身是相当直接的。至少,你已经熟悉相关的术语了,现在应该准备好接受形式化了。
3.1 元组是什么
下面这个是元组么?

不,它不是元组,它是一个元组的图示,但不是元组(本章唯一一次把类型名称和属性名称一起放到图示中)。在第1章中我们看到,一个“事物”和“事物的图示”是有逻辑区分(logical difference)的,而这个区分非常重要。比如,元组对于其属性是没有自左至右排序的,所以下面的图示对于刚才那个元组是同样好(或者同样坏?)的。

因此,尽管我在后面会使用很多与这些图示相似的图示,但要记住它们只是“图示”而已,而它们有时可能会给出错误的暗示。
在此告诫之后,现在给出元组精确的定义如下:
定义 设T1, T2, ? Tn (n ≥ 0)为可以同名的类型名称。与每个类型Ti对应,存在相互区别的属性名Ai;形成的n个属性名/类型名组合均为属性(attribute)。对应于每个属性,存在类型为Ti的属性值(attribute value)vi与其关联;产生的n个属性/值组合均为一个分量(component)。则,依此定义的所有n个分量的集合(设为t),即是涵盖属性 A1, A2, …, An的一个元组值(tuple value)(或简称为元组)。值n为t的度(degree);度为1的元组为一元元组(unary),度为2的元组为二元元组(binary),度为3的元组为三元元组(ternary),…。更一般的,度为n的元组为n元元组(n-ary)。由所有n个属性构成的集合为t的标题(heading)。
以上文中对应S1供应商的两个图为例,对于第一张图有:
度为4。对于标题也可说其度为4。
类型名(如图所示,自左到右)包括CHAR 、CHAR 、INTEGER、CHAR。
对应的属性名称包括SNO 、SNAME、STATUS、CITY。
对应的属性值为'S1'、'Smith '、20、'London'。注意此处用来封闭字符串的引号;我在图中并没有使用这样的引号,但我或许应该这么做,因为这样更为正确。
标题:这里最简单的就是显示另一幅图示:

显然,这幅图示表示一个集合,并且属性的顺序是任意的。下面是相同标题的另一图示:

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
整理几个常用的sql和其他代码
整理几个常用的sql和其他代码
0 0
整理几个常用的sql和其他代码
整理几个常用的sql和其他代码
0 0
使用 ABAP Open SQL 的 Select AS 别名,提高代码可读性
SAP ABAP 有些数据库表的字段名称,对于初学者来说不太友好,例如 USR01 表中的打印参数 SPLD, SPLG, SPDB, SPDA 等等。
0 0
无需 XML Mapper,超级 Mybatis 代码即是 SQL 操作!真香?(二)
无需 XML Mapper,超级 Mybatis 代码即是 SQL 操作!真香?
0 0
无需 XML Mapper,超级 Mybatis 代码即是 SQL 操作!真香?(一)
无需 XML Mapper,超级 Mybatis 代码即是 SQL 操作!真香?
0 0
(3)Flink CEP SQL宽松近邻代码演示
Flink CEP SQL宽松近邻代码演示,大数据风控系统规则引擎
0 0
(2)Flink CEP SQL严格近邻代码演示-风控系统构建利器
Flink CEP SQL严格近邻代码演示-风控系统构建利器
0 0
拿php写个原生增删改查案例出来(提供全部代码+sql)
拿php写个原生增删改查案例出来(提供全部代码+sql)
0 0
神了,程序员放弃写代码,直接用SQL写逻辑,你废吗?
神了,程序员放弃写代码,直接用SQL写逻辑,你废吗?
0 0
一行SQL代码能做什么?(下)
最近在知乎上看到一个问题:一行代码可以做什么?答题者数万计,都是一些非常“高端”的操作,就在想一行SQL代码能做什么呢?
0 0
文章
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
用SQL做数据分析
立即下载
阿里云流计算 Flink SQL 核心功能解密
立即下载
Comparison of Spark SQL with Hive
立即下载