图解SQL的inner join、left join、right join、full outer join、union、union all的区别

SQL的Join语法有很多,
inner join(等值连接) 只返回两个表中联结字段相等的行,
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录,
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录,
看到一篇图解文章,非常清楚简洁的说明了使用JOIN操作后的结果集是什么格式。

假设我们有两张表。Table A 是左边的表。Table B 是右边的表。其各有四条记录,其中有两条记录name是相同的,如下所示:

A表
id name
1 Pirate
2 Monkey
3 Ninja
4 Spaghetti
B表
id name
1 Rutabaga
2 Pirate
3 Darth Vade
4 Ninja

让我们看看不同JOIN的不同。

1.INNER JOIN

SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name

满足TableA.name = TableB.name的数据共有两条,即 name=Pirate 和 name=Ninja ,结果如下

结果集
(TableA.) (TableB.)
id name id name
1 Pirate 2 Pirate
3 Ninja 4 Ninja

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

2.FULL [OUTER] JOIN 

(1)

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name 

 TableA.name = TableB.name 的情况,A和B的交集有两条数据,那么 FULL OUTER JOIN的结果集,

应该是2+2+2=6条,即上面的交集,再加剩下的四条数据,没有匹配,以null补全。

结果集
(TableA.) (TableB.)
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 Vade

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

可以使用IFNULL判断。

(2)

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
WHERE TableA.id IS null OR TableB.id IS null

添加这个 where 条件,可以排除掉两表的数据交集。

结果集
(TableA.) (TableB.)
id name id name
2 Monkey null null
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vade

 产生A表和B表没有交集的数据集。

 

3.LEFT [OUTER] JOIN

(1)

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name

以左表为准,根据 TableA.name = TableB.name 这个条件,右表没有的数据 null 补全。

结果集
(TableA.) (TableB.)
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值取代。

(2)

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null

其实就是在上一步的结果集中又做了一次筛选工作。

结果集
(TableA.) (TableB.)
id name id name
2 Monkey null null
4 Spaghetti null null

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

4.RIGHT [OUTER] JOIN

RIGHT OUTER JOIN 是后面的表为基础,与LEFT OUTER JOIN用法类似。这里不介绍了。

5.UNION  UNION ALL

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。UNION 只选取记录,而UNION ALL会列出所有记录。

(1)SELECT name FROM TableA UNION SELECT name FROM TableB

新结果集
name
Pirate
Monkey
Ninja
Spaghetti
Rutabaga
Darth Vade

选取不同值。

(2)SELECT name FROM TableA UNION ALL SELECT name FROM TableB

新结果集
name
Pirate
Monkey
Ninja
Spaghetti
Rutabaga
Pirate
Darth Vade
Ninja

全部列出来。

(3)注意:

SELECT * FROM TableA UNION SELECT * FROM TableB

新结果集
id name
1 Pirate
2 Monkey
3 Ninja
4 Spaghetti
1 Rutabaga
2 Pirate
3 Darth Vade
4 Ninja

由于 id 1 Pirate   与 id 2 Pirate 并不相同,不合并。

 

6.CROSS JOIN

还需要注意的是“交差集” cross join,这种Join没有办法用文式图表示,

因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。

表达式如下:

SELECT * FROM TableA CROSS JOIN TableB

这个笛卡尔乘积会产生 4 x 4 = 16 条记录,一般来说,很少用到这个语法。

但是我们得小心,如果不是使用嵌套的select语句,一般系统都会产生笛卡尔乘积然再做过滤。当表很大的时候,会极大的影响性能。

 

 

时间: 2024-10-03 22:51:39

图解SQL的inner join、left join、right join、full outer join、union、union all的区别的相关文章

SQL Server的Inner Join及Outer Join

