sql语言中的查询的执行顺序,以前不是很了解,最近查阅了相关资料,在sql语言中,第一个被处理的字句总是from字句,最后执行的limit操作。现有以下的sql语句。
(8)SELECT (9)DISTINCT<select_list>
(1)FROM<left_table>
(3)<join_type>JOIN<right_table>
(2) ON<join_condition>
(5)GROUP BY<group_by_list>
(6)WITH{CUBE|ROLLUP}
(7)HAVING<having_condition>
(10)ORDER BY<order_by_list>
(11)LIMIT<limit_number>
以上的sql语句前的数字代表该sql语句的执行顺序,每一个操作都会产生一个虚拟表,这个虚拟表作为下个操作的输入,依次类推,最后生成的虚拟表作为结果输出。如果没有在查询中指定某一字句,则将跳过相应的步骤
1)FROM:对FROM子句中的左表<left_table>和右表<right_table>执行笛卡尔积,产生虚拟表VT1.
2)ON:对虚拟表VT1应用ON筛选,只有那些符合条件<join_condition>的行才会被插入虚拟表VT2中。
3)JOIN:如果是外连接,还要根据外连接的类型执行join操作,例如左外连接将左表中的行并且不在VT2中的行加入到VT2中,产生VT3.
4)WHERE:对虚拟表VT3应用where过滤条件,只有符合<where_condition>的记录才被插入虚拟表VT4中。
5)GROUP BY:根据GROUP BY字句中的列,对VT4中的记录进行分组操作,产生VT5.
6)CUBE|ROLLUP:对表VT5执行cube或者rollup操作,产生虚拟表VT6.
7)HAVING:对虚拟表VT6应用HAVING过滤器,只有符合<having_condition>的记录才会被插入虚拟表VT7中
8)SELECT:对VT7执行select操作,将指定的数据插入到虚拟表VT8中
9)DISTINCT:去除重复数据,产生虚拟表VT9.
10)ORDER BY:按照<order_by_list>对VT9进行排序操作,产生虚拟表VT10
11).LIMIT:选出指定的行,产生虚拟表VT11,返回给用户。
ps:在应用where过滤器的时候,有两种过滤不被允许。
(1).由于此时数据还没有分组,所以还不能在where中使用where_condition=MIN(col)这类对统计的过滤
(2).由于此时还没有进行select操作,所以where中不能使用在select中定义的列的别名。