今天在写一个教学管理模块式遇到了一个问题:
一张班级表(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;
就是简单的联合的意思。把两个结果集拼起来,字段要一致。我之前在几张结构一致的、分表的情况下,求总表的时候用过。但是还是比较少见的。
本文由 wyf 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Mar 1, 2020 at 01:55 pm