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


总结:

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

最后:

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


你不知道的 ,MySQL中的七种SQL JOINS的实现,满外连接相关推荐

  1. MySQL:七种 SQL JOINS 的实现(图文详解)

    MySQL:7种SQL JOINS的实现 前言 一.图示表示 二.代码举例 1.INNER JOIN(内连接) 2.LEFT JOIN(左连接) 3.RIGHT JOIN(右连接) 4.OUTER J ...

  2. Mysql中的七种常用查询连接详解

    目录 一.概述 二.连接查询的分类 三.七种常用连接查询详解 1.笛卡尔积: 2.内连接 2.1隐式与显式连接 ?2.2等值连接 ?2.3非等值连接 ?2.4自连接 3外连接 3.1左外连接: ?3. ...

  3. MySQL实现7种 SQL JOINS

    MySQL实现7种 SQL JOINS 文章目录 MySQL实现7种 SQL JOINS UNION 和 UNION ALL 关键字使用 7种SQL JOIN 实现 UNION 和 UNION ALL ...

  4. 7种SQL JOINS 的实现

    Table A设置如下: Table B设置如下: 在Table A和Table B的基础上实现MySQL的七种JOINS # 7种 Sql JOIN的实现# 1.中图 : 内连接 SELECT em ...

  5. SQL 7种SQL JOINS的实现

    以下介绍皆为SQL语言 99语法 mysql 7种SQL JOINS 包括: departments  表 (注意看都有那些列) employees  表(注意都有那些列) 1.内连接: 内连接是通过 ...

  6. mysql中的四种注释

    mysql中的四种注释 NO1:-- 注释内容 这种注释方法不能够实现多行注释,要注意的是 --后面是有一个空格的.(-- 后面的内容将不会被识别,因此需要在下一行加上分号来结束该语句) NO2:#注 ...

  7. mysql数据类型double,double在数据库怎么定义 mysql中double类型在sql中用什么类型

    sql定义一个double变量怎么定义? 局部变量 声明:DECLARE @local_variable data_type @local_variable 是变量的名称.变量名必须以 at 符 (@ ...

  8. 会mysql不会sql_不是吧,不会有人还不知道MySQL中具实用的SQL语句

    原标题:不是吧,不会有人还不知道MySQL中具实用的SQL语句 目录 实用的SQL 1.插入或替换 2.插入或更新 3.插入或忽略 4.SQL中的if-else判断语句 5.指定数据快照或备份 6.写 ...

  9. LINUX中的七种文件类型

    在liunx下一切皆文件. LINUX中的七种文件类型 d 目录文件. l 符号链接(指向另一个文件,类似于window下的快捷方式): s 套接字文件: b 块设备文件,二进制文件: c 字符设备文 ...

最新文章

  1. ubuntu 大小写指示的小工具
  2. js 缺少标识符、字符串或数字
  3. android EditView
  4. python po设计模式_(Python)PO设计模式
  5. NSThread详解
  6. 20171108 模拟题 T1
  7. pl sql入门比较好的书_面试官问你SQL?这几本书足够了
  8. StringBuffer与StringBuilder的作用与区别
  9. 【转】解决win7下重装winXP 系统启动选择菜单消失 问题
  10. 什么情况下使用多线程
  11. 《移动通信原理与系统》——第二章《移动通信电波传播与传播预测模型》——笔记
  12. SaaS微信小程序电商系统,一键生成小程序【源码分享】
  13. 【寒江雪】点到直线的最短距离
  14. 西奥电梯服务器故障维修,干货│西奥电梯故障分析和技术文件
  15. 商务网站建设与维护【2】
  16. [Pyhon大数据分析] 五.人民网新闻话题抓取及Gephi构建主题知识图谱
  17. 服务器硬盘与普通硬盘有什么区别?
  18. 电感RDC、IDC值是什么意思?或DCR DCI
  19. nginx搭建反向代理配置并测试
  20. Z-INDEX: 999

热门文章

  1. matlab绘图插图_几十年来,制图师一直在瑞士官方地图中隐藏秘密插图
  2. 找回旧帖:谢谢斩月,谢谢monkeycz,谢谢dtcser,谢谢超级大BUG
  3. 更新Edge后百度网盘找不到倍速看这里
  4. 排序算法的总结 排序算法及其稳定性
  5. 企业付款到零钱微信API请求报错:error:0909006C:PEM routines:get_name:no start line
  6. articulate storyline 导出html5,Articulate Storyline 3详解与交互学习资源制作
  7. Android四大组件-Service
  8. 對谷詞翻譯機器人(trans@xiaoi.com)的兩點建議
  9. 样本偏度(skewness)与随机变量的偏度及三阶统计量之间的关系和计算估计
  10. 关于TCS230颜色传感器的使用