七种SQL JOINS的实现,满外连接
每博一文案
英国作家摩姆说过,我们每个人在世界上都是孤独的,因此
我们只能孤独地行走,尽管身体相互依傍,却并不在一起。
既不了解别的人,也不能为别人所了解。
当一个人受尽了委屈,不会把难处逢人就说,
而是一个人一言不发,是哀莫,待遇心思
愿你所有的义无反顾都能换来流星般的灿烂,
也祝你尝尽世间冷漠。仍有一颗炙热的心,无惧风雨苦乐自尝
———————————— 一禅心灵庙语
文章目录
- 七种SQL JOINS的实现,满外连接
- 每博一文案
- 满外连接
- 七种SOL JOINS的实现
- 总结:
- 最后:
满外连接
满外连接的结果是:左右表匹配的数据 + 左表没有匹配到的数据 + 右表没有匹配到的数据,就是上图 SQL JOINS图 中的左下图
与 UNION 并集,操作的作用一样
在 SQL99语法中满外连接(FULL OUTER JOIN) 同样其中的 OUTER可以省略不写,
但是我们的 MySQL 不支持 FULL JOIN ,我们可以使用 左外连接 + 右外连接 的拼接实现,(LEFT JOIN UNION RIGHT JOIN) 代替 ,但是个人不建议使用 UNION 去重复的拼接,因为它在去重复的这件事上比较消耗性能,
所以我个人建议使用 UNION ALL 的不去重复的拼接,我们可以从算法上到达去重复的效果,而不会消耗性能,做到性能上的优化,如上图SQL JOINS 中的
左中图 + 右上图 以及
具体的Mysql语句实现
SELECT emp.`department_id`, dep.`department_name`
FROM employees AS emp
LEFT JOIN departments AS dep /*表的左外连接*/
ON dep.`department_id` = emp.`department_id` /*表之间的连接条件*/
WHERE dep.`department_id` IS NULL
UNION ALL /*UNION ALL 类型,列数一致*/
SELECT emp.`department_id`, dep.`department_name`
FROM employees AS emp
RIGHT JOIN departments AS dep /*表的右外连接*/
ON emp.`department_id` = dep.`department_id`; /*表之间的连接条件*/
右中图 + 左上图 之间的拼接,就可以达到去重复的效果
具体的Mysql语句的实现
SELECT emp.`department_id`, dep.`department_name`
FROM employees AS emp
LEFT JOIN departments AS dep /*表的左外连接*/
ON dep.`department_id` = emp.`department_id` /*表之间的连接条件*/
UNION ALL /*UNION ALL 类型,列数一致*/
SELECT emp.`department_id`, dep.`department_name`
FROM employees AS emp
RIGHT JOIN departments AS dep /*表的右外连接*/
ON dep.`department_id` = emp.`department_id` /*表之间的连接条件*/
WHERE emp.`department_id` IS NULL; /*表连接后的进一步的筛选*/
七种SOL JOINS的实现
首先我们把图中的A表 认为是我们的 employees表 ,B表 认为是我们的 departments表
- 中图实现,内连接:查询符合连接条件的
SELECT emp.`department_id`, dep.`department_name`
FROM employees AS emp
JOIN departments AS dep /*表的连接*/
ON emp.`department_id` = dep.`department_id`; /*表之间的连接条件*/
- 左上图,左外连接:匹配条件的记录 +左表的所有记录
SELECT emp.`department_id`, dep.`department_name`
FROM employees AS emp
LEFT JOIN departments AS dep /*表的左外连接*/
ON emp.`department_id` = dep.`department_id`; /*表之间的连接条件*/
- 右上图的,右外连接,:匹配符合条件的 + 右表的所有记录
SELECT emp.`department_id`, dep.`department_name`
FROM employees AS emp
RIGHT JOIN departments AS dep /*表的右外连接*/
ON emp.`department_id` = dep.`department_id`; /*表之间的连接条件*/
- 左中图,查询A表中不含有符合连接条件的记录
SELECT emp.`department_id`, dep.`department_name`
FROM employees AS emp
LEFT JOIN departments AS dep /*表的左外连接*/
ON emp.`department_id` = dep.`department_id` /*表之间的连接条件*/
WHERE dep.`department_id` IS NULL; /*表连接后的进一步筛选*/
- 右中图,查询右表中不含有符合连接条件的记录
SELECT emp.`department_id`, dep.`department_name`
FROM employees AS emp
RIGHT JOIN departments AS dep /*表的右外连接*/
ON emp.`department_id` = dep.`department_id` /*表之间的连接条件*/
WHERE emp.`department_id` IS NULL; /*表连接后的进一步筛选*/
- 左下图,满外连接,左表记录 + 符合条件记录 + 右表记录
第一种方式:左中图 UNION ALL 右上图
SELECT emp.`department_id`, dep.`department_name`
FROM employees AS emp
LEFT JOIN departments AS dep /*表的左外连接*/
ON dep.`department_id` = emp.`department_id` /*表之间的连接条件*/
WHERE dep.`department_id` IS NULL
UNION ALL /*UNION ALL 类型,列数一致*/
SELECT emp.`department_id`, dep.`department_name`
FROM employees AS emp
RIGHT JOIN departments AS dep /*表的右外连接*/
ON emp.`department_id` = dep.`department_id`; /*表之间的连接条件*/
第二种方式: 左上图 UNION ALL 右中图
SELECT emp.`department_id`, dep.`department_name`
FROM employees AS emp
LEFT JOIN departments AS dep /*表的左外连接*/
ON dep.`department_id` = emp.`department_id` /*表之间的连接条件*/
UNION ALL /*UNION ALL 类型,列数一致*/
SELECT emp.`department_id`, dep.`department_name`
FROM employees AS emp
RIGHT JOIN departments AS dep /*表的右外连接*/
ON dep.`department_id` = emp.`department_id` /*表之间的连接条件*/
WHERE emp.`department_id` IS NULL; /*表连接后的进一步的筛选*/
- 右下图:不要符合条件的
左中图 UNION ALL 右中图
SELECT emp.`department_id`, dep.`department_name`
FROM employees AS emp
LEFT JOIN departments AS dep /*表的左外连接*/
ON emp.`department_id` = dep.`department_id` /*表之间的连接条件*/
WHERE dep.`department_id` IS NULL /*表连接后的进一步筛选*/
UNION ALL /*UNIION ALl 列数,类型的一致*/
SELECT emp.`department_id`, dep.`department_name`
FROM employees AS emp
RIGHT JOIN departments AS dep /*表的右外连接*/
ON emp.`department_id` = dep.`department_id` /*表之间的连接条件*/
WHERE emp.`department_id` IS NULL; /*表连接后进一步的筛选条件*/
总结:
- Mysql 不支持 SQL99语法中的满外连接关键字 FULL JOIN ,我们使用 UNION ALL 代替,不用 UNION 去重复影响性能,使用 UNION ALL 配合算法实现去重复,优化性能
- 注意 UNION ALL的使用注意事项 类型一致,列数一致
- 外连接与内连接 拼接会失去外连接的作用,注意使用,外连接与外连接的拼接
最后:
限于自身水平,其中存在的错误 ,希望大家给予指教,韩信点兵——多多益善,谢谢大家,后会有期,江湖再见!