目录
内连接:我们可以通过一张图来了解内连接,不管是内连接还是外连接,都需要给定条件,而内连接查询的是表的交集
等值连接:
非等值连接:
外连接:
左外连接:
右外连接:
自连接:
MySQL常用的表连接有:
内连接:我们可以通过一张图来了解内连接,不管是内连接还是外连接,都需要给定条件,而内连接查询的是表的交集
等值连接:
通过示例来看看,此时我们有两张表一张dept部门表,一张emp雇员表
此时我们需要查询雇员表中雇员的名字和部门表中部门的名字,通过两张图我们可以发现,雇员表有雇员的名字,部门名在部门表中,所以我们需要通过表的内连接进行查询,那么如何进行表的内连接呢,我们可以看雇员表中有deptno,而部门表中也有deptno,所以我们可以通过内连接的等值连接进行表连接,代码这么写:
而这就是等值连接,因为我们添加是通过相等来进行表连接的,如果不是通过相等进行表连接那么就是非等值连接
select emp.ename,dept.dname
from emp
inner join dept
on emp.deptNO = dept.deptno
结果:
非等值连接:
刚刚我们了解了等值连接,现在我们通过示例讲讲非等值连接,on的条件通过判断是否相等就是等值连接,而如果on的条件不是是否相等就是非等值连接,我们看代码:
还是这个emp雇员表
还有一个工资等级表
示例:查询每个雇员的员工名和工资等级
此时我们就可以通过内连接的方式将emp表和salgrade表连接起来,连接的条件是emp表中sal工资在salgrade工资等级表中的LOSAL最低工资和HISAL最高工资之间
而看到这里有人会发现:呀这个join旁边怎么没有inner啊,那这还是内连接吗,是的mysql的join...on...语法默认就是内连接,inner可以省略
结果:
内连接总结:内连接分为等值连接和非等值连接,当on的判断为是否相等时就是等值连接,否则就是非等值连接,内连接的inner可以省略。还有一个最重要的一点,表连接的条件至少为n-1个,就是说我们有3张表,那么我们至少要有2个条件
外连接:
外连接:说到外连接我们就要讲到“孤儿数据”,那么什么是“孤儿数据”呢?孤儿数据就是当我们多张表查询时,内连接查询的是他们的交集,那么孤儿数据就是没有被查询到的数据,下图中黄色部分就是孤儿数据,没有被查询到的数据
那么我们为什么要讲到孤儿数据呢,这是因为外连接就是在查询时不只是查询表的交集,还可以通过左外连接或右外连接在查询时将左边的孤儿数据或者右边的孤儿数据一起查询出来,如果还没有懂我们可以通过示例来理解:
左外连接:
左外连接的图是这样的:
示例:查询雇员的名字和雇员所在的部门名称(使用左外连接)
这是雇员表 ,我们会发现deptno这一列有两个null,如果使用内连接,那么因为部门表没有这个部门,所以这两个如果使用内连接就不会查询出来,就是所谓的"孤儿数据"
这是部门表
所以我们使用左外连接来查询,通过外连接的等值连接查询部门的名字
结果:
通过结果我们可以发现,左边表的雇员名称是一定会全部输出的,而右边的只是顺便查询
右外连接:
右外连接的表是这样的:
右外连接和左外连接的作用几乎都差不多,只是左外连接是左边一定输出,右边顺便输出,而右外连接就是右边一定输出,左边顺便输出
示例:查询雇员的名字和雇员所在的部门名称(使用右外连接)
还是刚刚的代码,只是将left outer join改为right outer join,那么此时这两张表的连接查询就是右外连接实现的,那么右边的表一定输出,而左边是顺便输出
结果:
此时我们会发现雇员表的张三和李四没有查询出来,而部门表中多了一个OPERATIONS,这是因为雇员表的部门id没有对应部门表的OPERATION部门的部门ID
外连接总结:外连接分为左外连接和右外连接,还有一个全连接,全连接因为不怎么用这里就不讲了,而左外连接就是左边必须全部查询出来,右边顺便查询。右外连接和左外连接刚好相反,右边一定查询,左边顺便查询
自连接:
自连接就是将一张表看成两张表,我们通过示例来理解:
此时要查询出每个雇员的经理名字,而雇员的经理ID对应的就是雇员的某个雇员的ID,所以我们可以通过表的自连接进行查询
结果:
总结:常用表连接分为内连接和外连接,而内连接又分为等值连接与非等值连接,并且语法为inner join 连接的表 on 条件,inner可以省略,on的条件如果是判断相等那就是等值连接,如果不是判断是否相等就是非等值连接。外连接分为左外连接和右外连接,左外连接的意思就是左边一定查询,右边顺便查询。而右外连接就和左外连接相反,右外连接的意思就是右边一定查询,左边顺便查询