LEFT JOIN ON中加条件与在where中加条件的区别,高手请进来

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LEFT JOIN ON中加条件与在where中加条件的区别,高手请进来相关的知识,希望对你有一定的参考价值。

select a.ipkey,
a.ln_no,
a.cif_no,
a.Pay_Cat
from a
LEFT JOIN b
ON a.IPKEY=b.LNMLMS100_IPKEY
-- and b.PAY_CAT='P'(1)(已注释)
WHERE a.DEL_IND=0
and b.PAY_CAT='P'(2)
为什么他们2个出来的结果记录数量不相同?

where 是两个表中的数据满足共同条件才会显示。
on 相同条件匹配。

因此结果肯定不一样。on显示的内容>=where条件显示的内容
参考技术A (1)LEFT JOIN 它是以第一个表里的栏位为基准 第二个表里没有的会显示空
(2)它是显示全部的 符合条件的本回答被提问者采纳

left join on和where

left join on:

向左关联某个表记录,意思是以左边的表记录为基准,通过关联条件会从左表返回所有的行,即使在右表中没有匹配的行。

举个例子:

select * from A left join B on A.id=B.id

说明:从A表左外联接B表,基于A.id=B.id

 

和where的区别:

1.on条件是生成临时表的条件,不管on中的条件是否成真,都会返回左边表中的记录(为null显示)。

2.where条件是建立在临时表生成好基础上再对临时表过滤的条件,已经没有left join的含义(必须返回左边表的记录),条件不符合就全部过滤。

 

假设两张表,

表1-tab1:     表2-tab2:

id name       name class

1  10        10  AA

2  20        20  BB

3  30        20  CC

 

SQL语句:

1.select * from tab1 left join tab2 on (tab1.name=tab2.name) where tab2.class=\'AA\'

2.select * from tab1 left join tab2 on (tab1.name=tab2.name and tab2.class=\'AA\')

SQL1结果:

1.on的条件为tab1.name=tab2.name,以tab1表为基准,返回所有的值

tab1.id  tab1.name  tab2.name  tab2.class

1       10       10       AA

2       20       20       BB

2       20       20       CC

3       30       NULL     NULL 

2.WHERE后的条件tab2.class=\'AA\',查询结果为

tab1.id  tab1.name  tab2.name  tab2.class

1       10       10       AA

SQL2结果:

on的条件为tab1.name=tab2.name and tab2.class=\'AA\',以tab1表为基准返回所有的值

tab1.id  tab1.name  tab2.name  tab2.class

1       10       10       AA

2       20      NULL     NULL

3       30      NULL      NULL 

 

比较以下sql区别:

查询有课程成绩小于60分的同学的学号、姓名,

 

--以student_id分组:

SELECT student_id,sname FROM test_score s,test_student t WHERE s.num<\'60\' AND s.student_id=t.sid GROUP BY student_id;

--按student_id去重:

SELECT DISTINCT student_id,sname FROM test_score s,test_student t WHERE s.num<\'60\' AND s.student_id=t.sid;

--以left join左连接

SELECT DISTINCT student_id,sname FROM test_student t LEFT JOIN test_score s ON s.student_id=t.sid WHERE s.num<\'60\';

以上是关于LEFT JOIN ON中加条件与在where中加条件的区别,高手请进来的主要内容,如果未能解决你的问题,请参考以下文章

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

Oracle的left join中on和where的区别

left join on +多条件与where区别

Oracle的left join中on和where的区别

为啥以及何时在 WHERE 子句中带有条件的 LEFT JOIN 不等于在 ON 中的相同 LEFT JOIN? [复制]

mysql left join中where和on条件的区别