一条完整的 SELECT 语句内部的执行顺序是这样的:
- FROM 子句组装数据(包括通过 ON 进行连接);
- WHERE 子句进行条件筛选;
- GROUP BY 分组 ;
- 使用聚集函数进行计算;
- HAVING 筛选分组;
- 计算所有的表达式;
- SELECT 的字段;
- ORDER BY 排序;
- LIMIT 筛选。
哪种情况下应该使用 EXISTS,哪种情况应该用 IN,选择的标准是看能否使用表的索引吗?
索引是个前提,其实选择与否还是要看表的大小。你可以将选择的标准理解为小表驱动大表。在这种方式下效率是最高的。
SELECT * FROM A WHERE cc IN (SELECT cc FROM B); SELECT * FROM A WHERE EXISTS (SELECT cc FROM B WHERE B.cc=A.cc);
当 A 小于 B 时,用 EXISTS。因为 EXISTS 的实现,相当于外表循环,实现的逻辑类似于:
for i in A for j in B if j.cc == i.cc then ...
当 B 小于 A 时用 IN,因为实现的逻辑类似于:
for i in B for j in A if j.cc == i.cc then ...