SQL语句inner join 与left join的区别

项目需求变更,之前写的一条查询SQL,需要修改一下,恶心了半天也没改好,最后想来想去,拼来拼去(拼接SQL),原来直接把inner join改成left join就OK了。

写完之后那个感慨呀!真是为有源头活水来啊,什么最好的编程习惯就是想好之后再动手,大道至简,大爱无边……


苦逼之后,还是要出来分享经历的。


简而言之,需求大概是这样:

产品都是分期卖的,当然,产品都会有生效、失效,一个产品对应多个库存,一个库存对应到具体一天,每一个库存都会对应一个价格。要求显示所有库存中价格最低的产品。

开始,需求是销售完的产品就不显示了。

                                技术分享


乍一看,你一定觉得这很简单啊,inner join 库存表后,group by一下产品编号就OK了。可是你有没有想过,这样查询来的价格与库存是不准确的。产品与库存的关系是一对多,只能group by 产品编号,而最低价格和库存量没办法同时对应的(可以度娘Group By的用法)。

写出来也就是下面的SQL:

SELECT
		p.*,MIN(s.price) as price
		FROM
		hc_product p
		INNER JOIN hc_stock s ON p.productId=s.productId AND s.stockNum>0 and s.effectDay>NOW()

group by p.productId


现在需求改了,需要将库存为空的产品也显示出来,并标注上“该产品已售完”。思路如下:

我以产品表为主表,查询库存量大于零的在有效期内的产品,而与库存表之间是左连接,这时就能够查询上来数量为空的产品,库存字段不是0,而是null,然后以产品编号进行分组,按照上面的条件,就能够查询上来所有的产品,库存为0的产品,库存量即为null。

SELECT
		p.*,MIN(s.price) as price
		FROM
		hc_product p
		LEFT JOIN hc_stock s ON p.productId=s.productId AND s.stockNum>0 and s.effectDay>NOW()

group by p.productId


PS1:查询条件有效期和产品数量,要写在连接查询后面,也就是ON后面。这样写,能够将过期的、但是未失效的产品,查询上来。也就是能够查询上来所有的产品(产品不分库存,只要有该产品,都能查询上来)。如果条件写在where后面,那么过期的产品将过滤调,不再查询上来。


PS2:inner Join就简单多了,它会查询上来两个表的条件都满足的记录。


PS3:过期的产品有产品表中的属性“是否有效”统一控制。


查询结果没有附图,大家看的可能不是很清晰,年底了项目一直处于紧绷的状态。DEMO没顾上做,过几天,我会附上图的。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。