通常的全加入:
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 中更明显的一个?
有关问题的详细概述,请继续阅读下面的内容,我在最后再次问了这个问题
要在这两个表上完成连接
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 中更明显的一个?
谢谢...
还有一种 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)