数据库间常用链接方式:内链接,外连接,交叉连接,联合连接

in 默认分类 with 0 comment

今天在写一个教学管理模块式遇到了一个问题:
一张班级表(classes):id,班级名称(classname),教师ID(teacherid),...
一张教师表(users):教师ID(id),教师姓名(name),...

很常见的情况是,我们在显示班级表时,不仅要显示教师ID,更重要的是教师姓名。所以肯定要一种表间链接的方式去解决,能一次性查到班级和教师姓名的数据。

其实本来很简单我的想到的是:

SELECT a.*,b.nick_name from classes a,users b WHERE a.teacherid=b.id;

但是发现一个问题是,如果这个班级刚初始化没有指派教师,或者原指派的教师被删除了,那么就会导致这个班级就不会出现在结果集里。

出现这个问题其实就是我自己在数据库的课上没有把这个内链接,外连接,交叉连接的几个方式给学扎实。接下来把这个知识点巩固一下,就解决了这个问题。

1、内链接
INNER JOIN 用于取得两个表中存在连接匹配关系的记录(例如:某一列相等)。通常配合比较运算符(=或<>)一起使用。其中通过某个字段使用=运算符连接两个表的链接 也叫做 等值连接。

select * from class c inner join student s on s.class_id=c.id;

where 连接多个表也属于内连接,在数据库中被称为隐性内链接。inner join被称为显性内连接。

select * from class c,student s where s.class_id=c.id;

上面两个输出结果是一致的。
所以显而易见,我之前用的where等值连接就等于内连接,内连接就要求两张表中的数据是强关联性的,如果在A表中的数据和B表没有关联,那么这条数据不会出现在A和B内连接的结果集中。

2、外链接

外连接分为左外连接、右外连接、全外链接三种。

左(右)外连接:
包括左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

SELECT a.*,b.nick_name from dsc_classes a  left join dsc_users b on a.teacher=b.user_id;

还有一种是全链接:可以理解为左外链接和右外链接的集合。

像我最开始提到的这种情况,我觉得可以把他称之为:参考,即我主要是是找A表中的内容,但是需要对A表中某些字段进行扩充,以B作为参考表。(A在B左边),这种情况就应该采用左外链接。

3、联合链接

select * from student where class_id=1 union select * from student where class_id=2;

就是简单的联合的意思。把两个结果集拼起来,字段要一致。我之前在几张结构一致的、分表的情况下,求总表的时候用过。但是还是比较少见的。

Responses