MySQL社区

标题: 关于select语句执行顺序的疑惑 [打印本页]

作者: jang    时间: 2017-8-29 13:47
标题: 关于select语句执行顺序的疑惑
《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的排序时依据的还是原始表么?


请大神讲解!





欢迎光临 MySQL社区 (http://www.mysqlpub.com/) Powered by Discuz! X3.2