您当前的位置:首页 > 电脑百科 > 数据库 > 百科

一文搞懂SQL JOIN

时间:2021-10-15 11:17:10  来源:  作者:架构那些事儿

一、前言


SQL JOIN是软件开发者的必会知识点,这些JOIN有什么区别和联系呢,本文来一一剖析。

要了解SQL,其实我们需要了解下关系代数。为什么这么说呢?

数据库系统合并数据的原理其实是基于关系代数。SQL 语言是在关系代数上的一层封装,目的是方便程序员使用。关系代数是 SQL 语言的基础。

 

二、什么是关系代数



1、关系代数:

关系代数是由E.F.Codd于1970年提出的,它是合并数据集合的理论基础。
关系代数的操作接受一个或多个关系作为输入,再输出一个新的关系,不同的关系操作可以进行相互的组合。例如可以先进行选择操作再进行投影操作,先进行自然连接操作再进行选择操作等等。根据不同的需求需要灵活的组合这些操作。

 

2、在关系代数的形式化语言中:

用表、或者数据集合表示关系或者实体。

用行表示元组。

用列表示属性。

3、关系代数包含三大类运算符:

关系运算符 :选择、投影、连接、除

集合运算符 :并、差、交、笛卡尔积

比较操作符:大于 小于 等于 与 或 非

比较操作符比较简单就不介绍了,集合和关系运算符共8个,我们简单说明:

 选择-返回满足指定条件的行。select

 投影-从数据集合中返回指定的列。

 连接-在水平方向上合并两个表,其方法是:将两个表中在共同数据项上相互匹配的那些行合并起来。Join

 除-返回两个数据集之间的精确匹配。

 并-关系的加法和减法,它可以在行的方向上合并两个表中的数据,就像把一个表垒在另一个表之上一样。

 交-返回两个数据集合所共有的行。

 差-返回只属于一个数据集合的行。

 笛卡尔积-是关系的乘法,它将分别来自两个数据集合中的行以所有可能的方式进行组合。

 

此外,作为一种实现现代关系代数运算的方法,SQL还提供了:

 子查询-类似于连接,但更灵活;在外部查询中,可以使用表达式、列表或者数据集合的地方都可以使用子查询的结果。

本文将主要讲述多种类型的连接。

三、连接


 

3.1 什么是连接JOIN

JOIN子句合并两个或多个表中的行。在临时表中创建一组行。

3.2 连接类型

在关系代数中,连接运算是由一个笛卡尔积运算和一个选取运算构成的。首先用笛卡尔积完成对两个数据集合的乘运算,然后对生成的结果集合进行选取运算,确保只把分别来自两个数据集合并且具有重叠部分的行合并在一起。连接的全部意义在于在水平方向上合并两个数据集合(通常是表),并产生一个新的结果集合,其方法是将一个数据源中的行与另一个数据源中和它匹配的行组合成一个新元组。
SQL提供了多种类型的连接方式,它们之间的区别在于:从相互交叠的不同数据集合中选择用于连接的行时所采用的方法不同。

连接类型

定义

自身连接

 

内连接

只连接匹配的行

左连接或左外连接

包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行

右连接或右外连接

包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行

全外连接

包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。

自然连接

其结构使得具有相同名称的关联表的列将仅出现一次

交叉连接

生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配

 

 

3.2.1 自身连接

自联接是表与自身联接(一元关系)的联接,特别是当表具有引用其自身PRIMARY KEY的FOREIGN KEY时。例如人力资源数据库中雇员与老板的关系。联接表本身意味着表的每一行都与自身以及表的其他每一行结合在一起。自联接可以看作是同一表的两个副本的联接。

例如:SELF JOIN

SELECT *

FROM table_A X,table_A Y

WHERE XA = YA;

一文搞懂SQL JOIN

 

3.2.2 内连接(Inner Join)

只要各列之间存在匹配,INNER JOIN就会从两个参与表中选择所有行。SQL INNER JOIN与JOIN子句相同(即inner可以省略),它组合了两个或多个表中的行。

