作者在 2011-05-30 15:07:26 发布以下内容
使用表间连接可以返回多个表中的记录:当从多个表中检索记录时,SQL语句的工作方式是:每个表中的一条记录都与其他表的所有记录搭配生成新记录,组成结果集。如:SELECT * FROM [A],[B],这样的话,返回的结果集相当庞大,是多个表记录数的乘积,比如表A有3条记录,表B有4条记录,表C有2条记录,那么SELECT * FROM A,B,C的结果就有3×4×2=24条记录,且每条记录都包含原三个表的所有字段,因此,我们通常用WHERE来限定一些条件,以只返回多表中合适的记录搭配,有一种比WHERE更好的办法,它可以满足我们更多需要,即采用表链接返回记录集。用JOIN关健字,语法:
例如:SELECT 多个字段 FROM 表1 链接方式 JOIN 表2 ON 表1.字段1=表2.字段2
eg:SELECT a1.name,a2.email FROM a1 INNER JOIN a2 ON a1.ID=a2.ID
在FROM子句中指明JOIN连接方式并用ON来指定条件。链接方式有INNER和LEFT、RIGHT三种,以下介绍具体操作:
例如:SELECT 多个字段 FROM 表1 链接方式 JOIN 表2 ON 表1.字段1=表2.字段2
eg:SELECT a1.name,a2.email FROM a1 INNER JOIN a2 ON a1.ID=a2.ID
在FROM子句中指明JOIN连接方式并用ON来指定条件。链接方式有INNER和LEFT、RIGHT三种,以下介绍具体操作:
首先创建表A(属性:a1,a2....)、表B (属性:b1,b2...), 且表A,表B的属性a1,b1的数据类型相同。
1.Inner——内连接查询
select A.a1,B.b1 from A Inner join B on A.a1=B.b1
其结果是:当两个字段的值相等时,就将两个表中的记录组合成一个新记录。
2.Right——右连接查询
select A.a1,B.b1 from A right join B on A.a1=B.b1
其结果是:返回右侧表中全部记录,返回左侧表中与条件匹配的记录。其结果是Inner Join的结果集+右侧表中的其他全部记录。
3.Left——左连接查询
select A.a1,B.b1 from A left join B on A.a1=B.b1
其结果是:返回左侧表中的所有记录,返回右侧表与条件匹配的记录。它的结果是:Inner Join的结果集+左侧表中未满足On条件而未筛选进入Inner Join的其余全部记录。
Left join 和Right join这两个关健字只要记一个就行了,因为把两个表的左右顺序换一下,就可以用同一个关健字达到两种效果。如:
select [A].[Name],[A].[Address],[B].[Money] from [A] left join [B ON [B].[Name]=[A].[Name]
select [A].[Name],[A].[Address],[B].[Money] from [A] left join [B ON [B].[Name]=[A].[Name]
等同于
select [A].[Name],[A].[Address],[B].[Money] from [B] right join [A] ON [B].[Name]=[A].[Name]
技巧:采用左链接或右链接时,其中一个表的所有记录都传到了结果集,它的一些记录值可能在另一个表中并没有关联记录(即匹配On条件的记录),这时由于多表记录总是自动进行搭配,每条结果记录都包含原多表所有字段,因此出现某些字段值为空NULL的情况,利用此特性倒是很容易找出哪些记录在另一个表中没有匹配的记录,有时具有实际意义,(如查找哪些个体户连一张发票都没交,)加个where检测结果集对应的原表字段是否为NULL就行了:
select [A].[Name],[A].[Address],[B].[Money] from [B] right join [A] ON [B].[Name]=[A].[Name] where[B].[Money] IS NULL
select [A].[Name],[A].[Address],[B].[Money] from [B] right join [A] ON [B].[Name]=[A].[Name]
技巧:采用左链接或右链接时,其中一个表的所有记录都传到了结果集,它的一些记录值可能在另一个表中并没有关联记录(即匹配On条件的记录),这时由于多表记录总是自动进行搭配,每条结果记录都包含原多表所有字段,因此出现某些字段值为空NULL的情况,利用此特性倒是很容易找出哪些记录在另一个表中没有匹配的记录,有时具有实际意义,(如查找哪些个体户连一张发票都没交,)加个where检测结果集对应的原表字段是否为NULL就行了:
select [A].[Name],[A].[Address],[B].[Money] from [B] right join [A] ON [B].[Name]=[A].[Name] where[B].[Money] IS NULL