当然 Join 如何将不同的数据库的资料结合, 还要看你如何使用它, 一共有四种不同的 Join 的方式, 在这篇文章中我们将为你介绍 Inner Join 及 Outer Join 以及其应用. 在一个正规化的数据库环境中, 我们常会碰到这款情形: 所需的资料并不是放在同一个资料表中, 在这个时候, 你就要用到 Join. 当然 Join 如何将不同的数据库的资料结合, 还要看你如何使用它, 一共有四种不同的 Join 的方式, 在这篇文章中我们将为你介绍 Inner Join 及 Outer

Greenplum , HAWQ outer join与motion问题讲解

Greenplum , HAWQ outer join与motion问题讲解 作者 digoal 日期 2016-09-05 标签 PostgreSQL , HAWQ , Greenplum , OUTER JOIN , Motion 背景 Greenplum,HAWQ是分布式的数据库,在建表时,我们可以选择分布列,或者选择随机分布. 多个表做等值JOIN时,如果JOIN列为分布列,则不需要进行数据的重分布. 但是,如果使用的是OUTER JOIN,情况就不一样了,你可能会发现多个表进行oute

PostgreSQL Oracle 兼容性之 - Partition By Outer Join实现稠化报表

标签 PostgreSQL , Oracle , 稠化报表 , partition by outer join 背景 背景介绍:借用Oracle的一篇例子: http://blog.sina.com.cn/s/blog_4cef5c7b01016lm5.html 在数据库表中,存储的数据经常是稀疏数据(sparse data),而不是稠密数据(dense data). 先来了解一下什么是稀疏数据,比如一个产品销售情况表(比如有产品名.销售时间(精确到年月).销售量3个列),假设某个时间某些产品它

SQL Server 2008 R2——使用FULL OUTER JOIN实现多表信息汇总

原文:SQL Server 2008 R2--使用FULL OUTER JOIN实现多表信息汇总 =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的"联系邮箱(wlsandwho@foxmail.com)"联系我 勿用于学术性引用. 勿用于商业出版.商业印刷.商业引用以及其他商业用途.       本文不定期修正完善. 本文链接:http://w

sql server Right Outer Join用法

Right Outer Join 运算符返回满足第二个(底端)输入与第一个(顶端)输入的每个匹配行的联接的每行.此外,它还返回第二个输入中在第一个输入中没有匹配行的任何行,即与 NULL 联接.如果 Argument 列内不存在任何联接谓词,则每行都是一个匹配行. 一.联接( join) 通过联接,可以根据各个表之间的逻辑关系从两个或多个表中检索数据.联接表示应如何使用一个表中的数据来选择另一个表中的行. 联接条件通过以下方法定义两个表在查询中的关联方式: 指定每个表中要用于联接的列.典型的联接

SQL Server-聚焦NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL性能分析(十八)

前言 本节我们来综合比较NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL的性能,简短的内容,深入的理解,Always to review the basics. NOT IN.NOT EXISTS.LEFT JOIN...IS NULL性能分析 我们首先创建测试表 USE TSQL2012 GO CREATE SCHEMA [compare] CREATE TABLE [compare].t_left ( id INT NOT NULL PRIMARY KE

HTAP数据库 PostgreSQL 场景与性能测试之 4 - (OLAP) 大表OUTER JOIN统计查询

标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关系数据库的鼻祖Michael_Stonebraker 操刀设计,PostgreSQL具备与Oracle类似的功能.性能.架构以及稳定性. PostgreSQL社区的贡献者众多,来自全球各个行业,历经数年,PostgreSQL 每年发布一个大版本,以持久的生命力和稳定性著称. 2017年10月,Pos

[20120223]full outer join.txt

full outer join 也就是包括左连接以及右连接,然后去除重复的记录.11g改进了算法,演示如下: SQL> select * from v$version;BANNER--------------------------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionPL/S

hive left outer join的问题

最近BA用户反馈有两句看似很像的语句返回的结果数不一样,比较奇怪,怀疑是不是Hive的Bug Query 1 返回结果数6071 select count(distinct reviewid) as dis_reviewcnt from (select a.reviewid from bi.dpods_dp_reviewreport a left outer join bi.dpods_dp_reviewlog b on a.reviewid=b.reviewid and b.hp_statda