MySQL社区

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 1308|回复: 0
打印 上一主题 下一主题

[命令及语法] 关于select语句执行顺序的疑惑

[复制链接]
跳转到指定楼层
1#
发表于 2017-8-29 13:47:44 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
《MySQL技术内幕:SQL编程》一书中关于select语句执行顺序是这样的:
[img]file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\479819938\QQ\WinTemp\RichOle\MNOA1TSN%U6}7Z19E@DM7@E.png[/img]

1、FORM: 对FROM左边的表和右边的表计算笛卡尔积,产生虚表VT1。
2、ON: 对虚表VT1进行ON过滤,只有那些符合<join-condition>的行才会被记录在虚表VT2中。
3、JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3。
4、WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合<where-condition>的记录才会被插入到虚拟表VT4中。
5、GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5。
6、HAVING: 对虚拟表VT5应用having过滤,只有符合<having-condition>的记录才会被 插入到虚拟表VT6中。
7、SELECT: 执行select操作,选择指定的列,插入到虚拟表VT7中。
8、DISTINCT: 对VT7中的记录进行去重。产生虚拟表VT8.
9、ORDER BY: 将虚拟表VT8中的记录按照<order_by_list>进行排序操作,产生虚拟表VT9.
10、LIMIT:取出指定行的记录,产生虚拟表VT10, 并将结果返回。


其中order by是在select语句后面,因为select中的别名在order by中可以使用,这点说明order by确实是在select语句后面执行,但我现在有个疑惑:如果order by的字段不在select中,那它是怎么排序的?
比如啊,一张表有id,naem和score三个字段,我现在想通过score给name排序,这样写:“select name from table order by score;”,经测试,这样是可以执行的且结果正确。但按上面的顺序,select执行时,选择指定的列(此处即name字段)产生虚拟表VT7,此时这张虚拟表中是没有score字段的,那么接下来order by对虚拟表VT7进行排序时,是如何根据score字段来排序的??或者是说order by的排序时依据的还是原始表么?


请大神讲解!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享淘帖 顶 踩
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|小黑屋|Archiver|手机版|MySQL社区 ( 京ICP备07012489号   
联系人:周生; 联系电话:13911732319

GMT+8, 2024-4-25 17:11 , Processed in 0.099444 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表