数据库查询 - 通俗易懂解释:选择、投影、并、差、笛卡尔积、连接

关系代数运算

关系代数用对关系的运算来表达查询,运算对象是关系,结果得到关系

关系可以理解为一张二维表,例如一张学生表,就是一个关系,关系代数运算就是我们写sql的一些查询操作,操作表生成新的表或者视图

关系代数的运算有两种:

  • 运算符为传统的集合运算符:并、差、交、笛卡尔积
  • 运算符为专门的关系运算符:选择、投影、连接、除

传统的集合运算符:从表的行的角度进行运算,所以需要运算的关系R、S具有相同的属性列的类型、属性列数目

专门的关系运算符:涉及到列、行,没有那些限制

其他:选择、投影、并、差、笛卡尔积是查询操作的基本操作,其他操作可以由这5种基本操作推出

关于这些操作的概念是很晦涩的,结合具体的SQL来理解


并(union)

并操作两个关系R、S,得到的关系由属于R或S的元组组成,就是逻辑并

在这里插入图片描述

对应的Sql操作就是Union
第一次查询的id=1的关系 第二次查询id=2的关系 的结果:

在这里插入图片描述

and的结果也是这样的,为什么不说and呢?

这里主要谈的是并的思想,两个关系的并运算,and的话并不是两个关系的运算


差(except)

差:关系R与关系S的差由属于R而不属于S的所有元组组成

在这里插入图片描述

很明显,完成差的查询操作只需要从R中排除R与S交集关系即可,用not in关键字sql查询

在这里插入图片描述

实际上存在except关键字,Mysql不支持

换成Sql Server试试:

select * from 学生 where 学号 < 3
except
select * from 学生 where 学号 = 1;

在这里插入图片描述

但是没必要记这么多关键字,了解思想就行


笛卡尔积(cartesian product)

m个属性的关系R与n个属性的关系S,笛卡尔积为(m+n)列的元组的集合,行数为(m*n)
在这里插入图片描述

我们常用的没有限制的表连接就是笛卡尔积

在这里插入图片描述


选择(Selection)

选择又称为限制,在关系R中选择满足给定条件的元组,也就是筛选行

在这里插入图片描述

sql语句对应的就是我们的where关键字

在这里插入图片描述


投影(projection)

投影:关系R上的投影是从R中选择出若干属性列组成新的关系
这不就是select语句吗?从表R中选择一些属性组成新的关系

在这里插入图片描述

下面得到的结果就是一个新的关系


小结

五种基本操作:并、差、笛卡尔积、选择、投影 就是这么简单

相关的概念很晦涩但是完整,我们学习时需要通俗

由这5个基本查询操作,可以组成复杂的关系运算,例如连接


连接(join)

连接:从两个关系的笛卡尔积中选取属性间满足一定条件的元组

连接可以分为:

  • 内连接:两个关系R、S的笛卡尔积限制了一些条件,抛弃R、S中公共属性值不存在相等的元组;等值连接、非等值连接
  • 外连接:没有抛弃R、S中公共属性值不存在相等的元组;左外连接、右外连接、全连接
  • 交叉连接(笛卡尔积)

内外连接的区别在与那些被舍弃的元组是否保存到了结果中,通过后面的sql来理解

teacher、student表:

在这里插入图片描述

内连接

  1. 等值连接
    select * from student,teacher where student.id = teacher.tid;

仅取出student.id = teacher.tid的元组
在这里插入图片描述

  1. 非等值连接,也就是不是等号,而是>、<这些符号
    select * from student,teacher where student.id > teacher.tid;

在这里插入图片描述

  1. 内连接不加限制就是交叉连接了,也就是笛卡尔积

外连接:R、S中舍弃的元组也保存到结果中,而在其他属性上填空值

  • 左外连接:只保留左边关系R的舍弃的元组
    select * from student left join teacher on student.id = teacher.tid;

在这里插入图片描述

  • 右外连接:只保留右边关系S的舍弃的元组,因为我们teacher表比student表少,所以交换一下位置
select * from teacher
right join student on  student.id = teacher.tid;

在这里插入图片描述

  • 全连接:左右两表中的舍弃的元组都保留
    MySQL不支持full join关键字,但可以通过左连接 union 右连接实现

Sql Server:
select * from 学期成绩 R full join 课程注册 S on R.课程编号 = S.课程编号;

这两个表是这样的:
在这里插入图片描述

可以获得查询结果:

在这里插入图片描述

Mysql通过左连接 union 右连接就不实现了

  • 54
    点赞
  • 207
    收藏
    觉得还不错? 一键收藏
  • 24
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值