七种SQL JOINS的实现,满外连接

mysql中全链接 mysql实现全连接_mysql中全链接


每博一文案

英国作家摩姆说过,我们每个人在世界上都是孤独的,因此
我们只能孤独地行走,尽管身体相互依傍,却并不在一起。
既不了解别的人,也不能为别人所了解。
当一个人受尽了委屈,不会把难处逢人就说,
而是一个人一言不发,是哀莫,待遇心思
愿你所有的义无反顾都能换来流星般的灿烂,
也祝你尝尽世间冷漠。仍有一颗炙热的心,无惧风雨苦乐自尝
                                        ————————————   一禅心灵庙语

文章目录

  • 七种SQL JOINS的实现,满外连接
  • 每博一文案
  • 满外连接
  • 七种SOL JOINS的实现
  • 总结:
  • 最后:



mysql中全链接 mysql实现全连接_sql_02


满外连接

满外连接的结果是:左右表匹配的数据 + 左表没有匹配到的数据 + 右表没有匹配到的数据,就是上图 SQL JOINS图 中的左下图

mysql中全链接 mysql实现全连接_后端_03

UNION 并集,操作的作用一样

SQL99语法满外连接(FULL OUTER JOIN) 同样其中的 OUTER可以省略不写,

但是我们的 MySQL 不支持 FULL JOIN ,我们可以使用 左外连接 + 右外连接 的拼接实现,(LEFT JOIN UNION RIGHT JOIN) 代替 ,但是个人不建议使用 UNION 去重复的拼接,因为它在去重复的这件事上比较消耗性能,

所以我个人建议使用 UNION ALL 的不去重复的拼接,我们可以从算法上到达去重复的效果,而不会消耗性能,做到性能上的优化,如上图SQL JOINS 中的

左中图 + 右上图 以及

mysql中全链接 mysql实现全连接_数据库_04

具体的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中全链接 mysql实现全连接_sql_05

具体的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;            /*表连接后的进一步的筛选*/

mysql中全链接 mysql实现全连接_sql_06


七种SOL JOINS的实现

mysql中全链接 mysql实现全连接_数据库_07

首先我们把图中的A表 认为是我们的 employees表B表 认为是我们的 departments表

mysql中全链接 mysql实现全连接_数据库_08


mysql中全链接 mysql实现全连接_sql_09


  • 中图实现,内连接:查询符合连接条件的
SELECT emp.`department_id`, dep.`department_name`
FROM employees AS emp
JOIN departments AS dep                         /*表的连接*/
ON emp.`department_id` = dep.`department_id`;  /*表之间的连接条件*/

mysql中全链接 mysql实现全连接_后端_10


  • 左上图,左外连接:匹配条件的记录 +左表的所有记录
SELECT emp.`department_id`, dep.`department_name`
FROM employees AS emp
LEFT JOIN departments AS dep                     /*表的左外连接*/
ON emp.`department_id` = dep.`department_id`;   /*表之间的连接条件*/

mysql中全链接 mysql实现全连接_后端_11


  • 右上图的,右外连接,:匹配符合条件的 + 右表的所有记录
SELECT emp.`department_id`, dep.`department_name`
FROM employees AS emp
RIGHT JOIN departments AS dep                   /*表的右外连接*/
ON emp.`department_id` = dep.`department_id`;  /*表之间的连接条件*/

mysql中全链接 mysql实现全连接_mysql中全链接_12


  • 左中图,查询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;           /*表连接后的进一步筛选*/

mysql中全链接 mysql实现全连接_sql_13


  • 右中图,查询右表中不含有符合连接条件的记录
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中全链接 mysql实现全连接_mysql_14


  • 左下图,满外连接,左表记录 + 符合条件记录 + 右表记录
    第一种方式:左中图 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`;  /*表之间的连接条件*/

mysql中全链接 mysql实现全连接_数据库_15


第二种方式: 左上图 UNION ALL 右中图

mysql中全链接 mysql实现全连接_后端_16

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;            /*表连接后的进一步的筛选*/

mysql中全链接 mysql实现全连接_mysql中全链接_17


  • 右下图:不要符合条件的
    左中图 UNION ALL 右中图

mysql中全链接 mysql实现全连接_mysql_18


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中全链接 mysql实现全连接_数据库_19


总结:

  1. Mysql 不支持 SQL99语法中的满外连接关键字 FULL JOIN ,我们使用 UNION ALL 代替,不用 UNION 去重复影响性能,使用 UNION ALL 配合算法实现去重复,优化性能
  2. 注意 UNION ALL的使用注意事项 类型一致,列数一致
  3. 外连接与内连接 拼接会失去外连接的作用,注意使用,外连接与外连接的拼接

最后:

限于自身水平,其中存在的错误 ,希望大家给予指教,韩信点兵——多多益善,谢谢大家,后会有期,江湖再见!