SQL语句inner join 与left join的区别

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

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

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

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

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

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

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

写出来也就是下面的SQL:

SELECTp.*,MIN(s.price) as priceFROMhc_product pINNER 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。

SELECTp.*,MIN(s.price) as priceFROMhc_product pLEFT 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没顾上做,过几天,我会附上图的。

纵然走过那么多城市,对于未知的风景,还是好奇。

SQL语句inner join 与left join的区别

相关文章:

你感兴趣的文章:

标签云: