sql中的几种连接类型

一、连接类型简介

在sql中单表查询的几率相对来说比较少,随着数据库的日益复杂,多表关联的情况越来越多,在多表关联的情况下存在多种关联的类型,

1、自关联(join或inner join)

2、左外关联(left join或left outer join)

3、右外关联(right join或right outer join)

4、全关联(full join)

二、各种关联的使用

为了更形象的说明这几种连接类型的使用场景及用法,下面以学生表(student)和学生选课表(course)表来演示,其表结构及数据如下图,

上面是两张表的结构及数据。

1、自关联

有时需要得到完整的数据,我们需要关联两个或两个以上的表,这时候便用到了自关联,其中自关联可以有下面两种写法,其一,

select s.s_id,s_name,c.c_name from student s,course c where s.s_id=c.s_id

运行上面的语句得到的结果如下,

其二的sql语句写法如下,

select s.s_id,s_name,c.c_name from student s join course c on s.s_id=c.s_id;

运行上面的语句得到的结果如下,

从上面的结果,可以看到两种写法的结果是一样的,同时也可以得出这样一个结论:自关联过滤出的数据必须满足在左表和右表都符合条件,这里的条件只的s.s_id=c.s_id,也就是说s_id必须同时存在于两个表中才会出现在结果中。

那么针对上面的两种写法哪种更好,这里认为哪种最好,适合的就是最好的。

对于自关联来说,有个重要的问题需要注意那就是笛卡尔积,自关联如果忘记写关联条件就会出现笛卡尔积的情况 ,关于笛卡尔积的情况,可以自查资料,这里以第二种sql写法演示笛卡儿积的出现,

select s.s_id,s_name,c.c_name from student s   join course c ;

结果如下,

写法即未加过滤条件(未加on或where条件),这样出来的结果为两个表中的数据行数的乘积,即4X5=20行,这就是笛卡儿积。

2、左外关联/右外关联

左外关联和右外关联其实可以看作同一种写法,在使用上可以相互转化。左外关联即以左表为基本表,会展示所有的左表中的数据,如果在右表中没有匹配的数据便为null,右外关联刚好相反,

左外关联,

select s.s_id,s_name,c.c_name from student s left  join course c 
on s.s_id=c.s_id;

运行结果如下,

可以看到结果数据集只有4行即为左表中的数据,但可以看到c_name列为null,这是因为在右表中没有匹配的s_id为1004的记录,所以此列为null。

右关联

select s.s_id,s_name,c.c_name,c.s_id as c_s_id from student s right  join course c 
on s.s_id=c.s_id;

运行的结果如下,

可以看出结果集为5行数据,即为右表中的数据,以右表为基本表。结果中的为null的数据列是因为在左表中没有匹配的记录,所以为null。

3、全关联

全关联是只要其中某个表存在匹配的记录,便会返回行。

这里是mysql的环境,暂无法给出实例。

有不当之处请指正,感谢!

由于这里的环境是mysql,mysql不支持full join的方式,这里暂不给出实例。

猜你喜欢

转载自www.cnblogs.com/teach/p/9790315.html
今日推荐