首页 数据库 mysql教程 图解SQL的各种连接join

图解SQL的各种连接join

Jun 07, 2016 pm 04:24 PM
join sql 图解 连接

对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章(实在不清楚为什么Coding Horror也被墙)通过 文氏图 Venn di

对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章(实在不清楚为什么Coding Horror也被墙)通过 文氏图 Venn diagrams解释了SQL的Join。我觉得清楚易懂,转过来。

假设我们有两张表,Table A是左边的表,Table B是右边的表。

其各有四条记录,其中有两条记录是相同的,如下所示:

id name       id  name
-- ----       --  ----
1  Pirate     1   Rutabaga
2  Monkey     2   Pirate
3  Ninja      3   Darth Vader
4  Spaghetti  4   Ninja
登录后复制

下面让我们来看看不同的Join会产生什么样的结果。

SELECT * FROM TableA INNER JOIN TableB
ON TableA.name = TableB.name
id  name       id   name
--  ----       --   ----
1   Pirate     2    Pirate
3   Ninja      4    Ninja
登录后复制

Inner join
产生的结果集中,是A和B的交集。

Venn diagram of SQL inner join
SELECT * FROM TableA FULL OUTER JOIN TableB
ON TableA.name = TableB.name
id    name       id    name
--    ----       --    ----
1     Pirate     2     Pirate
2     Monkey     null  null
3     Ninja      4     Ninja
4     Spaghetti  null  null
null	null	1     Rutabaga
null	null	3     Darth Vader
登录后复制

Full outer join 产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。

Venn diagram of SQL cartesian join
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name
id  name       id    name
--  ----       --    ----
1   Pirate     2     Pirate
2   Monkey		null	null
3   Ninja      4     Ninja
4   Spaghetti	null	null
登录后复制

Left outer join 产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。

Venn diagram of SQL left join
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null
id  name       id     name
--  ----       --     ----
2   Monkey	null	null
4   Spaghetti	null	null
登录后复制

产生在A表中有而在B表中没有的集合。

join-left-outer.png
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableA.id IS null OR TableB.id IS null
id    name       id    name
--    ----       --    ----
2     Monkey	null	null
4     Spaghetti	null	null
null	null	1     Rutabaga
null	null	3     Darth Vader
登录后复制

产生A表和B表都没有出现的数据集。

join-outer.png

还需要注册的是我们还有一个是"交差集" cross join, 这种Join没有办法用文式图表示,因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。表达式如下:

SELECT * FROM TableA
CROSS JOIN TableB
登录后复制

这个笛卡尔乘积会产生 4 x 4 = 16 条记录,一般来说,我们很少用到这个语法。但是我们得小心,如果不是使用嵌套的select语句,一般系统都会产生笛卡尔乘积然再做过滤。这是对于性能来说是非常危险的,尤其是表很大的时候。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Hibernate 框架中 HQL 和 SQL 的区别是什么? Hibernate 框架中 HQL 和 SQL 的区别是什么? Apr 17, 2024 pm 02:57 PM

HQL和SQL在Hibernate框架中进行比较:HQL(1.面向对象语法,2.数据库无关的查询,3.类型安全),而SQL直接操作数据库(1.与数据库无关的标准,2.可执行复杂查询和数据操作)。

keep体脂秤怎么连接 keep体脂秤怎么连接 Mar 07, 2024 pm 04:50 PM

keep体脂秤怎么连接?keep是有专门设计的体脂秤,但是多数的用户不知道如何连接keep的体脂秤,接下来就是小编为用户带来的keep体脂秤连接方法图文教程,感兴趣的用户快来一起看看吧!keep体脂秤怎么连接1、首先打开keep软件,进入到主页面点击右下角【我的】选择其中的【智能硬件】;2、然后在我的智能设备页面,中间【添加设备】按钮;3、之后在选择你要添加的设备界面,选择【智能体脂/体重秤】;4、接着在选择设备型号页面,点击【keep体脂秤】选项;5、最后在下图所示的界面,最底部的【立即添加】

Oracle SQL中除法运算的用法 Oracle SQL中除法运算的用法 Mar 10, 2024 pm 03:06 PM

《OracleSQL中除法运算的用法》在OracleSQL中,除法运算是常见的数学运算之一。在数据查询和处理过程中,除法运算可以帮助我们计算字段之间的比例或者得出特定数值的逻辑关系。本文将介绍OracleSQL中除法运算的用法,并提供具体的代码示例。一、OracleSQL中除法运算的两种方式在OracleSQL中,除法运算可以使用两种不同的方式进行

Oracle和DB2的SQL语法比较与区别 Oracle和DB2的SQL语法比较与区别 Mar 11, 2024 pm 12:09 PM

Oracle和DB2是两个常用的关系型数据库管理系统,它们都有自己独特的SQL语法和特点。本文将针对Oracle和DB2的SQL语法进行比较与区别,并提供具体的代码示例。数据库连接在Oracle中,使用以下语句连接数据库:CONNECTusername/password@database而在DB2中,连接数据库的语句如下:CONNECTTOdataba

详解MyBatis动态SQL标签中的Set标签功能 详解MyBatis动态SQL标签中的Set标签功能 Feb 26, 2024 pm 07:48 PM

MyBatis动态SQL标签解读:Set标签用法详解MyBatis是一个优秀的持久层框架,它提供了丰富的动态SQL标签,可以灵活地构建数据库操作语句。其中,Set标签是用于生成UPDATE语句中SET子句的标签,在更新操作中非常常用。本文将详细解读MyBatis中Set标签的用法,以及通过具体的代码示例来演示其功能。什么是Set标签Set标签用于MyBati

SQL中的identity属性是什么意思? SQL中的identity属性是什么意思? Feb 19, 2024 am 11:24 AM

SQL中的Identity是什么,需要具体代码示例在SQL中,Identity是一种用于生成自增数字的特殊数据类型,它常用于唯一标识表中的每一行数据。Identity列通常与主键列配合使用,可以确保每条记录都有一个独一无二的标识符。本文将详细介绍Identity的使用方式以及一些实际的代码示例。Identity的基本使用方式在创建表时,可以使用Identit

解决Windows 10网络连接受限的方法 解决Windows 10网络连接受限的方法 Feb 19, 2024 pm 09:20 PM

Win10连接网络受限制解决办法随着科技的快速发展,网络已经成为了人们生活中不可或缺的一部分。然而,有时我们在使用Windows10操作系统的电脑连接网络时可能会遇到一些问题,其中之一就是连接受限制。这种情况下,我们无法正常访问网页、下载文件或者使用网络功能。那么,有什么办法能够解决这个问题呢?本文将为您介绍几种常见的解决办法。一、检查网络连接设置首先,我

修复Edge你的连接不是专用连接的三种方法 修复Edge你的连接不是专用连接的三种方法 Mar 13, 2024 pm 01:30 PM

  大家在使用Edge浏览器访问网页的时候,有遇到提示你的连接不是专用连接,导致网页浏览失败的情况吗?这是怎么回事?很多小伙伴遇到这种问题都不知道如何处理,可以看看下面三个解决办法。  方法一(简单粗暴):在edge浏览器中,您可以通过进入设置并关闭安全性功能,然后在网站权限中阻止位置权限来尝试解决原先报错的网站无法访问的问题。需要注意的是,这种方法的有效性和持续时间可能会有所不同,无法确定具体的效果。重新启动浏览器后,您可以尝试访问该网站,看看是否问题得到解决。  方法二:  调整键盘为英文输

See all articles