引言:我们为什么要引入外连接查询呢?内连接查询他不好使吗?
内连接查询是通过连接两个表的共有字段俩实现连接的但是如果某一方的元素为空,则查询结果不会显示为空的这一行数据:
就比如说员工表和部门表,两个表都有部门id只不过字段名不一样,如果员工表中的某一个员工的部门id为空,那么内连接查询的结果就不会显示这个员工这行数据,要求连接的字段必须非空
案例1:查询员工信息以及对应的部门信息(要求展示所有员工的信息)
员工表和部门表如下图所展示:
执行内连接查询之后不会显示连接字段为空的员工(也就是陈友谅)
我们可以把陈友谅 的数据带入 自行判断
查询tb_emp和tb_dept 两张表满足员工表的部门id =部门表的部门id
陈友谅的部门id值为null ,而部门id只有五个可选项(1,2,3,4,5),null哪个都匹配不上所以查询结果里面也就不可能查出来陈友谅这个人的数据(因为他不满足查询条件呀!)
select *
from tb_emp,tb_dept
where tb_emp.dept_id=tb_dept.id;
那就需要请出来我们的外连接了
外连接分为两种:左外连接 和 右外连接。
外连接和内连接查询的区别:
内连接查询结果只会显示(满足查询条件的)。
外连接查询的结果不仅包含两张表的交集(查询条件可以成功匹配)(如果是左外连接,则还包含左边集合,如果是右外连接查询结果就还包含右边的集合),并且会将没有匹配的值显示为null,
左外连接就是一左边的表(集合)为基准,然后把右表满足连接条件的行和左边的数据拼接在一起
右外连接同理
1.左外连接语法结构:
select 字段列表 from 表1 left [ outer ] join 表2 on 连接条件 ... ;
左外连接相当于查询表1(左表)的所有数据,以及表1和表2交集部分的数据。
那我们怎么用左外连接语句实现案例1呢?
因为要显示所有的员工的信息,相当于以员工表为基准,左外连接,以左边的表为基准,所以将员工表放在左边,部门表放在右边,连接条件就是部门号
在表后面可以添加别名,用来减少代码量,这里两个表的别名分别是 e 和 td (不要忘了在别名和表名之间的空格呦!)
select *
from tb_emp e left join tb_dept td on e.dept_id = td.id;
查询结果如下:没有匹配到 的数据填充为null,也就是第17行陈友谅后面从部门id开始后面的部门信息都没有匹配到,都填充为null
2.右外连接语法结构:
select 字段列表 from 表1 right [ outer ] join 表2 on 连接条件 ... ;
右外连接相当于查询表2(右表)的所有数据,以及表1和表2交集部分的数据。
右外连接的话就是把基准表放在右边就好了,另一个不重要的表放在左边同上。
select *
from tb_dept d right join tb_emp e on e.dept_id = d.id;
实际上就是把部门表的数据和 员工表的数据换了一下位置,员工表的数据放在了右边,部门表的数据放在了左边,如图所示
案例二:
A 查询员工表 所有 员工姓名,和对应的部门名称(左外连接)
分析: 要查询所有员工(这里你想到了什么,说明员工表是基准表啊!要查询哪张表的所有信息就代表那张表是基准表,记住了,烙铁)左外连接 left(基准表放在left 的左边,另一张无关紧要的表放在left右边) OK,再 给员工表和部门表起个别名e和d,条件查询通过部门id 进行连接(连接条件放在on后面),要查询的是员工表的员工姓名,部门表的部门名称(要查询的内容放在select 后面),OK,分析完了直接上代码,
select e.name,d.name
from tb_emp e left join tb_dept d on e.dept_id=d.id;
运行结果
OK,你是不是学废了呀?再来个案例三练练手,趁热打铁
案例三:
查询部门表所有 部门的名称 , 和对应的员工名称(右外连接)
分析:所有部门的....OK基准表找到了吧,再看他是右外连接(right)基准表放在right的右边(_外连接,就把基准表放在那边),另一个表直接扔另一边,连接条件就不用我多说 了吧,记得在表后面起别名 ,查询部门表的名称,以及员工表的员工名称(放在select后面from前面)OK,上代码
select d.name,e.name
from tb_emp e right join tb_dept d on e.dept_id = d.id ;
选中代码点击运行,运行结果如下:
OK,加油了,陌生人我们顶峰相见!