SQL的Join使用图解教程

来源:asp之家 时间:2012-08-21 10:47:23 

对于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 NinjaInner join
产生的结果集中,是A和B的交集。

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 VaderFull outer join 产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。


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 nullLeft outer join 产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。

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表中没有的集合。

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表都没有出现的数据集。

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

代码如下:


SELECT * FROM TableA
CROSS JOIN TableB


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

标签:SQL,Join
0
投稿

猜你喜欢

  • Debugging JavaScript:throw与console

    2008-08-29 17:03:00
  • 在Python中处理字符串之isdecimal()方法的使用

    2021-03-18 04:25:18
  • Python3 执行系统命令并获取实时回显功能

    2023-12-06 13:23:10
  • 教你使用Python画圣诞树做浪漫的程序员

    2023-03-19 21:39:02
  • 快速解决SQL server 2005孤立用户问题

    2009-01-04 14:02:00
  • python下对hsv颜色空间进行量化操作

    2022-11-22 01:56:12
  • pandas统计重复值次数的方法实现

    2022-11-09 03:27:58
  • golang中实现graphql请求的方法

    2024-02-19 16:21:18
  • Python pyecharts实时画图自定义可视化经纬度热力图

    2023-12-24 10:14:21
  • Python中print和return的作用及区别解析

    2023-11-27 10:54:44
  • 再谈CSS样式表书写风格

    2009-03-30 16:09:00
  • 解决tensorflow模型参数保存和加载的问题

    2022-07-19 17:44:00
  • FrontPage2002简明教程四:网页超级链接

    2008-09-17 11:23:00
  • PHP基于phpqrcode类生成二维码的方法详解

    2023-06-12 17:20:38
  • Python中最大最小赋值小技巧(分享)

    2021-08-26 06:07:44
  • 浅谈PL/SQL批处理语句:BULK COLLECT与FORALL对优化做出的贡献

    2024-01-14 01:04:27
  • VS CODE 使用SVN插件的方法步骤

    2023-05-22 10:39:33
  • python字符串,数值计算

    2022-12-28 11:20:32
  • MYSQL的DATE_FORMAT()格式化日期

    2009-02-27 16:04:00
  • 一文读懂python Scrapy爬虫框架

    2021-01-31 10:08:31
  • asp之家 网络编程 m.aspxhome.com