一、连接类型简介
在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的方式,这里暂不给出实例。