关于SQL Server中left join on and 用法的介绍

一般情况下,SQL语句的执行顺序如下所示:

(1)from

(2)on

(3)join

(4)where

(5)group by

(6)having

(7)select

(8)distinct

(9)union

(10)order by

从SQL语句执行顺序的这个角度,我们可以很好的理解left join on and的用法。

以SQL Server为例,先创建两个测试表ta和tb:

--创建测试表ta
create table ta(
ida int);

--向测试表ta中插入测试数据
insert into ta
values
(1),
(2),
(3),
(4);

--创建测试表tb
create table tb(
idb int,
state nvarchar(10)
);

--向测试表tb中插入测试数据
insert into tb
values
(1,'001'),
(2,'001'),
(3,'002'),
(4,'003');

比较on后有无and的查询结果:

--on后无and
select * from
ta left join tb
on ta.ida=tb.idb

--on后有and
select * from
ta left join tb
on ta.ida=tb.idb
and tb.state='001'

因为tb表中没有idb等于3且state为'001'的行,和idb等于4且state为'001'的行,所以ta表中ida等于3的行和ida等于4的行会匹配到两行NULL值。

下面,我们再创建一个测试表tc:

--创建测试表tc
create table tc(
idc int,
state nvarchar(10)
)

--向测试表tc中插入测试数据
insert into tc
values
(1,'001'),
(1,'002'),
(1,'003'),
(2,'002'),
(3,'001'),
(3,'002');

再次比较on后有无and的查询结果:

--on后无and
select * from
ta left join tc
on ta.ida=tc.idc

--on后有and
select * from
ta left join tc
on ta.ida=tc.idc
and tc.state='001'

如果ta表和tc表是一对多的关系,即ta表中的一行可能对应着tc表的多行,此时left join on后的and可以对tc表中满足on条件匹配的行做进一步的筛选。但由于是左连接,所以当on条件和and条件不能同时满足时,ta表中的行会匹配到列值全为NULL的行,如上述查询结果中,ta表ida等于2的行。

如果我们不想让ta表中的行匹配到NULL值行,可以使用where子句,或者将left join换成inner join:

使用where子句:where子句是对ta表和tc表left join后的结果做进一步的筛选

select * from
ta left join tc
on ta.ida=tc.idc
where tc.state='001'

使用inner join:inner join on 后的and是对tc表中满足on条件的行做进一步的筛选,然后ta表再与筛选结果进行inner join

select * from
ta inner join tc
on ta.ida=tc.idc
and tc.state='001'

  • 8
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值