首页 > 代码库 > 表的联结

表的联结

通过表的集合运算,就是以行方向为单位的操作。通过集合运算会导致最终结果表记录行数的增减。但是列数是不会改变的,

作为表的集合运算的的前提就是 前后两表的列数必须相同,且数据类型对应一致。

而表的联结运算 则与 表的集合运算 相对。就是将其他表中的列添加过来,记性“添加列”的运算。

SQL的联结根据其用途可以分为很多种类。最常用的是内联结 和 外联结。

1.内联结   ——  inner  join

联结一般都涉及两张或两张以上的表 。区分一下,成为 A表 和 B表 。

从A表中选取适当的列,在B表中选取适当的列,然后联结起来形成最终结果表。

select   a.studentName   ,  a.studentSex   ,  b.className  , b.schoolName        -- a表中选取 学生名字 和 学生性别两列  b表中选取 班级名称 和 学校名称两列 from  tb_student  a  inner  join   tb_class  b                                   -- from子句中的两表 通过内联结 联结在一起on  a.classId  =  b.classId;                                                     --  联结条件是    a表的classId 等于 b表的classId   (两表通过外键关联)
                                                                                                   (此处 a表是从表 外键是classId 关联的是b表的classId  b表是主表)

内联结注意点:

注意点1: from子句 中涉及多张表

注意点2: on子句指定联结条件 不可缺少。必须写在from子句和where子句(如果有的话)之间。

注意点3: select子句中列需要按照 <列的别名>.<列名> 的格式进行书写。

内联结可以结合 where子句 ,group  by子句等进行使用:

这时候,可以理解成 通过内联结 生成了一张结果表 ,然后在这张结果表 上再使用where子句 进行筛选,group by子句进行分组,

having 子句 进行聚合之后的筛选 ,order by 子句进行排序,最终形成最后的结果表。

 

想象一种情况 :

tb_student 表的 有一行学生记录 的classId的值 在tb_class表的classId列中并不存在这个值,那么如果使用内联结查询,这行学生的记录会出现在最终的结果表吗?

如果不出现 ,为什么?如果出现,那么这个学生的 className,schoolName列 有应该是什么值?

答案是:使用内联结,该行学生记录 不出现在最终的结果表中。

 通过内联结,在on子句指定的 外键关联条件下 ,同时存在于 主表 和 从表的记录 才会出现在最终结果表中 。

 

2. 外联结  ——  outer join

承接内联结中提出的问题: 虽然那行学生的记录的classId值 在 tb_class表中并不存在 ,但是我们还是希望 这行学生的记录 出现在最终的结果表中 。

这时就要需要使用 :  外联结。

select  a.studentName  ,  a.studentSex  ,  b.className  ,  b.schoolName  from   tb_student   a   left  outer  join   tb_class  b                             --  使用左外联结  ,最终的结果表 包含 tb_student表的所有记录行。   on  a.classId  =  b.classId ;

外联结 又分为 左外联结 和 右外联结。

左外联结 :  最终的结果表中 ,必须包含 左表的全部记录行。

右外联结 :  最终的结果表中 ,必须包含 右表的全部记录行。         可见 调换两表的位置 ,左外联结 和 右外联结 可以相互转化。

最终的结果表 中那行学生记录的 className 列 和 schoolName 列 就显示为 null.

 

3.交叉联结   ——  cross  join

 

表的联结