码迷,mamicode.com
首页 > 其他好文 > 详细

select执行

时间:2019-11-26 11:54:25      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:rtu   就是   筛选   中间   oss   连接   不可   笛卡尔积   rom   

整合不同的数据源,用常数列作为这个表的标记,就需要查询常数SELECT ‘王者荣耀‘ as platform, name FROM heros

书写顺序  SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...

执行顺序  FROM > WHERE > GROUP BY > HAVING > SELECT的字段 > DISTINCT > ORDER BY > LIMIT

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

执行每个步骤都会产生一张虚拟表,作为下个步骤的输入,对用户不可见

首SELECT是先执行FROM这一步的。在这个阶段,如果是多张表联查,还会经历下面的几个步骤:
1. 首先先通过CROSS JOIN求笛卡尔积,相当于得到虚拟表 vt(virtual table)1-1;
2. 通过ON进行筛选,在虚拟表vt1-1的基础上进行筛选,得到虚拟表 vt1-2;
3. 添加外部行。如果我们使用的是左连接、右链接或者全连接,就会涉及到外部行,也就是在虚拟表vt1-2的基础上增加外部行,得到虚拟表vt1-3。
当然如果我们操作的是两张以上的表,还会重复上面的步骤,直到所有表都被处理完为止。这个过程得到是我们的原始数据。
当我们拿到了查询数据表的原始数据,也就是最终的虚拟表vt1,就可以在此基础上再进行
WHERE阶段。在这个阶段中,会根据vt1表的结果进行筛选过滤,得到虚拟表vt2。
然后进入第三步和第四步,也就是GROUP和 HAVING阶段。在这个阶段中,实际上是在虚拟表
vt2的基础上进行分组和分组过滤,得到中间的虚拟表vt3vt4
当我们完成了条件筛选部分之后,就可以筛选表中提取的字段,也就是进入到SELECT和
DISTINCT阶段。
首先在SELECT阶段会提取想要的字段,然后在DISTINCT阶段过滤掉重复的行,分别得到中间
的虚拟表vt5-1vt5-2
当我们提取了想要的字段数据之后,就可以按照指定的字段进行排序,也就是ORDER BY阶
段,得到虚拟表vt6
最后在vt6的基础上,取出指定行的记录,也就是LIMIT阶段,得到最终的结果,对应的是虚拟表vt7

技术图片

 

 

select执行

标签:rtu   就是   筛选   中间   oss   连接   不可   笛卡尔积   rom   

原文地址:https://www.cnblogs.com/autointerface/p/11934459.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!