http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 11882|回复: 7

[Sql系列教程] inner join on, left join on, right join on

[复制链接]
发表于 2012-7-8 08:50:51 | 显示全部楼层 |阅读模式
导读部分
-------------------------------------------------------------------------------------------------------------
SQL Server 2005 学习笔记系列文章
http://www.sufeinet.com/thread-26-1-1.html

希望大家通过我的文章能对链接表有一个全新的认识
主要说的三个多表链接查询的方法有如下三种
[code=sql]inner join on, left join on, right join on[/code]

接下来我一个一个的给大家介绍
1.inner join on
只要两个表的公共字段有匹配值,就将这两个表中的记录组合起来。以一个共同的字段求两个表中符合要求的交集,并将每个表符合要求的记录以共同的字段为
准合并起来。其实就是取他们的交集
语法如下提示
[SQL] 纯文本查看 复制代码
FROM table1 INNER JOIN table2 ON table1 . field1 compopr table2 . field2


INNER JOIN 操作包含以下部分:
部分 说明
假如我们有 table1, table2 两张表。
field1,field2 要联接的字段的名称。如果它们不是数字,则这些字段的数据类型必须相同,并且包含同类数据,但是,它们不必具有相同的名称。

compopr
任何关系比较运算符:“=”、“<”、“>”、“<=”、“>=”或者“<>”。
说明
可以在任何 FROM 子句中使用 INNER JOIN 操作。这是最常用的联接类型。只要两个表的公共字段上存在相匹配的值,Inner 联接就会组合这些表中的记录。
可以将 INNER JOIN 用于 Departments 及 Employees 表,以选择出每个部门的所有雇员。而要选择所有部分(即使某些部门中并没有被分配雇员)或者所有雇员(即使某些雇员没有分配到任何部门),则可以通过 LEFT JOIN 或者 RIGHT JOIN 操作来创建外部联接。
如果试图联接包含备注或 OLE 对象数据的字段,将发生错误。
可以联接任何两个相似类型的数字字段。例如,可以联接自动编号和长整型字段,因为它们均是相似类型。然而,不能联接单精度型和双精度型类型字段。
下例展示了如何通过 CategoryID 字段联接 Categories 和 Products 表:
[SQL] 纯文本查看 复制代码
SELECT CategoryName, ProductName

FROM Categories INNER JOIN Products

ON Categories.CategoryID = Products.CategoryID;

在前面的示例中,CategoryID 是被联接字段,但是它不包含在查询输出中,因为它不包含在 SELECT 语句中。若要包含被联接字段,请在 SELECT 语句中包含该字段名,在本例中是指 Categories.CategoryID。
也可以在 JOIN 语句中链接多个 ON 子句,请使用如下语法:
[SQL] 纯文本查看 复制代码
SELECT fields
FROM table1 INNER JOIN table2
ON table1.field1 compopr table2.field1 AND
ON table1.field2 compopr table2.field2) OR
ON table1.field3 compopr table2.field3)];[/code]
也可以通过如下语法嵌套 JOIN 语句:
[code=sql]SELECT fields
FROM table1 INNER JOIN
(table2 INNER JOIN [( ]table3
[INNER JOIN [( ]tablex [INNER JOIN ...)] 
ON table3.field3 compopr tablex.fieldx)]
ON table2.field2 compopr table3.field3) 
ON table1.field1 compopr table2.field2;


LEFT JOIN 或 RIGHT JOIN 可以嵌套在 INNER JOIN 之中,但是 INNER JOIN 不能嵌套于 LEFT JOIN 或 RIGHT JOIN 之中。
2.操作实例
[C#] 纯文本查看 复制代码
表A记录如下:
aID aNum
1 a20050111
2 a20050112
3 a20050113
4 a20050114
5 a20050115
表B记录如下:
bID bName
1 2006032401
2 2006032402
3 2006032403
4 2006032404
8 2006032408


实验如下:
1.left join
sql语句如下:
[SQL] 纯文本查看 复制代码
select * from A
left join B 
on A.aID = B.bID


结果如下:
[C#] 纯文本查看 复制代码
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
5 a20050115 NULL NULL

(所影响的行数为 5 行)
结果说明:
eft join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).B表记录不足的地方均为NULL.
2.right join
sql语句如下:
[SQL] 纯文本查看 复制代码
select * from A
right join B 
on A.aID = B.bID

结果如下:
[C#] 纯文本查看 复制代码
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
NULL NULL 8 2006032408

(所影响的行数为 5 行)
结果说明:
仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.

3.inner join
sql语句如下:
[SQL] 纯文本查看 复制代码
select * from A
innerjoin B 
on A.aID = B.bID


结果如下:
[C#] 纯文本查看 复制代码
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404

结果说明:
很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.
最后来一起总结一下吧
1.inner join on 就是说两个表中都有相关数据时才显示出来
2. left join on 左表中数据全部显示,右表根据条件显示
3. right join on 右表全部显示,左表根据条件显示
不知道大家对多表链接有没有一个新的认识。

本帖被以下淘专辑推荐:



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2012-10-10 18:29:43 | 显示全部楼层
欢迎大家多提建议
发表于 2013-9-6 03:59:39 | 显示全部楼层
顶你一下吧
发表于 2013-10-16 17:21:39 | 显示全部楼层
   赞一个!
发表于 2015-4-13 17:18:21 | 显示全部楼层
受教了学习中……
发表于 2015-7-24 15:31:46 | 显示全部楼层
再次复习了一下
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-24 13:18

© 2014-2021

快速回复 返回顶部 返回列表