深刻理解left join, right join, inner join

首先看三幅图:差别大了。我之前不太理解 left join, right join 区别。现在和大家一起理解一下。



我用的sql语句是这样的:

SELECT `order`. * , `pay`.id
FROM `order`
left JOIN `pay` ON pay.orderid = `order`.id
WHERE `order`.ordertime > UNIX_TIMESTAMP( ) -86400 *10
ORDER BY `order`.id DESC , `order`.shop ASC
LIMIT 40 , 20

order 表和 pay表是这样的:

pay 里面有一个字段叫orderid,这个是在生成order id的时候写入到pay的

我上面的left join语句,相当于是用 order表匹配pay表,并返回order表全部值。

这样的话所有的order都返回了。还要返回匹配的pay值。相当于order 是完整的再加上pay的匹配值。所以就用了3秒钟的时间。这里返回的值可不管你的where写了什么,和你limit写了几条。我的理解是这样。。

如果是用right join 的话是这样:

SELECT `order`. * , `pay`.id
FROM `order`
right JOIN `pay` ON pay.orderid = `order`.id
WHERE `order`.ordertime > UNIX_TIMESTAMP( ) -86400 *10
ORDER BY `order`.id DESC , `order`.shop ASC
LIMIT 40 , 20

返回所有pay值?(这里不知道是不是返回pay所有值,还是返回on条件所返回的值,应该是pay所有的数据)并返回order的匹配值。这样pay的所有数据也是出来的。order是on的条件刷选出来的。

这样速度就大大提高。

inner join 理解最简单。只要匹配 on 里面的值 的所有两个表中的数据返回即可。

所以这里inner join是最快的。

之前刷新这个页面需要4-8秒时间,现在1秒不到就搞定。不懂sql害死人呀///

我之前还以为是因为我写了很多排序的关系。后来才明白是这个left join的原因。

我的sql是这样写的:

$list = $data->field(‘`pay`.id as pid,`pay`.admininfo,`order`.*,`pay`.zhuantai,`pay`.orderid’)->join(‘right join `pay` ON pay.orderid = `order`.id’)->where(“`order`.ordertime>UNIX_TIMESTAMP()-86400*10”)->order(‘`order`.dctime desc,`pay`.zhuantai asc,`order`.daytype desc,`order`.shop asc,`order`.food asc’)->limit($page->firstRow.’,’.$page->listRows)->select();

修改了order里面的东西。就算是只按照id排序。也只能快个0.0几秒。。