上代码
SELECT DISTINCT player_id, player_name, count(*) as num #顺序5
FROM player JOIN team ON player.team_id = team.team_id #顺序1
WHERE height > 1.80 #顺序2
GROUP BY player.team_id #顺序3
HAVING num > 2 #顺序4
ORDER BY num DESC #顺序6
LIMIT 2 #顺序7
上面这段SQL有很多个关键字,那么他的执行顺序究竟是怎么样的!
在select语句执行这些步骤的时候,每个步骤都会产生一虚拟表,然后将这个虚拟表传入下一个步骤作为输入。就像车间的组装流水线。
对于上面这个SQL,执行顺序如下:
- 先执行from这一步,在这个阶段进行了多张表的联查
- 通过cross join 求笛卡尔积,相当于得到虚拟表vt1-1
- 对刚才得到的虚拟表,vt1-1,通过on关键字进行筛选,得到满足条件的虚拟表vt1-2
- 添加外部行,如果我们使用的是左连接,右连接或者是全连接,就会涉及到外部行,继而在vt-2的基础上增加外部行,得到虚拟表vt1-3
- 当得到vt1-3之后,也就完成了from的所有操作,得到最终的虚拟表vt1
- 然后对vt1进行where操作,对vt1表的结果进行筛选过滤,得到vt2
- 在进行group和having操作,即在vt2的基础上在进行分组和分组过滤,得到虚拟表vt3和vt4
- 再对vt4表进行select操作,进行字段的提取
- 然后进行distinct去重操作
- 去重之后,进行orderby操作
- 最终进行limit操作
至此,整个SQL的就执行完成了!