`

sql的查询语句执行顺序

 
阅读更多

转载一篇不错的文章:http://ddlgyq.iteye.com/blog/1867867

 

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中定义的列的别名。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics