外连接查询
外连接分为左外连接(left outer join),右外连接(right outer join),满外连接(full outer join)
hit: oracle 里面有full join,可是在mysql对full join支持的不好,我们可以使用union来达到目的
首先给出两个表
表dept3
表emp3
-- 查询哪些部门有员工,哪些部门没有员工(左外连接,即以左表为准)
select * from dept3 left outer join emp3 on dept3.deptno=emp3.dept_id;
以左表为主,结果如下
可以发现和单纯的求交集相比,多了一个人事部的内容
下面给出右外连接的代码
-- 查询员工有哪些对应的部门,哪些没有
select * from dept3 right outer join emp3 on dept3.deptno = emp3.dept_id;
运行结果如下
可以发现多了一个丁春秋
接下来给出组外连接多张表的格式
-- 组外连接多张表的格式
-- eg 以左外连接为例子,使用右的话只需要将left改成right
select *
from A
left join B on 条件1
left join C on 条件2
left join D on 条件3;
下面给出满外连接的代码
-- 使用union关键字实现左外连接和右外连接的并集
select * from dept3 left outer join emp3 on dept3.deptno=emp3.dept_id union select * from dept3 right outer join emp3 on dept3.deptno = emp3.dept_id;
美化后代码如下
-- 使用union关键字实现左外连接和右外连接的并集
SELECT
*
FROM
dept3
LEFT OUTER JOIN emp3 ON dept3.deptno = emp3.dept_id UNION
SELECT
*
FROM
dept3
RIGHT OUTER JOIN emp3 ON dept3.deptno = emp3.dept_id;
运行结果如下
不但多了一个人事部,还多了一个丁春秋
下面进行union 和union all 的讲解
-- 不可执行的语句
SELECT
*
FROM
dept3
FULL JOIN emp3 ON dept3.deptno = emp3.dept_id;
-- union 还有另外一种写法,但是和前面的结果不同
SELECT
*
FROM
dept3
LEFT OUTER JOIN emp3 ON dept3.deptno = emp3.dept_id UNION ALL
SELECT
*
FROM
dept3
RIGHT OUTER JOIN emp3 ON dept3.deptno = emp3.dept_id;
-- 由此可见,union是将两个查询结果上下拼接,并去重。
-- union all 是将两个查询结果拼接,不去重。
union all 的运行结果如下