oracle数据库中,left join后 where 的使用方法有哪些?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle数据库中,left join后 where 的使用方法有哪些?相关的知识,希望对你有一定的参考价值。

这分别是两个表 :

这是我执行的语句:
select z1.*,z3.bbb from z_whf_test1 z1 left join z_whf_test3 z3 on z1.aaa=z3.aaa where z3.bbb='4g';
select z1.*,z3.bbb from z_whf_test1 z1 left join z_whf_test3 z3 on z1.aaa=z3.aaa and z3.bbb='4g';
结果:

为什么结果会是不一样的 跪求解释!

sql左连接与left join是一个意思。
用数据举例比较容易理解:
如:表1中有数据
班级id 班级名称
1 一班
2 二班

表2:
学生id 学生姓名 所属班级id
1 张三 1
2 李四 1

如果查询每个班级总人数,不用左连接
select a.班级名称,sum(case when a.班级id=b.所属班级id then 1 else 0 end) 人数 from 表1 a,表2 b where a.班级id=b.所属班级id group by a.班级名称

此时结果:

班级名称 人数

一班 2

如果用左连接
select a.班级名称,sum(case when a.班级id=b.所属班级id then 1 else 0 end) 人数 from 表1 a left join 表2 b on a.班级id=b.所属班级id group by a.班级名称

此时结果:
班级名称 人数

一班 2
二班 0

所以左连接就是以左表为基准,来显示全部数据,而不用左连接则只显示能关联上的数据。
参考技术A 可以这样理解:on是在生成连接表时起作用的,where是生成连接表之后对连接表再进行过滤。
1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
使用left join时,无论on的条件是否满足,都会返回左表的所有记录,对于满足的条件的记录,两个表对应的记录会连接起来,对于不满足条件的记录,那右表字段全部是null。
参考技术B select z1.*,z3.bbb from z_whf_test1 z1 left join z_whf_test3 z3 on z1.aaa=z3.aaa where z3.bbb='4g';
这条sql是先把z1表和z3表进行左关联,然后在根据where条件进行删选,所以结果出来就只有三条。
select z1.*,z3.bbb from z_whf_test1 z1 left join z_whf_test3 z3 on z1.aaa=z3.aaa and z3.bbb='4g';
这条sql是两个表进行左关联的时候,先对z3表进行了过滤,就是说,是把z1和z3表过滤后的数据进行关联,所以就出现第二种这种查询结果了。追问

我可不可以这样理解, 就是where 后的条件是针对left join 后的结果,而第二个不是

追答

恩,是的

以上是关于oracle数据库中,left join后 where 的使用方法有哪些?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle的left join中on和where的区别

关于VF中select left(right) join的准确用法

深入Oracle的left join中on和where的区别详解

mysql的left join 和oracle有却别吗

Oracle的left join中on和where的区别

Oracle中 (+)与left join 的用法区别