内连接与外连接(全网最详细)

Posted 百晓生不想学Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内连接与外连接(全网最详细)相关的知识,希望对你有一定的参考价值。

目录

前言

一、内连接

二、外连接

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,部门表.department

from 员工表,部门表

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

内连接与外连接

在数据库系统中,join用于比较和组合(字面意思是连接)并从数据库中的两个或多个表返回特定数据行。内连接从表中查找并返回匹配数据,而外连接从表中查找并返回匹配数据和一些不同的数据。

内连接

内连接侧重于两个表之间的共性。使用内部联接时,要比较的两个(或多个)表之间,必须有一些匹配数据,即链接的条件。内部联接在表中搜索匹配或重叠的数据。找到后,内连接将信息合并并返回到一个新表中。

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

内连接例子

让我们考虑两个表的常见场景:产品价格和数量。两个表中的公共信息是产品名称,因此这是连接表的逻辑列。有一些产品在两个表中是通用的;其他的对于其中一个表是唯一的,并且在另一个表中没有匹配项。

下面是通过产品名称作为连接条件,将符合条件的信息返回

外连接

外连接返回一组记录(或行),其中包括内连接将返回的内容,但也包括在其他表中找不到对应匹配项的其他行。
外连接分为三种类型:

  • 左外连接(或左连接)
  • 右外连接(或右连接)
  • 完全外连接(或完全连接)

这些外部联接中的每一个都指的是正在比较、组合和返回的数据部分。有时在此过程中会产生null,因为某些数据是共享的,而其他数据则不是。

左连接

左外连接将返回表 1中的所有数据和所有共享数据,但仅返回表 2 中的相应数据,即左连接。

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

左连接例子

在我们的示例数据库中,“左边”(prices表)有两种产品——oranges和 tomatoes ,在“右边”(quantities表)上没有相应的条目。在左连接中,这些行包含在结果集中,数量列中为 NULL。结果中的其他行与内部联接相同。

右连接

右外连接返回表 2 的数据和所有共享数据,但仅返回表 1 中的相应数据,即右连接。

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

右连接例子

与左连接示例类似,右外连接的输出包括内连接的所有行和来自“右”(quantities表)的两行 - broccoli 和squash - 在左侧没有匹配的条目。

全连接

流行的 MySQL 数据库管理系统不支持的完全外连接或完全连接,无论是否存在共享信息,都会合并并返回来自两个或多个表的所有数据。将完全连接视为简单地复制所有指定信息,但在一个表中,而不是在多个表中。在缺少匹配数据的情况下,将产生空值。

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

这些只是基础知识,但很多事情都可以通过连接来完成。甚至还有可以排除其他连接的连接!

以上是关于内连接与外连接(全网最详细)的主要内容,如果未能解决你的问题,请参考以下文章

本地Navicat连接阿里云数据库RDS for MySQL(全网最详细,没有之一!)

SQL内连接与外连接用法与区别

SQL内连接与外连接的区别

SQL内连接与外连接用法与区别

mysql数据库基础

全网最详细的 SpringBoot + Druid DataSource 实现监控 MySQL 性能