id amount
1 100
2 200
3 300
4 400

表2:product_details

id weight exist
2 22 0
4 44 1
5 55 0
6 66 1

1. 单个条件

select * from product a
left join  product_details b
on a.id  = b.id

以左表为准匹配,结果:

idamountidweightexist
1100nullnullnull
22002220
3300nullnullnull
44004441

2. 条件写在on 与where区别

SELECT * FROM product LEFT JOIN product_details
ON (product.id = product_details.id)
AND   product.amount=200;
idamountidweightexist
1100nullnullnull
22002220
3300nullnullnull
4400nullnullnull

把on的所有条件作为匹配条件,不符合的右表都为null。
查询2:

SELECT * FROM product LEFT JOIN product_details
ON (product.id = product_details.id)
WHERE product.amount=200;
idamountidweightexist
22002220

匹配完再筛选,结果只有一条记录。

3. where XXX is null 情况

使用该语句表示:删除掉不匹配on后面条件的记录。
where XXX is not null 则表示筛选出符合on后面条件的记录。
常用于只需要左表的数据,比如count id这类。

SELECT a.* FROM product a LEFT JOIN product_details b
ON a.id=b.id AND b.weight!=44 AND b.exist=0
WHERE b.id IS NULL;
idamount
1100
3300
4400

可以直观看出,只有id=2的纪录完全匹配上三个条件,所以筛除这条纪录,另三条保留,此时这三条纪录的右表均为null。
筛选出不符合on后面条件的,即 !(
a.id=b.id AND b.weight!=44 AND b.exist=0).
!(a.id=b.id AND || !(b.weight!=44) || !(b.exist=0).
(a.id != b.id AND || (b.weight = 44) || ( b.exist! = 0).
逻辑 AND 和 逻辑 OR表达式,其操作数是从左到右求值的。如果第一个参数做够判断操作结果,那么第二个参数便不会被计算求值(短路效果)。

下面语句与该语句效果相同:(这里相同指的是最后只用到左表数据,若是将右表数据写出来是不一样的)

SELECT a.* FROM product a LEFT JOIN product_details b
ON a.id=b.id
WHERE b.id is null OR b.weight=44 OR b.exist=1;

将on的否定条件写在where后,效果相同。

注:
如果你使用 LEFT JOIN 来寻找在一些表中不存在的记录,你需要做下面的测试:WHERE 部分的 col_name IS NULL,MYSQL 在查询到一条匹配 LEFT JOIN 条件后将停止搜索更多行(在一个特定的组合键下)。

参考:https://blog.csdn.net/czhphp/article/details/18657341

left join on +多条件与where区别重点先匹配,再筛选where条件。本文将通过几个例子说明两者的差别。表1:product id amount 1 100 2 200 3 300 4 400表2:product_details id weight exist... LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name 注释:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN。 创建两张表并插入一些数据 create table class( class_id int, class_n 左连接,on后面跟了2个条件,其中第二个条件对左表进行刷选,可以看到在结果中并没有起作用。因为on的条件筛选是对2张表生成的全连接(笛卡尔积)临时表进行的筛选,这时a.id=4的数据实际上是被去除掉了,因为没有a.id=4且a.id=b.id的数据。但是由于是left join,所以在结果中没有的左表数据a.id=4又被加了上去。 由此可见left join 的时候,on后面对左表的数据加筛选条件是没有用的。 左连接不管怎么样,左表都是完整返回的 当只有一个条件a.id=b.id的时候: 左连接就是相当于左边一条数据,匹配右边表的所有行,满足on后面的第一个条件a.id=b.id的进行返回 当有两个条件的时候a.id=b.id and a.age>100(当第二个条件进行左表筛选时) 就是左边这张表只有a.age>100的行,才会参与右表的每行匹配(但是a.age<100的行也会返回,只不过age<100的行是不可能匹配到 left join ( select case_id as sup_case_id , count(*) supervise_number from td_kcdc_case_sup_info group by case_id ) sup sup.sup_case_id = td.case_id where 把left join左边的表的记录全部找出来。系统会先用表A和表B做个笛卡儿积,然后以表A为基表,去掉笛卡儿积中表A部分为NULL的记录。最后形成你的结果。 进行左连接时,就有涉及到主表、辅表,这时主表条件写在WHERE之后,辅表条件写在ON后面。 1、表a结构和数据 table a(id, type): id type --------------...
在进行公司项目超猿的CRMPC端后台会员列表页面开发时,初始为了省事方便,直接使用全表查询,由于该功能项设计了三个表的数据,全表查询导致了查询速度过于长久,被测试人员驳回优化 当我在数据库进行查询的时候,发现查询时间也是达到了令人惊悚的5.5s 首先想到的就是通过explain来查看慢sql,针对性优化 由上可见,多个全表查询导致效率变得迟缓,经过网上查找,请教同事,决定用Left Join的语句来对表进行拼接,而不是全表查询。 Left Join俗称左连接,也就是吧left join左边的表的记录全
on a.id = b.id and a.code = b.code 有时候on出错的话,可以用cast on cast(a.id as varchar(40)) = cast(b.id as varchar(40))
SQL Server中的左连接(Left Join)是一种连接(Join)操作,它用于将两个表中的数据进行合并。左连接返回左表中的所有行和右表中与左表匹配的行,如果右表中没有匹配的行,左表中也会返回空值。 LEFT JOIN操作的语法如下: SELECT on的条件 FROM 左表 LEFT JOIN 右表 ON 左表.列名 = 右表.列名 其中,ON是连接条件,左表和右表是待连接的表。LEFT JOIN操作会将左表中符合连接条件的全部记录和右表中符合条件的记录进行合并输出。如果右表中没有符合条件的记录,则左表中对应的列会显示NULL值。 例如,我们有两张表:订单表(orders)和客户表(customers)。我们想要获取订单表中的所有记录,并将客户表中与订单表中的记录匹配的内容合并在一起。可以使用如下的LEFT JOIN语句: SELECT order_id, order_date, customers.customer_name FROM orders LEFT JOIN customers ON orders.customer_id = customers.customer_id; 在这个例子中,orders表是左表,customers表是右表。ON子句指定了两个表格之间的连接关系,连接的列是customer_id。LEFT JOIN操作会返回所有orders表中的记录,如果在customers表中没有相应的记录,则在customer_name列中显示NULL值。