代数查询语言

简介

 为了学习关系上的数据操作,首先要引入一种专门的代数---关系代数,它包含一些简单但是功能强大的方法,可以从给定关系构造出新的关系。当给定关系是真正被系统存储的数据(表)时,构造出的新关系也可以是对这些数据进行查询而产生的结果。 

     那为什么要引入一种新的数据库开发语言,而不能用现有的编程语言,比如C或JAVA,是他们不足以解决关于关系的所有问题吗?其实不是,关系代数之所以有用正式因为它不如C或JAVA强大。比如,判断一个关系中元祖的个数是奇数还是偶数这样的问题就不能用代数直接表达。但是,通过对查询语言做出某些限制,可以获得两个极为有益的回报---可以非常方便的进行开发以及能编译产生高度优化的代码。

关系代数

一门代数总是由一些操作符和一些原子操作数组成,比如,算数代数中的原子操作数是像变量x和常量15这样的操作数,而加,减,乘,除是其中的操作符。任何一门代数都允许吧操作符作用在原子操组数或者是其他代数表达式上构造表达式。

关系代数是另一门代数,它的原子操作数是代表关系的变量和代表有限关系的常量,它的操作包括以下四类:

1 通常的关系操作:并,交,差 R∪S={t|t∈R∨t∈S} R-S={t|t∈R∧t∉S} R∩S={t|t∈R∧t∈S},需要注意,R和S必须是具有同样属性集合的表,同时,各个属性类型也必须匹配。

2 除去某些行和某些列的操作,“选择”是消除某些行,而“投影”是消除某些列 。投影(projection)操作用来从关系R生成一个新的关系,这个关系只包含原来关系R中的部分列,操作符用表示。选择操作产一个关系R的元组的子集合,结果关系的元组必须满足某个涉及R中属性的条件C,该操作表示为

3 笛卡尔积,关系R 和S的笛卡尔积是一个有序对的集合,有序对的第一个元素是关系R中的任何一个元组,第二个元素是关系S中的任何一个元组,表示为R ×S

4 自然连接(nature join),关系R和S的自然连接表示为R⋈S,此操作仅仅把在R和S模式中有某共同属性,且此属性有相同的值的元组配对。

5 θ连接(theta-join),和自然连接类似,但可以指定任意条件,关系R和关系S满足条件C的θ连接可以表示成,这个操作的结果是这样构造的,先得到R和S的笛卡尔积,在管道的关系中寻中满足条件C的元组

6 组合操作,只能在单个或两个关系上进行一个操组,那么关系代数就不会那么有用。但关系代数允许任意复杂的表达式,其操作符可以作用于任何关系之上,这个关系既可以是某个给定关系,也可以是操作得到的结果关系。

7 重命名操作,防止连接查询后有命名冲突,实际上不改也没太大影响。

操作之间有一定的联系,其中:

R∩S=R-(R-S)

,其中,L是所有R中的属性和在S中但不在R中的属性的列表,C是

关系上的约束

约束也可以用关系代数来表示,场景的几种约束如下

引用完整性约束(referential integrity constraint)是一种普通约束,它规定谋个上下文中出现的值也必须在另外一个相关上下文中出现,比如

键约束,关系的键约束代表关系中的这一列没有重复的值。举个例子,假设name是MovieStar(name,address,gender,birthdate)的键,这意味着没有任何两个元组在分量name上有相同的值。这里包含的一个事实是,如果关系的某两个元组在属性name上具有相同的值,则他们的属性分量address也必定有相同的值,可以表示为

领域约束,比如某个字段只能取整数,或者布尔类型等,举个例子

你可能感兴趣的:(代数查询语言)