目录

前言

一、内连接

二、外连接

1.左外连接

2.右外连接

3.满外连接

三、UNION的使用

四、7种SQL JOINS的实现


前言

在学习内连接与外连接之前,你不妨思考为什么要引入这两种连接方式,带着问题去学习,更有助于我们对知识的学习。

其实在单表查询中,我们是不会接触到内外连接查询的,内外连接查询的方式只是针对我们对于多表的查询,只不过这种方式在实际应用中的方式会根据不同业务需求去使用不同的方式来查询多表。


一、内连接

内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行

语法:

SELECT 字段列表
FROM A表 INNER JOIN B表
ON 关联条件
WHERE 等其他子句;

类似这样:

方式一:
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id);方式二:
SELECT employee_id,department_name
FROM employees e,departments d
WHERE e.`department_id` = d.department_id;

先看这样一段代码:

select  员工表.id,部门表.departmentfrom 员工表,部门表where 员工表.部门id=部门表.部门id;     

这种查询方式:

它会把所有的符合where条件的字段查询出来。听起来十分合理,但是有这样一种这样的情况:就是两张表的数据有的不存在某种关系。(例如:员工表中有的员工他没有部门)

缺点:如果我们想要把不满足条件的数据也查询出来,内连接就做不到。

于是我们引入外连接。

二、外连接

查询多表时一般要求中出现:查询所有的数据时,就一定会用到外连接。(重点记忆

外连接:

  两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的 行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL)。

(mysql不支持sql92,所以我们在写的外连接的语法都是sql99的)

1.左外连接

  • 语法:

SELECT 字段列表
FROM A表 LEFT JOIN B表
ON 关联条件
WHERE 等其他子句;
  • 举例:
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;

2.右外连接

  • 语法:
FROM A表 RIGHT JOIN B表
ON 关联条件
WHERE 等其他子句;
  • 举例:
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;

3.满外连接

满外连接的结果 = 左右表匹配的数据 + 左表没有匹配到的数据 + 右表没有匹配到的数据。

由于mysql不支持FULL JOIN,于是我们需要用 LEFT JOIN UNION RIGHT join代替。

三、UNION的使用

  • 语法:
SELECT column,... FROM table1
UNION [ALL]
SELECT column,... FROM table2

UNION 操作符返回两个查询的结果集的并集,去除重复记录。

UNION ALL操作符返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。

  • 举例:
普通查询:
SELECT * FROM employees WHERE email LIKE '%a%' OR department_id>90;使用union关键字查询:
SELECT * FROM employees WHERE email LIKE '%a%'
UNION
SELECT * FROM employees WHERE department_id>90;    (把这种数据查询出来取并集)

具体用法:

UNION:会执行去重操作
UNION ALL:不会执行去重操作
结论:如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复的数据,
则尽量使用UNION ALL语句,以提高数据查询的效率。

四、7种SQL JOINS的实现

 中图左上图右上图我们已经解决过了,分别对应内连接左外连接以及右外连接


  • 左中图

思路:把左外连接查询出来的数据进行条件筛选

#实现A - A∩B
select 字段列表
from A表 left join B表
on 关联条件
where 从表关联字段 is null and 等其他子句;   (把数据进行剔除)

例子:

#左中图:A - A∩B
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL

先进行查询  再把数据进行where筛选


  • 右中图

思路:把右外连接查询出来的数据进行条件筛选

#实现B - A∩B
select 字段列表
from A表 right join B表
on 关联条件
where 从表关联字段 is null and 等其他子句;

例子:

#右中图:B-A∩B
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL

把数据查询出来 再进行筛选


  • 左下图 (满外连接)

思路:使用union关键字来把数据库中查询的左外连接与右外连接查询出来的数据进行合并

值得注意的是:

用union all 来合并两个表中数据效率会高一些。

#实现查询结果是A∪B
#用左外的A,union 右外的B
select 字段列表
from A表 left join B表
on 关联条件
where 等其他子句
union
select 字段列表
from A表 right join B表
on 关联条件
where 等其他子句;

例子:

SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL #没有去重操作,效率高
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;

  • 右下图

思路:将左中图与右中图的数据合并起来

#实现A∪B - A∩B 或 (A - A∩B) ∪ (B - A∩B)
#使用左外的 (A - A∩B) union 右外的(B - A∩B)
select 字段列表
from A表 left join B表
on 关联条件
where 从表关联字段 is null and 等其他子句
union
select 字段列表
from A表 right join B表
on 关联条件
where 从表关联字段 is null and 等其他子句

例子:

