# sql与代数关系运算之间的关系
关系实际上是“组域”上的笛卡尔积的一个子集,所以sql对关系数据库上的操作实际上在这个子集上的代数关系运算。
- **代数关系运算的介绍**
- **sql与代数关系之间的关系**
-------------------
## 关系运算
> 一群元组的集合称为“关系”,关系之上进行一些“操作”,这些“操作”称为关系运算,包括“选择”、“投影”、“笛卡尔积”、“连接”、“外连接”,“更名”等等。
### 选择
**sql** select * from TABLE **where** name='zhangsan';
**运算** $\sigma_{name='zhangsan'}(TABLE)$;
### 投影
**sql** select **name**,**age** from TABLE ;
**运算** $\Pi_{name,age}(TABLE)$;
**注释** 从TABLE中投影出name、age两个属性;
### 笛卡尔积
**sql** select * from **TABLE1,TABLE2 **;
**运算** $TABLE1\times TABLE2$;
**注释** 将TABLE1中的元组与TABLE2中的元组两个任意拼接成一个新的元组,改元组的长度是TABLE1与TABLE2元祖长度的和 ;
### 自然连接
**sql** select * from **TABLE1,TABLE2 ** where **TABLE1.id=TABLE2.id ** ;
**运算** $TABLE1\Join TABLE2$;
**注释** 将TABLE1与TABLE2中具有重复属性的元组的拼接成一个新的元组,改元组的长度是TABLE1与TABLE2元祖长度的和减去重复属性的个数 ;
###左外连接
**运算** $TABLE1 ⟕ TABLE2$;
**注释** 左外连接的结果包含TABLE1 中所有元组,对每个元组,若在TABLE12中有在公共属性名字上相等的元组,则正常连接,若在TABLE1 中没有在公共属性名字上相等的元组,则依旧保留此元组,并将对应其他列设为NULL。
###右外连接
**运算** $TABLE1 ⟖ TABLE2$;
**注释** 右外连接的结果包含TABLE2中所有元组,对每个元组,若在TABLE1中有在公共属性名字上相等的元组,则正常连接,若在TABLE1中没有在公共属性名字上相等的元组,则依旧保留此元组,并将对应其他列设为NULL。
###实体关系图
一个实体关系图是用一个图形方式表现我们数据的逻辑结构。它可以帮助我们形象化表现我们不同的数据实体怎么关联到另一个实体。其中主码属性用下划线表示。
**主码、外码** 其中一个关系S的属性中包含另一个关系R的主码,这个属性叫做该主码在S上外码,S叫做外码的**参照关系**,R叫做改外码的**被参照关系**,外码参照R。
![这里写图片描述](https://img-blog.csdn.net/20180825111129823?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2R4YXhpbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![这里写图片描述](https://img-blog.csdn.net/20180825111146641?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2R4YXhpbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
**解析**
$A \xrightarrow {A.id=B.id} B$ 表示多个A共享一个B,则B中包换多个A,这是“**多对一**”的关系。
$C\xrightarrow {C.name=A.name} A \xleftarrow{A.id=B.id} B$ 表示多个A共享一个B,同时多个A共享一个C,那么对于B和C则是“多对一”,例如一个顾客可以下多个订单,一个商品可以包括多个订单,那么$N_1$可以买$N_2$个商品。
###关系完整性约束
若关系A关联关系B,关系A的属性中包含另一个关系B的主码,那个A的这个属性的取值范围应该是B主码取值范围的一个子集。
网友评论