2016-1-17 博客文章增加了markdown格式,由MD标记

2015-12-15 00:27:08

一直对inner join有误解,表A inner join 表B 简单的认为就是A与B的交集。

网上大部分讲解inner join,left join,right join 区别的例子见下面链接:

http://www.jb51.net/article/15386.htm,更是加深了我的误解。


理解join首先从笛卡尔积开始。

例如两个订单商品表,一个是下单记录表,一个是出库扫描记录表(1个订单对应多个商品)

A表:

order_id
product_id
product_name

B表:

order_id
product_id
is_scan

B表只是A表的一部分,我现在要显示B表,但同时要抓取A表中的产品名称等信息。

一开始写成如下:

select * from B inner join A on B.order_id = A.order_id

最终获得一大堆重复记录,原因就在于on条件。


链接中的on条件栏位都是primary key,所以没问题。如果从笛卡尔积来理解,就很容易理解为何结果又重复记录啦。

B表中每一个order_id在A表中都有n个记录(假设该订单有n个产品)符合要求,总的符合要求记录数就是B表order_id的记录数m*n。

select * from B inner join A on B.order_id = A.order_id AND B.product_id = A.order_id

这样On条件确定了唯一记录,结果就是我想要的了。


总结:

1.join最本质的思想就是笛卡尔积。

2.ON条件能确定唯一记录,join结果才不至于有重复记录。

  • 154