#右下图
#左中图 + 右中图 A ∪B- A∩B 或者 (A - A∩B) ∪ (B - A∩B)
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL

内连接与外连接(全网最详细)相关推荐

  1. 【MySQL】MySQL内连接和外连接详细总结

    目录 多表查询的分类3:内连接VS外连接(重难点) 1. 内连接 2.外连接 3. SQL99语法实现多表查询 3.1 SQL99实现内连接 3.2 SQL99语法实现外连接 3.2.1 左外连接 3 ...

  2. 全网最全的mysql表的关联查询(内连接,外连接)

    Mysql 多表连接查询 inner join 和 outer join 的使用 JOIN的含义就如英文单词"join"一样,连接两张表,大致分为 内连接,外连接,右连接,左连接, ...

  3. 内连接、外连接的区别及作用

    1.基本介绍 不管是内连接.外连接还是带where子句的多表查询,都组合自多个表,并生成结果表. 1.内连接:只返回两个表中连接字段相等的行.inner join(等值连接) 只返回两个表中联结字段相 ...

  4. 深入分析内连接、外连接、左连接、右连接、等值连接、自然连接和自连接之间的区别,看这篇就够了!

    多表查询经常用到连接,各种连接之间的区别应该注意总结. 首先大概认识各种连接的关系和由来: 表之间的连接常有以下两种: 一.:在SELECT语句的WHERE子句中使用比较运算符给出连接条件,对表进行连 ...

  5. SQL中内连接、外连接、交叉连接

    SQL中内连接.外连接.交叉连接 SQL连接可以分为内连接.外连接.交叉连接. 数据库数据:            book表                                      ...

  6. 【MySQL】(图解)快速理解内连接、外连接、左连接、右连接

    [1] 示例数据   用两个表(a_table.b_table),关联字段a_table.a_id和b_table.b_id来演示一下MySQL的内连接.外连接( 左(外)连接.右(外)连接).    ...

  7. mysql内连接和外连接的区别_内连接、外连接的区别

    先来看一下,内连接的语法: SELECT  XXX FROM XXX INNER JOIN XXX ON XXX; 这里 INNER 可以省略,在上一篇博客中我们对于笛卡尔积现象的研究中(http:/ ...

  8. mysql 多表既有内连接又有外连接_MySQL 多表查询中的内连接和外连接

    一般情况下一个网站的数据库通常会有多张数据表组成,这些数据表分别存储网站不同区域的内容.数据表之间可以用类似 ID 的字段来关联,在查询的时候可以通过一条语句来查询多张表的内容.例如 论坛的数据库,帖 ...

  9. 详解SQL Server连接(内连接、外连接、交叉连接)

    在查询多个表时,我们经常会用"连接查询".连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 什么是连接查询呢? 概念:根据两个表或多个表的列之间的关系 ...

最新文章

  1. 2019春季学期第三周编程总结
  2. AMD宣布350亿美元收购赛灵思,CPU、GPU、FPGA全凑齐,中国握有否决权
  3. Java的Excel导出方案介绍
  4. 使用Visual Studio Code进行由内而外的C#开发
  5. C#中const和readonly有什么区别?
  6. jstack分析CPU高的问题
  7. Docker 之 概念介绍
  8. 【CVRP】基于matlab遗传算法求解带容量的车辆路径规划问题【含Matlab源码 162期】
  9. springcloud整合sentinel
  10. 供应商TOP10榜单!车载前装激光雷达进入规模化上车关键期
  11. 修改MySQL的配置文件
  12. 简单快速获取思维导图
  13. 如何打造高质量的NLP数据集
  14. Unity中国象棋(二)——走棋
  15. android桌面动画
  16. Java程序设计基础【9】
  17. 如何制作电视展示艺术品(或全家福)
  18. java的tey语句return了_Java finally语句到底是在return之前还是之后执行?
  19. 使用MathType编辑公式时,删除键backspace和delete不好用,解决办法
  20. Lua 起航 —— 一些常用基础语法

热门文章

  1. java生成图片乱码_Centos下JAVA生成图片时字体乱码
  2. chrony系统授时时,几条重要命令输出信息的含义
  3. 秋招总结---求职攻略
  4. Cornerstone 破解版
  5. [ctfshow]入门
  6. 理解事务处理、事务处理的隔离级别,和使用JDBC进行事务处理
  7. BZOJ2325 [ZJOI2011]道馆之战
  8. 快手帝国的造富神话,程序员们身家过百亿
  9. 软件测试周刊(第03期):质量回溯、自动验证埋点、故障度量指标、产品质量指标
  10. mapbox矢量切片_使用Tippecanoe工具处理大数据量的矢量数据切片