【转】图解SQL的各种连接join
原帖地址:http://www.nowamagic.net/librarys/veda/detail/936
图解SQL的各种连接join
让你对SQL的连接一目了然
在 2011年12月22日 那天写的 已经有 16729 次阅读了
感谢 参考或原文
服务器君一共花费了16.289 ms进行了2次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议
对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章(实在不清楚为什么Coding Horror也被墙)通过 文氏图 Venn diagrams解释了SQL的Join。我觉得清楚易懂,转过来。
假设我们有两张表,Table A是左边的表,Table B是右边的表。
其各有四条记录,其中有两条记录是相同的,如下所示:
1
id
name
id
name
2
-- ---- -- ----
3
1 Pirate 1 Rutabaga
4
2 Monkey 2 Pirate
5
3 Ninja 3 Darth Vader
6
4 Spaghetti 4 Ninja
下面让我们来看看不同的Join会产生什么样的结果。
1
SELECT
*
FROM
TableA
INNER
JOIN
TableB
2
ON
TableA.
name
= TableB.
name
3
id
name
id
name
4
-- ---- -- ----
5
1 Pirate 2 Pirate
6
3 Ninja 4 Ninja
Inner join
产生的结果集中,是A和B的交集。
01
SELECT
*
FROM
TableA
FULL
OUTER
JOIN
TableB
02
ON
TableA.
name
= TableB.
name
03
id
name
id
name
04
-- ---- -- ----
05
1 Pirate 2 Pirate
06
2 Monkey
null
null
07
3 Ninja 4 Ninja
08
4 Spaghetti
null
null
09
null
null
1 Rutabaga
10
null
null
3 Darth Vader
Full outer join 产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。
1
SELECT
*
FROM
TableA
LEFT
OUTER
JOIN
TableB
ON
TableA.
name
= TableB.
name
2
id
name
id
name
3
-- ---- -- ----
4
1 Pirate 2 Pirate
5
2 Monkey
null
null
6
3 Ninja 4 Ninja
7
4 Spaghetti
null
null
Left outer join 产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。
1
SELECT
*
FROM
TableA
LEFT
OUTER
JOIN
TableB
ON
TableA.
name
= TableB.
name
WHERE
TableB.id
IS
null
2
id
name
id
name
3
-- ---- -- ----
4
2 Monkey
null
null
5
4 Spaghetti
null
null
产生在A表中有而在B表中没有的集合。
1
SELECT
*
FROM
TableA
FULL
OUTER
JOIN
TableB
ON
TableA.
name
= TableB.
name
WHERE
TableA.id
IS
null
OR
TableB.id
IS
null
2
id
name
id
name
3
-- ---- -- ----
4
2 Monkey
null
null
5
4 Spaghetti
null
null
6
null
null
1 Rutabaga
7
null
null
3 Darth Vader
产生A表和B表都没有出现的数据集。
还需要注册的是我们还有一个是"交差集" cross join, 这种Join没有办法用文式图表示,因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。表达式如下:
1
SELECT
*
FROM
TableA
2
CROSS
JOIN
TableB
这个笛卡尔乘积会产生 4 x 4 = 16 条记录,一般来说,我们很少用到这个语法。但是我们得小心,如果不是使用嵌套的select语句,一般系统都会产生笛卡尔乘积然再做过滤。这是对于性能来说是非常危险的,尤其是表很大的时候。
【转】图解SQL的各种连接join的更多相关文章
- [No00008C]图解SQL的各种连接join让你对SQL的连接一目了然
对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...
- 图解SQL的各种连接join[转]
对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...
- 图解SQL的各种连接join
对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...
- SQL的各种连接Join详解
SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段. 最常见的 JOIN 类型:SQL INNER JOIN(简单的 JOIN).SQL LEFT JOIN.SQL ...
- sql优化 表连接join方式
sql优化核心 是数据库中 解析器+优化器的工作,我觉得主要有以下几个大方面:1>扫表的方法(索引非索引.主键非主键.书签查.索引下推)2>关联表的方法(三种),关键是内存如何利用 ...
- 【Oracle】SQL的各种连接join
SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段. 最常见的 JOIN 类型: INNER JOIN(简单的 JOIN).LEFT JOIN.RIGHT JOIN.F ...
- 图解 SQL 里的各种 JOIN
约定 下文将使用两个数据库表 Table_A 和 Table_B 来进行示例讲解,其结构与数据分别如下: mysql> SELECT * FROM Table_A ORDER BY PK ASC ...
- 图解SQL的Join(转)
对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...
- SQL 连接 JOIN 例解。(左连接,右连接,全连接,内连接,交叉连接,自连接)
SQL 连接 JOIN 例解.(左连接,右连接,全连接,内连接,交叉连接,自连接) 最近公司在招人,同事问了几个自认为数据库可以的应聘者关于库连接的问题,回答不尽理想-现在在这写写关于它们的作用假设有 ...
随机推荐
- JAVA生成PDF文件
生成PDF文件是主要应用的是ITEXT插件 import java.awt.Color; import java.io.File; import java.io.FileOutputStream; i ...
- WIN32不得不会:视频播放器
我愿分享我所有的技术,你可愿意做我的朋友? ----赵大哥 为何要写这篇博客 纯WIN32API打造,自认为对底层的理解略有帮助,和大家分享成果和知识点. 已经实现功能有:打开.播放.关闭功能. 核心 ...
- mac不可或缺的套件管理器Homebrew
Homebrew 1.简介 可以帮助我们快速安装软件, 如 brew install svn 快速卸载软件 , 如 brew uninstall svn 2.下载 打开终端, /usr/bin/ru ...
- 对<< ubuntu 12.04编译安装linux-3.6.10内核笔记>>的修正
前题: 在前几个月的时候,写了一篇笔记,说的是kernel compile的事情,当时经验不足,虽说编译过了,但有些地方写的有错误--因为当时的理解是有错误的.今天一一更正,记录如下: 前文笔记链接: ...
- ThinkPHP3.2.3新特性之:数据库设置
ThinkPHP3.2.3版本数据库驱动采用PDO完全重写,配置和使用上面也比之前版本更加灵活和强大,我们来了解下如何使用. 首先,3.2.3的数据库配置信息有所调整,完整的数据库设置包括: /* 数 ...
- windows平台下php版本问题–VC6/VC9和TS/NTS
php下载页面中提供了4个下载版本,是vc6/vc9 与 TS/NTS的组合 VC6:legacy Visual Studio 6 compiler,就是使用这个编译器编译的. VC9: ...
- python 源码解析
http://blog.donews.com/lemur/archive/category/cpython%E6%BA%90%E7%A0%81%E5%89%96%E6%9E%90/
- NPOI导出多表头Execl(通过html表格遍历表头)
关于NPOI的相关信息,我想博客园已经有很多了,而且NPOI导出Execl的文章和例子也很多,但导出多表头缺蛮少的:今天要讲的通过自己画html表格:通过html表格来导出自定义的多表头: 先来看要实 ...
- 101个直接可以拿来用的JavaScript实用功能代码片段(转)
1.原生JavaScript实现字符串长度截取 function cutstr(str, len) { var temp; var icount = 0; var patrn = /[^x00-xff ...
- 使用TortoiseGit对Git版本进行分支操作
版本克隆分支问题 TortoiseGit在克隆分支的时候,默认克隆master分支,克隆后本地工作目录为中心器的Master分支. 克隆后本地分支 中心库分支 Push分支到中心服务器(Pushing ...