示例:INNER JOIN

SELECT * FROM table_A

INNER JOIN table_B

ON table_A.A = table_B.A;

一文搞懂SQL JOIN

 

3.2.3 左外连接(Left Outer Jion)

SQL LEFT JOIN连接两个表,并根据条件获取行,两个表中的行均匹配。
JOIN子句之前的表中还将提供不匹配的行。

示例:LEFT JOIN或LEFT OUTER JOIN

SELECT * FROM table_A

LEFT JOIN table_B

ON table_A.A = table_B.A;

一文搞懂SQL JOIN

 

 

3.2.4 右外连接(Right Outer Jion)

SQL RIGHT JOIN连接两个表,并根据条件获取行,两个表中的行均匹配。不匹配的行也可以从JOIN子句后面编写的表中获得。

示例:RIGHT JOIN或RIGHT OUTER JOIN

SELECT * FROM table_A

RIGHT JOIN table_B

ON table_A.A = table_B.A;

一文搞懂SQL JOIN

 

3.2.5 全外连接(Full Outer Join)

合并左右外部联接的结果。返回所有匹配或不匹配的行。在join子句的两边都包含表。

说明:全外连接返回参与连接的两个数据集合中的全部数据,无论它们是否具有与之相匹配的行。在功能上,它等价于对这两个数据集合分别进行左外连接和右外连接,然后再使用消去重复行的并操作将上述两个结果集合并为一个结果集。
在现实生活中,参照完整性约束可以减少对于全外连接的使用,一般情况下左外连接就足够了。在数据库中没有利用清晰、规范的约束来防范错误数据情况下,全外连接就变得非常有用了,你可以使用它来清理数据库中的数据。

示例:FULL OUTER JOIN

SELECT * FROM table_A

FULL OUTER JOIN table_B

ON table_A.A = table_B.A;

一文搞懂SQL JOIN

 

3.2.6 交叉(无限制) 连接(CROSS JOIN)

如果未与CROSS JOIN一起使用WHERE子句,则SQL CROSS JOIN会产生一个结果集,该结果集是第一个表中的行数乘以第二个表中的行数。这种结果称为笛卡尔积。例如,如果第一个数据源中有5个行,而第二个数据源中有4个行,那么在它们之间进行交叉连接就会产生20个行。如果WHERE子句与CROSS JOIN一起使用,则其功能类似于INNER JOIN。

说明:大多数交叉连接都是由于错误操作而造成的;但是它们却非常适合向数据库中填充例子数据,或者预先创建一些空行以便为程序执行期间所要填充的数据保留空间。

示例:CROSS JOIN

SELECT *

FROM table_A

Cross join table_B;

一文搞懂SQL JOIN

 

3.2.7 自然连接(NATURAL JOIN)

SQL NATURAL JOIN是EQUI JOIN的一种,其结构使得具有相同名称的关联表的列将仅出现一次。关联的表具有一对或多对相同名称的列。这些列必须是相同的数据类型。不要在自然连接中使用ON子句。

示例:NATURAL JOIN

SELECT *

FROM table_A

NATURAL JOIN table_B;

一文搞懂SQL JOIN

 

四、小结


 

1、掌握SQL语言要掌握关系代数。关系代数的三类运算符:关系运算符、集合运算符、比较操作符。数据库系统合并数据的原理其实是基于关系代数。SQL 语言是在关系代数上的一层封装。

2、不同join之间的区别。



