关于SQLServer中leftjoinonand⽤法的介绍⼀般情况下,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'
sql left join 多表连接
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论