对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对 于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章,通过韦恩图(Venn diagram,可用来表示多个集合之间的逻辑关系)。解释了SQL的Join。我觉得清楚易懂,转过来。

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

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

1.INNER JOIN

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

结果集
(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.) (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
结果集
(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.) (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 并不相同,不合并
还需要注册的是我们还有一个是“交差集” cross join, 这种Join没有办法用文式图表示,因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。表达式如下:SELECT * FROM TableA CROSS JOIN TableB
这个笛卡尔乘积会产生 4 x 4 = 16 条记录,一般来说,我们很少用到这个语法。但是我们得小心,如果不是使用嵌套的select语句,一般系统都会产生笛卡尔乘积然再做过滤。这是对于性能来说是非常危险的,尤其是表很大的时候。

如果有where的时候,可以使用:

SELECT column_list
FROM t1
INNER JOIN t2 ON join_condition1
INNER JOIN t3 ON join_condition2
...
WHERE where_conditions;

更多参考:

PHP5: mysqli 插入, 查询, 更新和删除 Insert Update Delete Using mysqli (CRUD)

MySQL: 获取表结构 Get a MySQL table structure with DESCRIBE

关于 MySQL LEFT JOIN 你可能需要了解的三点

MySQL 临时表

本文转自: Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别

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

  1. oracle full outer join,oracle 内连接(inner join)、外连接(outer join)、全连接(full join)...

    建表语句: create table EMPLOYEE ( EID NUMBER, DEPTID NUMBER, ENAME VARCHAR2(200) ) create table DEPT ( D ...

  2. 图解SQL的inner join(join)、left join、right join、full outer join、union、union all的区别...

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...

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

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...

  4. Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对 于Select出来的结果集是什么样子有点不是很清楚.Codi ...

  5. full outer join 与full join的区别_基础小白的SQL的JOIN语法解析

    总的来说,四种JOIN的使用/区别可以描述为: left join 会从左表(shop)那里返回所有的记录,即使在右表(sale_detail)中没有匹配的行. right outer join 右连 ...

  6. SQL中的left outer join,inner join,right outer join用法 (左右内连接)

    SQL语句中的left outer join,inner join,right outer join用法 left outer join=left join ,   right outer join= ...

  7. SQL OUTER JOIN概述和示例

    This article will provide a full overview, with examples of the SQL Outer join, including the full, ...

  8. 干货 | SQL 外部联接 Outer Join

    外部联接(Outer Join)是所有 SQL 联接类型中最不为人知的.也许是因为与其他联接类型相比,外部联接的需求较少.无论如何,外部联接本身并没有什么奇特的.正如我们将在这篇文章中看到的几个外部联 ...

  9. SQL外部联合:right outer join、left outer join、full outer join

    SQL将外部联合分为了右外部联合(right outer join).左外部联合(left outer join).完全外部联合(full outer join)3个类型. 左外部联合:LEFT OU ...

最新文章

  1. android progressbar 不显示_Android多线程技术选型最全指南(1)
  2. Ionic 标签中添加单击事件 、双击事件
  3. 动态内存的基本功能和使用
  4. cocos2d - CCSprite各种动画
  5. Unix环境高级编程学习笔记(七) 多线程
  6. 程序员面试金典 - 面试题 16.21. 交换和(哈希set)
  7. kettle连接mysql教程_kettle 连接 mysql8
  8. mysql5.7.24 rpm安装_centos7下安装mysql5.7.24
  9. stm32代码_ME3616 NB-IoT模组对接OneNET教程以及STM32代码
  10. python 位运算符与逻辑运算符(字符串的逻辑运算)
  11. adc0808模数转换实验报告_adc0808模数转换电路图及程序
  12. 测试用例设计之正交试验
  13. 实验五 IP协议分析实验
  14. 【Web】CSS(No.21)Css经典案例(三)《爱宠知识》
  15. [SSL_CHX][2021-8-19]数根
  16. 苹果MAC电脑双系统教程——MAC安装Windows双系统教程
  17. 金融python入门书籍推荐_学习金融工程,有哪些推荐的入门书籍?
  18. Python3+scrapy 爬取喜马拉雅音乐 音乐和歌名 最简单的爬虫
  19. Windows7 x64 瑞昱Realtek高清音频管理器均衡器用户定义文件 保存位置
  20. spring的task和quartz的区别

热门文章

  1. 信息学奥赛C++语言:短信计费
  2. 信息学奥赛一本通C++语言——1054:三角形判断
  3. 怎么锁定计算机密码忘了怎么办,如果忘记了手机数字锁的密码(仅需10秒钟即可解锁),该怎么办...
  4. java定时器异常,定时任务异常 高手进
  5. OpenCV稀疏矩阵SparseMat
  6. 全连接层的作用是什么?
  7. np.unique( )--去除数组中的重复数字,并进行排序之后输出
  8. Bootstrap-CSS-按钮-图片-辅助类-响应式
  9. phpcmsV9导航栏目点击跳转始终是localhost首页 bug - 分析篇
  10. 自适应粉色可爱棒棒糖倒立404错误页面源码