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
投稿

猜你喜欢

  • 小议sqlserver数据库主键选取策略

    2011-10-24 19:51:30
  • Sql Server 2012 转换函数的比较(Cast、Convert和Parse)

    2012-08-21 10:21:40
  • ASP在服务器自动解压RAR文件

    2010-04-24 16:06:00
  • 实例学习call、apply、callee用法

    2009-03-27 17:56:00
  • asp如何利用当前时间生成随机函数?

    2010-01-01 15:44:00
  • 使用Dreamweaver代码片断提高css开发效率

    2007-10-28 15:46:00
  • Z-Blog垃圾留言判定新方法

    2009-07-06 13:04:00
  • Asp+ajax打造无刷新新闻评论系统

    2008-02-12 15:43:00
  • MySQL配置文件my.cnf中文版

    2011-09-30 11:06:15
  • ASP中页面限权访问的几种方法

    2007-12-13 06:53:00
  • 解析SQL server与asp 互操作的时间处理

    2009-02-05 16:13:00
  • 如何在页面错误时向数据库中添加记录?

    2010-06-26 12:26:00
  • HTML5本地存储初探(一)

    2010-03-07 15:42:00
  • RS.GETROWS使用详解

    2008-01-16 13:21:00
  • sqlserver isnull在数据库查询中的应用

    2011-12-01 10:30:25
  • QCon大会散记

    2010-05-03 14:19:00
  • 一个简单的鼠标划过切换效果js源码

    2010-06-21 10:55:00
  • CODEPAGE=936是什么意思?

    2009-07-05 18:37:00
  • SQL Server数据库动态交叉表的参考示例

    2009-01-04 14:44:00
  • jquery中文手册上的一点错误--说说p标签失去焦点

    2009-09-13 21:24:00
  • asp之家 网络编程 m.aspxhome.com