Tags:SQL JOIN   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一、前言SQL JOIN是软件开发者的必会知识点,这些JOIN有什么区别和联系呢,本文来一一剖析。要了解SQL,其实我们需要了解下关系代数。为什么这么说呢?数据库系统合并数据的原理其...【详细内容】
2021-10-15  Tags: SQL JOIN  点击:(67)  评论:(0)  加入收藏
这一系列讲述,两张表的 Join, 或许你都不一定知道的事儿。之前写过 SQL 的编译原理,很多朋友都不知道 SQL 背后,居然还有编译一说。SQL 用起来和 C#/Java 还是有些异样的。写好...【详细内容】
2020-06-21  Tags: SQL JOIN  点击:(140)  评论:(0)  加入收藏
SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。最常见的 JOIN 类型:SQL INNER JOIN(简单的 JOIN)、SQL LEFT JOIN、SQL RIGHT JOIN、SQL FULL JO...【详细内容】
2019-10-21  Tags: SQL JOIN  点击:(125)  评论:(0)  加入收藏
▌简易百科推荐
1增1.1【插入单行】insert [into] <表名> (列名) values (列值)例:insert into Strdents (姓名,性别,出生日期) values (&#39;开心朋朋&#39;,&#39;男&#39;,&#39;1980/6/15&#3...【详细内容】
2021-12-27  快乐火车9d3    Tags:SQL   点击:(1)  评论:(0)  加入收藏
最近发现还有不少做开发的小伙伴,在写存储过程的时候,在参考已有的不同的写法时,往往很迷茫, 不知道各种写法孰优孰劣,该选用哪种写法,以及各种写法的优缺点,本文以一个简单的查询...【详细内容】
2021-12-23  linux上的码农    Tags:sql   点击:(9)  评论:(0)  加入收藏
《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的HasorDB 是一个全功能数据库访问工具,提供对象映射、丰...【详细内容】
2021-12-22  GitHub精选    Tags:HasorDB   点击:(5)  评论:(0)  加入收藏
作者丨Rafal Grzegorczyk译者丨陈骏策划丨孙淑娟【51CTO.com原创稿件】您是否还在手动对数据库执行各种脚本?您是否还在浪费时间去验证数据库脚本的正确性?您是否还需要将...【详细内容】
2021-12-22    51CTO  Tags:Liquibase   点击:(3)  评论:(0)  加入收藏
场景描述:由于生产环境的表比较复杂,字段很多。这里我们做下简化,只为说明今天要聊的问题。有两张表 tab1,tab2: tab1 数据如下: tab2 数据如下: 然后给你看下,我用来统计 name=&#3...【详细内容】
2021-12-20  Bald    Tags:SQL   点击:(5)  评论:(0)  加入收藏
前言知识无底,学海无涯,知识点虽然简单,但是比较多,所以将MySQL的基础写出来,方便自己以后查找,还有就是分享给大家。一、SQL简述1.SQL的概述Structure Query Language(结构化查...【详细内容】
2021-12-16  谣言止于独立思考    Tags:SQL基础   点击:(13)  评论:(0)  加入收藏
前言作为一名测试工程师,工作中在对测试结果进行数据比对的时候,或多或少要和数据库打交道的,要和数据库打交道,那么一些常用的 SQL 查询语法必须要掌握。最近有部分做测试小伙...【详细内容】
2021-12-14  柠檬班软件测试    Tags:SQL   点击:(15)  评论:(0)  加入收藏
话说C是面向内存的编程语言。数据要能存得进去,取得出来,且要考虑效率。不管是顺序存储还是链式存储,其寻址方式总是很重要。顺序存储是连续存储。同质结构的数组通过其索引表...【详细内容】
2021-12-08  小智雅汇    Tags:数据存储   点击:(17)  评论:(0)  加入收藏
概述DBConvert Studio 是一款强大的跨数据库迁移和同步软件,可在不同数据库格式之间转换数据库结构和数据。它将成熟、稳定、久经考验的 DBConvert 和 DBSync 核心与改进的现...【详细内容】
2021-11-17  雪竹聊运维    Tags:数据库   点击:(26)  评论:(0)  加入收藏
一、前言 大家好,我是小诚,《从0到1-全面深刻理解MySQL系列》已经来到第四章,这一章节的主要从一条SQL执行的开始,由浅入深的解析SQL语句由客户端到服务器的完整执行流程,最...【详细内容】
2021-11-09  woaker    Tags:SQL   点击:(35)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条