sql 左连接(left join),右链接(right join) 条件放在on和放在where 的区别
2012-10-15 20:41
531 查看
sql 左连接(left join),右链接(right join) 条件放在on和放在where 的区别,到底区别在哪呢?
我们来做一个测试,现在我们有两个表,产品表(Product) 销售表(Sales),
现在我们要统计某一个产品的销售数量,并且外加一个条件是类型等一个特殊的类型。
--产品表
Create table #Product(
ID int identity(1,1), --产品ID
Name varchar(50), --产品名称
PdType char(2) --产品类型
)
--销售表
Create table #Sales(
Product_ID int,--产品ID
Name varchar(50),--销售名称
Qty int--销售数量
)
--添加数据
Insert into #Product(Name,PdType)
values('product1','01')
Go
Insert into #Product(Name,PdType)
values('product2','01')
Go
Insert into #Product(Name,PdType)
values('product3','01')
Go
Insert into #Product(Name,PdType)
values('product4','02')
Go
Insert into #Product(Name,PdType)
values('product5','02')
Insert into #Sales(Product_ID,Name,Qty)
values(1,'PO-01',1)
go
Insert into #Sales(Product_ID,Name,Qty)
values(1,'PO-02',1)
go
Insert into #Sales(Product_ID,Name,Qty)
values(1,'PO-03',1)
--条件放在on后面
Select A.Name,isnull(sum(B.qty),0) as AllQty
from #Product A left join #Sales B on A.ID=B.Product_ID and PdType='02'
where A.ID=1
group by A.Name
--结果
Name AllQty
product10
--条件放在where 后面
Select A.Name,isnull(sum(B.qty),0) as AllQty
from #Product A left join #Sales B on A.ID=B.Product_ID
where A.ID=1 and PdType='02'
group by A.Name
--结果
Name AllQty
找不到数据,这个并不是我们想要的结果,我们要的结果是上面的那种,没有销售,至少要告诉我们这个产品是存在的,只是没有销售而已,但后面一种就直接产品都没有了。
总结:
看到这里应该明白其中的区别,如果条件放在on后面,代表这个条件参加了join运算,这时候产品关联的数量是null,但是产品是有的。
放在where条件后面,如果join有值,但是条件不满足就会过滤掉。
所有以后大家写left join 或 right join ,就要主要了,内连接没有这个问题。
如需转载请注明本文出处:http://www.cf17.com/html/article/62.html ,谢谢。
在http://www.cf17.com 中的技术文档中有我平时总结的一些经验,并在逐步更新中,也欢迎到这里来交流。
我们来做一个测试,现在我们有两个表,产品表(Product) 销售表(Sales),
现在我们要统计某一个产品的销售数量,并且外加一个条件是类型等一个特殊的类型。
--产品表
Create table #Product(
ID int identity(1,1), --产品ID
Name varchar(50), --产品名称
PdType char(2) --产品类型
)
--销售表
Create table #Sales(
Product_ID int,--产品ID
Name varchar(50),--销售名称
Qty int--销售数量
)
--添加数据
Insert into #Product(Name,PdType)
values('product1','01')
Go
Insert into #Product(Name,PdType)
values('product2','01')
Go
Insert into #Product(Name,PdType)
values('product3','01')
Go
Insert into #Product(Name,PdType)
values('product4','02')
Go
Insert into #Product(Name,PdType)
values('product5','02')
Insert into #Sales(Product_ID,Name,Qty)
values(1,'PO-01',1)
go
Insert into #Sales(Product_ID,Name,Qty)
values(1,'PO-02',1)
go
Insert into #Sales(Product_ID,Name,Qty)
values(1,'PO-03',1)
--条件放在on后面
Select A.Name,isnull(sum(B.qty),0) as AllQty
from #Product A left join #Sales B on A.ID=B.Product_ID and PdType='02'
where A.ID=1
group by A.Name
--结果
Name AllQty
product10
--条件放在where 后面
Select A.Name,isnull(sum(B.qty),0) as AllQty
from #Product A left join #Sales B on A.ID=B.Product_ID
where A.ID=1 and PdType='02'
group by A.Name
--结果
Name AllQty
找不到数据,这个并不是我们想要的结果,我们要的结果是上面的那种,没有销售,至少要告诉我们这个产品是存在的,只是没有销售而已,但后面一种就直接产品都没有了。
总结:
看到这里应该明白其中的区别,如果条件放在on后面,代表这个条件参加了join运算,这时候产品关联的数量是null,但是产品是有的。
放在where条件后面,如果join有值,但是条件不满足就会过滤掉。
所有以后大家写left join 或 right join ,就要主要了,内连接没有这个问题。
如需转载请注明本文出处:http://www.cf17.com/html/article/62.html ,谢谢。
在http://www.cf17.com 中的技术文档中有我平时总结的一些经验,并在逐步更新中,也欢迎到这里来交流。
相关文章推荐
- SQL 查询条件放在LEFT OUTER JOIN 的ON语句后与放在WHERE中的区别
- 多表连接时条件放在 on 与 where 后面的区别
- sql中的left join及on、where条件关键字的区别详解
- MYSQL联表查询LEFT JOIN 中 WHERE条件放在ON条件里和外部的区别
- 外连接 ON 条件的三个作用 SQL中on条件与where条件的区别
- SQL中条件放在on后与where后的区别
- SQL:外连接on条件与where条件的区别
- SQL中过滤条件放在on和where中的区别
- 外连接 ON 条件的三个作用 SQL中on条件与where条件的区别
- 转:SQL:外连接on条件与where条件的区别
- oracle数据库sql语句left join,right join,inner join的条件on和where的区别
- 外连接 ON 条件的三个作用 SQL中on条件与where条件的区别
- SQL 查询条件放在LEFT OUTER JOIN 的ON语句后与放在WHERE中的区别
- SQL中条件放在on后与where后的区别
- SQL_left join中on和where条件的区别
- SQL:外连接on条件与where条件的区别
- 转:SQL:外连接on条件与where条件的区别
- 数据库左连接left join、右连接right join、内连接inner join on 及 where条件查询的区别
- sql 条件加在 left join 与where后面的区别
- sql语句中left join、inner join中的on与where的区别