MySQL 中的 Full Outer Join 是否返回两边都有空且匹配的行(在 mysql 中使用 Union All)

问题描述 投票:0回答:1

通常的全加入:

SELECT empno, ename, dname 
FROM emps
FULL OUTER JOIN depts
ON emps.deptno = depts.deptno;

既然UNION ALL和UNION是MySQL中FULL JOIN的实现,也就是FULL JOIN在支持FULL JOIN的数据库中使用时通常返回的结果,那么它返回的结果是像UNION ALL一样保留重复还是普通UNION 中更明显的一个?

有关问题的详细概述,请继续阅读下面的内容,我在最后再次问了这个问题

MySQL 实现:

要在这两个表上完成连接

select * from emps;

+-------+--------+--------+------+
| empno | ename  | deptno | mgr  |
+-------+--------+--------+------+
|     1 | Amit   |     10 |    4 |
|     2 | Rahul  |     10 |    3 |
|     3 | Nilesh |     20 |    4 |
|     4 | Nitin  |     50 |    5 |
|     5 | Sarang |     50 | NULL |
+-------+--------+--------+------+

select * from depts;

+--------+-------+
| deptno | dname |
+--------+-------+
|     10 | DEV   |
|     20 | QA    |
|     30 | OPS   |
|     40 | ACC   |
+--------+-------+

纯左连接:

SELECT empno, ename, dname from emps RIGHT OUTER JOIN depts ON emps.deptno = depts.deptno
ORDER BY empno;
+-------+--------+-------+
| empno | ename  | dname |
+-------+--------+-------+
|  NULL | NULL   | OPS   |
|  NULL | NULL   | ACC   |
|     1 | Amit   | DEV   |
|     2 | Rahul  | DEV   |
|     3 | Nilesh | QA    |
+-------+--------+-------+

纯右加入:

SELECT empno, ename, dname from emps LEFT OUTER JOIN depts ON emps.deptno = depts.deptno;

+-------+--------+-------+
| empno | ename  | dname |
+-------+--------+-------+
|     1 | Amit   | DEV   |
|     2 | Rahul  | DEV   |
|     3 | Nilesh | QA    |
|     4 | Nitin  | NULL  |
|     5 | Sarang | NULL  |
+-------+--------+-------+

/////////////////////////////////////////////////// ///////////////////////////////////////////

联盟:

SELECT empno, ename, dname from emps RIGHT OUTER JOIN depts ON emps.deptno = depts.deptno
UNION
SELECT empno, ename, dname from emps LEFT OUTER JOIN depts ON emps.deptno = depts.deptno
ORDER BY empno;
+-------+--------+-------+
| empno | ename  | dname |
+-------+--------+-------+
|  NULL | NULL   | OPS   |
|  NULL | NULL   | ACC   |
|     1 | Amit   | DEV   |
|     2 | Rahul  | DEV   |
|     3 | Nilesh | QA    |
|     4 | Nitin  | NULL  |
|     5 | Sarang | NULL  |
+-------+--------+-------+

联合所有:

SELECT empno, ename, dname from emps RIGHT OUTER JOIN depts ON emps.deptno = depts.deptno
UNION ALL
SELECT empno, ename, dname from emps LEFT OUTER JOIN depts ON emps.deptno = depts.deptno
ORDER BY empno;
+-------+--------+-------+
| empno | ename  | dname |
+-------+--------+-------+
|  NULL | NULL   | OPS   |
|  NULL | NULL   | ACC   |
|     1 | Amit   | DEV   |
|     1 | Amit   | DEV   |
|     2 | Rahul  | DEV   |
|     2 | Rahul  | DEV   |
|     3 | Nilesh | QA    |
|     3 | Nilesh | QA    |
|     4 | Nitin  | NULL  |
|     5 | Sarang | NULL  |
+-------+--------+-------+

既然UNION ALL和UNION是MySQL中FULL JOIN的实现,也就是FULL JOIN在支持FULL JOIN的数据库中使用时通常返回的结果,那么它返回的结果是像UNION ALL一样保留重复还是普通UNION 中更明显的一个?

谢谢...

mysql database join union union-all
1个回答
0
投票

还有一种 FULL JOIN 实现:

SELECT t1.empno, t1.ename, t2.dname
FROM (
    SELECT deptno FROM emps
    UNION 
    SELECT deptno FROM depts
    ) t0
LEFT JOIN emps t1 USING (deptno)
LEFT JOIN depts t2 USING (deptno)
© www.soinside.com 2019 - 2024. All rights reserved.