介绍
在对多表进行查询时,不可避免的会涉及到JOIN操作,但是由于存在多种类型的JOIN,有时会令人困惑。
本文首先会对常见的JOIN进行描述,由于分布式系统使用Presto对外提供查询接口,接着会介绍Presto中关于JOIN的一些独有的特性。最后列出了几个通用的JOIN的优化策略
常见的JOIN操作
为了方便演示,通过下面两张表进行演示
TableA
id | name |
---|---|
1 | Pirate |
2 | Monkey |
3 | Ninja |
4 | Spaghetti |
TableB
id | name |
---|---|
1 | Rutabaga |
2 | Pirate |
3 | Darth Vader |
4 | Ninja |
Inter Join
Inter Join产生的结果是A和B的以On交集。
语句:
SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name
Inter Join 包含两种:
- 显示(explicit) :就是上面这种方式
- 隐式(implicit):语句形式为SELECT * FROM TableA,TableB where TableA.name = TableB.name
多数情况下上面两种方式没有差别,但是建议使用第一种
结果:
id | name | id | name |
---|---|---|---|
1 | Pirate | 2 | Pirate |
3 | Ninja | 4 | Ninja |
图例:
Left Join(left outer join)
Left outer join产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。
语句:
SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name