您的位置:首页 > 数据库

SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)

2015-08-25 15:07 573 查看
总的来说,四种JOIN的使用/区别可以描述为:

left join 会从左表(shop)那里返回所有的记录,即使在右表(sale_detail)中没有匹配的行。
right outer join 右连接,返回右表中的所有记录,即使在左表中没有记录与它匹配
full outer join 全连接,返回左右表中的所有记录
在表中存在至少一个匹配时,inner join 返回行。 关键字inner可省略。

具体可以看stackoverflow上,Difference
between Inner Join & Full join这个问题,说得蛮清楚的,我就搬运一下这个问题的答案好了。


Join

一共有三种
OUTER
 JOIN:
LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN
关键字
OUTER
是可选择的,取决于具体语言,在实现上它们都是遵循标准的,因此
FULL
JOIN
FULL OUTER JOIN
是一样的。
接着将以简化的数据集来说明这些JOIN语句。考虑有如下两个数据集,注意到有些元素在A中有,在B中没有,反过来也是。
Set "A"    Set "B"


AA         BB

--------   --------

Item 1     Item 3

Item 2     Item 4

Item 3     Item 5

Item 4     Item 6



LEFT OUTER JOIN

现在执行如下SQL语句(左连接,LEFT OUTER JOIN):
SELECT * FROM A LEFT OUTER JOIN B ON AA = BB


将会得到如下的结果(空白的元素表示
NULL
):
AA         BB

--------   --------

Item 1

Item 2

Item 3     Item 3

Item 4     Item 4


左连接(LEFT OUTER JOIN)会输出左边的表中的所有结果,如果右边的表中有相应项,则会输出,否则为
NULL

因此,如果要找出在AA(左边的表)中有,而在BB(右边的表)中没有的数据项,可以使用如下的SQL语句:
SELECT * FROM A LEFT OUTER JOIN B ON AA = BB

WHERE BB is NULL



RIGHT OUTER JOIN

如果使用右连接,结果将会输出BB中所有的数据项和AA中相应的匹配项(注意你现在是获取了右边的表中的所有数据项):
SELECT * FROM A RIGHT OUTER JOIN B ON AA = BB


AA         BB

--------   --------

Item 3     Item 3

Item 4     Item 4

Item 5

Item 6



FULL OUTER JOIN

如果想要取得所有的元素项,则可以使用
FULL JOIN
:
SELECT * FROM A FULL JOIN B ON AA = BB


AA         BB

--------   --------

Item 1            <-----+

Item 2                  |

Item 3     Item 3       |

Item 4     Item 4       |

Item 5       +--- empty holes are NULL's

Item 6       |

^                     |

|                     |

+---------------------+


再次注意,缺失的数据项的值是
NULL


INNER JOIN

INNER JOIN
JOIN
是一样的,一般
INNER
关键字可以省略。
INNER
JOIN
将只会返回相匹配的元素项,即不会返回结果为
NULL
的数据项。
SELECT * FROM A INNER JOIN B ON AA = BB


AA         BB

--------   --------

Item 3     Item 3

Item 4     Item 4



CROSS JOIN

最后还有一个
CROSS JOIN
,笛卡儿积,将会返回A中每个元素分别匹配B中所有元素的结果,即N*M组合。
SELECT * FROM A CROSS JOIN B


AA         BB

--------   --------

Item 1     Item 3      ^

Item 1     Item 4      +--- A中第一个元素, 匹配B中所有元素

Item 1     Item 5      |

Item 1     Item 6      v

Item 2     Item 3      ^

Item 2     Item 4      +--- A中第二个元素, 匹配B中所有元素

Item 2     Item 5      |

Item 2     Item 6      v

Item 3     Item 3      ... and so on

Item 3     Item 4

Item 3     Item 5

Item 3     Item 6

Item 4     Item 3

Item 4     Item 4

Item 4     Item 5

Item 4     Item 6



图解SQL的JOIN操作

这边也有一张图清楚的说明了每个JOIN操作。建议把上面的内容浏览一边后,再好好看下这张图片,相信对JOIN的操作应该就完全明白了。


图解SQL的JOIN操作


参考资料

Difference
between Inner Join & Full join – stackoverflow
Join(SQL) – Wikipedia

 http://www.powerxing.com/sql-join/

转自:http://www.powerxing.com/sql-join/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: