SQL中的内连接查询和外连接查询

2022-10-01 09:39:41

在项目开发中,单表的查询肯定无法满足所有的业务,所以很多时候都是多表的连接查询。接下来总结一下SQL中的多表关联查询,以MySQL为例

前期准备

在数据库中创建以下几张表并添加一些数据。

1、部门表(tb_dept),如下

2、员工表(tb_emp),如下。可以看到后勤中心是没有员工的,一会看区别。

3、工资表(tb_salary),如下

三张表的关系是,一个部门有多个员工,一个员工有多个工资条。

内连接查询

内连接查询的关键字是inner join 或者 join(不建议省略inner)。返回的是表中存在至少一个匹配的数据,那么不匹配的数据肯定就不返回了,如果都不匹配,就是空。

在这里说一下,写多表关联查询的SQL一般分四步走:1、确定要连接的表;2、确定要查询的字段;3、确定连接方式;4、确定关联条件。

1、查询所有部门及其下面的员工。(用员工表去连接部门表,结果也是一样的,因为上面说了,内连接的方式,返回的结果一定是匹配条件的结果)

SELECT td.dept_id,td.dept_name,te.emp_name 
FROM tb_dept td
INNER JOIN tb_emp te
ON td.dept_id = te.dept_id;

可以看到,因为后勤中心下面没有员工,所以查询结果中就没有后勤中心(这里省略inner也可以,但是不建议这么做)。

平时,下面这种写法也是内连接,但是可读性没有上面的强,所以,忘记这样的写法吧。

SELECT td.dept_id,td.dept_name,te.emp_name 
FROM tb_dept td , tb_emp te
WHERE td.dept_id = te.dept_id ;

2、查询所有部门及部门下的员工和员工工资(3张表关联)

SELECT td.dept_id,td.dept_name,te.emp_name, ts.salary_sum
	FROM tb_dept td
	INNER JOIN tb_emp te
	INNER JOIN tb_salary ts
	ON td.dept_id = te.dept_id AND te.emp_id = ts.emp_id;

查询结果

外连接之左外连接(也称左连接)

左外连接关键字是LEFT OUTER JOIN 或LEFT JOIN(还是不建议省略outer,可读性不强)。左外连接查询是以左边的表为基准,去匹配要连接的表,不管是否匹配条件都会以基准表的条数返回结果(这里明显不同于内连接),匹配到的数据就显示匹配到的数据,没有匹配条件的数据就显示为null。

1、查询所有部门及下面的员工

SELECT td.dept_id,td.dept_name,te.emp_name  
FROM tb_dept td
LEFT OUTER JOIN tb_emp te
ON td.dept_id = te.dept_id ;

查询结果

2、查询所有部门及部门下的员工和员工工资(3张表关联)

    SELECT td.dept_id,td.dept_name,te.emp_name, ts.salary_sum
	FROM tb_dept td
	LEFT OUTER JOIN tb_emp te 
	ON td.dept_id = te.dept_id
	LEFT OUTER JOIN tb_salary ts
	ON  te.emp_id = ts.emp_id;

查询结果

外连接之右外连接(也称右连接)

右连接和左连接的理论是一样的,只是基准表发生了变化,以右边被关联表为基准(将左连接的基准表和被关联表交换位置就等价于右连接)。右连接的关键字是RIGHT OUTER JOIN或RIGHT JOIN(还是不建议省略OUTER )。

1、查询所有部门及下面的员工

SELECT td.dept_id,td.dept_name,te.emp_name 
FROM tb_dept td
RIGHT OUTER JOIN tb_emp te
ON td.dept_id = te.dept_id;

查询结果(虽然和上面的内连接结果是一样的,但是要注意区别,两种方式根本不一样,假如有一个员工没有部门)

2、查询所有部门及部门下的员工和员工工资(3张表关联)

SELECT td.dept_id,td.dept_name,te.emp_name ,ts.salary_sum
FROM tb_dept td
RIGHT OUTER JOIN tb_emp te
ON td.dept_id = te.dept_id
RIGHT OUTER JOIN tb_salary ts
ON  te.emp_id = ts.emp_id;

外连接之全连接查询

全连接就是返回目标表的所有数据,有匹配的就显示,没有匹配的就为null。

mysql没有全连接的关键字,oracle有full outer join关键字。根据全连接的定义,可以使用UNION(去重并集)关键字

SELECT td.dept_id,td.dept_name,te.emp_name  
FROM   tb_dept td
LEFT OUTER JOIN tb_emp te
ON td.dept_id = te.dept_id ;
UNION
SELECT td.dept_id,td.dept_name,te.emp_name  
FROM tb_dept td 
RIGHT OUTER JOIN tb_emp te
ON td.dept_id = te.dept_id ;

 查询结果

自连接查询

自连接查询一般用作表中的某个字段的值是引用另一个字段的值。

将tb_emp改造一下,添加一个领导字段,由于领导也是员工,所以直接用emp_id关联,如下

张三丰有七个弟子,宋远桥和张翠山分别有个儿子(^_^)

关键点在于虚拟出一张领导表,由于领导也是员工,所以属性都一样。

1、查询所有员工及其直属领导的id和姓名

SELECT te.emp_id ,te.emp_name,tleader.emp_id as leader_id, tleader.emp_name as leader_name 
FROM tb_emp te
LEFT OUTER JOIN tb_emp tleader
ON te.emp_leader = tleader.emp_id;

查询结果


上面的工资表好像设计得不是很好,可以多增加几条数据,并给一个月份的字段标记区别一下,再做一下上面的示例,这里偷个懒不改了。

总之,写多表关联查询的SQL的思路就分四步走:1、确定要连接的表;2、确定要查询的字段;3、确定连接方式;4、确定关联条件

此篇完结

  • 作者:hi,你礼貌吗
  • 原文链接:https://blog.csdn.net/weixin_41381863/article/details/88560503
    更新时间:2022-10-01 09:39:41