对于数据量多的肯定是用连接查询快些,原因:因为子查询会多次遍历所有的数据(视你的子查询的层次而定),而连接查询只会遍历一次。
但是数据量少的话也就无所谓是连接查询还是子查询,视自己的习惯而定。一般情况下还是用子查询来的好,容易控制。
子查询和关联子查询的区别:
- 普通子查询相当于一个独立的query
- 关联子查询依赖于主查询的计算结果 =》 例如上图中的s.stage是main query的计算结果
举个栗子
SELECT
-- Select country ID, date, home, and away goals from match
main.country_id,
main.date,
main.home_goal,
main.away_goal
FROM match AS main
WHERE
-- Filter the main query by the subquery
(home_goal + away_goal) >
(SELECT AVG((sub.home_goal + sub.away_goal) * 3)
FROM match AS sub
-- Join the main query to the subquery in WHERE
WHERE main.country_id = sub.country_id);
目的是比较country level,AVG超过overall avg三倍的outlier,所以=》
最后用WHERE main.country_id = sub.country_id来确保是每个country的数据在match比较