数据库表连接通俗描述

网上有很多资料阐述数据库表连接的原理和应用,下面我用尽量通俗的语言描述一下。
原始数据如下:

其中,表tb_baid是外键,关联的是tb_a的主键id

大家是否了解表连接有什么用,为什么要做这样的操作?有些情况,不用表连接是否能够实现?子查询可以吗?(这里自己脑补)
我的理解是,表连接是用于表之间数据的筛选,选取出左表存在而右表不存在的数据、右表存在而左表不存在的数据和左右表都存在的数据等,这在实际应用中很有用处。例如,tb_a假设是学生信息表(id为学号,name为姓名)tb_b为学生注册表(aid为学生表的学号字段,createtime为注册时间),使用表连接很容易筛选出已注册的学生和未注册的学生。下面的例子主要围绕学生注册这个案例进行描述。

1.内连接
查询学生注册信息,包括学号、姓名和注册时间。
select a.id, a.name, b.createtime from tb_a a join tb_b b on a.id = b.aid;
select a.id, a.name, b.createtime from tb_a a inner join tb_b b on a.id = b.aid;

其实这个写法还有一种等价的写法:
select a.id, a.name, b.createtime from tb_a a, tb_b b where a.id = b.aid;

2.左连接(或者叫左外连接)
查询每个学生的注册信息,如果学生没有注册,则把注册时间设置为空。
select a.id, a.name, b.createtime from tb_a a left join tb_b b on a.id = b.aid;
select a.id, a.name, b.createtime from tb_a a left outer join tb_b b on a.id = b.aid;

由此可以看出左连接最终的顺序取决于左和右两表中数据的顺序。
根据这个结果就很轻松可以查询出没有注册的学生信息,只要根据createtime=NULL就可以过滤出结果了。

3.右连接(或者叫右外连接)
查询学生注册表中学生的信息,包括学号、姓名和注册时间。
select a.id, a.name, b.createtime from tb_a a right join tb_b b on a.id = b.aid;
select a.id, a.name, b.createtime from tb_a a right outer join tb_b b on a.id = b.aid;

这里大家或许会奇怪,为什么右查询的结果和左查询是一致的?这是因为,右表的数据都是左表的子集,这是外键限制的。如果没有外键限制,右表存在左表中不存在的数据结果就不一样了。实际上,右连接和左连接是很类似的,就是方向是相反的。

结束了,简单吧。要想系统了解,还需系统学习,包括笛卡尔乘积理论。

此条目发表在数据库分类目录。将固定链接加入收藏夹。

2 则回应给 数据库表连接通俗描述

  1. 五月说:

    那么有方法保证左连接时,最终的结果按左表顺序输出吗?

发表评论

电子邮件地址不会被公开。 必填项已用*标注