通过对比例句(4)和例句(1)的结果,大家会发现,其实输出行只是在返回顺序上有所差异而已。当然,我们可以追加使用ORDER BY对其进行调整:
请同学们注意,我们在例句(5)的GROUP BY和ORDER BY后面均使用了列别名城市。没错,这个操作我们在学习排序时介绍过。那么在此处,有一个重点内容值得大家注意,各个关键词对应的执行顺序为:
在ORDER BY后使用列别名几乎是各个RDBMS所通用的,因为SELECT的执行顺位先于ORDER BY。细致来讲,由于AS将location重命名为“城市”是发生在MySQL执行SELECT的阶段,且这一阶段先于ORDER BY。所以等到MySQL准备排序时,它已经知道了列别名的存在(列别名已生效)。
不过根据以上顺序,GROUP BY的执行顺位却是先于SELECT的。看到这里,同学们可能会问,为什么在GROUP BY中依然能使用列别名呢?按照执行顺序来讲,MySQL在进行数据分组时,列别名还未被定义(列别名未生效),所以MySQL此时不应该知道列别名的存在呀!
没错,确实如此。事实上,在GROUP BY中使用列别名是MySQL的一个特点。这是因为MySQL针对这一用法做了相关调整。所以无论怎样,请同学们记住:GROUP BY的执行顺位依然是先于SELECT的。