最近工在Presto中用了很多关联查询操作,遇到了一些问题再这里记录一下。
LEFT JOIN的基本概念
LEFT JOIN是我们最常用的关联查询,对于之前很少直接接触复杂关联查询的兄弟,我们还是需要弄清楚一些基本概念。
- LEFT JOIN是逻辑操作符,对于放在左边的表来说,是以其为base,如果SELECT查询的字段全都来自左边的表,那么最终的结果条数会 >= 左表条数
- 数据库优化器是最终决定执行顺序的地方,一般的会按照你的LEFT JOIN的顺序执行,但也不保证完全是那样。
怎么执行呢?
例如:
SELECT table_1.a, table_1.b, table_1.c
FROM table_1
LEFT JOIN table_2
ON table_1.uid = table_2.uid
LEFT JOIN talbe_3
ON table_1.uid = table_3.uid
执行顺序是:table_1和table_2先组合成一个虚拟表,然后这个虚拟表再和table_3关联。
多个LEFT JOIN连接,记录的条数是不是主表的条数?
如上面的语句,在没有WHERE语句情况下,是大于等于table_1的条数。
这是因为:
- SELECT 后面的字段均来自table_1;
- 所有的关联条件都是为了匹配table_1;