总的来说,四种JOIN的使用/区别可以描述为:
left join 会从左表(shop)那里返回所有的记录,即使在右表(sale_detail)中没有匹配的行。
right outer join 右连接,返回右表中的所有记录,即使在左表中没有记录与它匹配
full outer join 全连接,返回左右表中的所有记录
在表中存在至少一个匹配时,inner join 返回行。 关键字inner可省略。
Join
一共有三种OUTER JOIN:
LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN
关键字OUTER是可选择的,取决于具体语言,在实现上它们都是遵循标准的,因此FULL JOIN和FULL OUTER JOIN是一样的。
- 接着将以简化的数据集来说明这些JOIN语句。考虑有如下两个数据集,注意到有些元素在car表中有,在person表中没有,反过来也是。
![91002a131f0a9c3e6082a73f7914fd3f.png](https://i-blog.csdnimg.cn/blog_migrate/4853d566ac81ee9fd2fbf5772c1e80d3.jpeg)
![9d0eb33b65111bf456e07ed20c213fc6.png](https://i-blog.csdnimg.cn/blog_migrate/10285872d9349a5270f28834cce31203.jpeg)
- LEFT OUTER JOIN
- 现在执行如下SQL语句(左连接,LEFT OUTER JOIN):
- SELECT * FROM person LEFT OUTER JOIN car ON car_id = id;
- 将会得到如下结果:
![40ea5678524ab9d35984142a772f7923.png](https://i-blog.csdnimg.cn/blog_migrate/6c53e7dcf3d86e9930ccdf9fa54d9132.jpeg)
- 左连接(LEFT OUTER JOIN)会输出左边的表中的所有结果,如果右边的表中有相应项,则会输出,否则为NULL
- 因此,如果要找出在person(左边的表)中有,而在car(右边的表)中没有的数据项,可以使用如下的SQL语句:
- SELECT * FROM person LEFT OUTER JOIN car ON car_id = id WHERE id IS NULL;
- 将会得到如下结果:
![0f037c9174bdf086edb83f033141d09d.png](https://i-blog.csdnimg.cn/blog_migrate/1b0cede14d6d91e672c8bd8ba6cd8b82.jpeg)
- RIGHT OUTER JOIN
- 如果使用右连接,结果将会输出car表中所有的数据项和person表中相应的匹配项(注意你现在是获取了右边的表中的所有数据项):
- SELECT * FROM person RIGHT OUTER JOIN car ON car_id = id;
- 将会得到如下结果:
![850cfb0dedb58dffab07e792b8742dc9.png](https://i-blog.csdnimg.cn/blog_migrate/d99ec0ebab6afe90619febd7a15e5ad6.jpeg)
- FULL OUTER JOIN(意义有变化,非全部显示)
- 如果想要取得所有的元素项,则可以使用FULL JOIN:
- SELECT * FROM person full JOIN car ON car_id = id;
- 将会得到如下结果:
![29f408875dc7aa60b9d3c5d50b73d897.png](https://i-blog.csdnimg.cn/blog_migrate/d07abcd09db6d6834ba4359d57ed9080.jpeg)
![56eee054b7e63ce774949a093814436a.png](https://i-blog.csdnimg.cn/blog_migrate/18e04816e9be1f839f19c710958c214a.jpeg)
- CROSS JOIN
- 最后还有一个CROSS JOIN,笛卡儿积,将会返回person表中每个元素分别匹配car中所有元素的结果,即N*M组合。
- SELECT * FROM person CROSS JOIN car;
- 将会得到如下结果:
![a56a04835d449cf4b74aed03ac972737.png](https://i-blog.csdnimg.cn/blog_migrate/5fac5b0c0566fbc60098d27deb89e09f.jpeg)
- 最后附上一张图解:
- 这边也有一张图清楚的说明了每个JOIN操作。建议把上面的内容浏览一边后,再好好看下这张图片,相信对JOIN的操作应该就完全明白了。
![1a30e031b7b3ca286617617dc07ded20.png](https://i-blog.csdnimg.cn/blog_migrate/fc36f625c3fad1353fc6b3eaa5790718.jpeg)