现在的位置: 首页 > 综合 > 正文

SQL执行顺序说明

2018年01月21日 ⁄ 综合 ⁄ 共 1540字 ⁄ 字号 评论关闭

很多时候,有些人不能很清楚的说明和理解SQL执行顺序。故今天整理说明下。

首先罗列的是常用标准的SQL查询语句。其中括号里面的数字说的是SQL执行顺序,从1开始。

 ( 7 )  SELECT

 ( 8 )  DISTINCT <select_list>
 ( 1  ) FROM <left_table>
 ( 3  )  <join_type> JOIN <right_table> 

 ( 2 )   ON <join_condition> 

 ( 4  ) WHERE <where_condition>

 ( 5 ) GROUP BY <group_by_list>

 ( 6 ) HAVING <having_condition> 

  ( 9 ) ORDER BY <order_by_list>

  ( 10 ) LIMIT <limit_number> 

执行顺序说明如下:

1:FROM :对于FROM 子句中的前两个表执行笛卡尔积操作。生成虚拟表V1。在这里需要注意的是有的时候因为表的表名过长。很多人喜欢用别名来代替。如T1, 也有的时候把一个表的部分结果集拿出来作为连接表。如  (select distinct id  from  t1 where  rdate >='20130101'
) t2,这些经常见于多表关联。为避免mysql的子查询来进行的低效率来做多表JOIN操作,所以会出现先生成子表的结果后,才开始进行关联;

2:ON : 对V1应用ON过滤器。只有哪些符合<join_condition>条件为真的行记录才被插入到V2;

3:  JOIN : 如果制定了外连接(OUT
JOIN)
(相对于 (CROSS JOIN)或者 (INNER JOIN),保留表:(preserved
table
:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到 V2,生成V3.如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止;

4:WHERE: 对于V3应用WHERE过滤器。只有符合<where_condition>条件为TRUE的行才被插入到V4。这里面有个SQL中的ON和WHERE
的区别。可以查看我过去的一篇
ON和WHERE的区别使用;

5:GROUP BY : 按照GROUP BY 子句中的列对V4中的行进行分组。生成V5;

6:HVAING: 对V5应用HVAING过滤器。只用使 <having_condition>
为TRUE的组才会被插入到V6,至于HAVING如何用和GROUP BY的关系,大家懂的。就不多说了。

7:SELECT : 处理SELECT 列表,产生V7,这里可以进行各种组成处理,列字段计算,如果COUNT(),字符串函数处理,集合处理等生成V7;

8:DISTINCT :对重复的行从V7中去掉。产生V8, 这里需要注意的是SELECT 的时候DISTINCT和字段的位置。不同的位置产生的结果是不同的。

9: ORDER BY:将V8中的行按照 ORDER BY 子句中的列表顺序排序。生成游标V9,在这里需要注意的是。可用使用SELECT
列表中的列的别名。如 
SELECT 语句中的 SELECT LENGTH(NAME) AS  LNAME FROM  TABLENAME。 在 ORDER BY 里面就可以用 ORDER BY LNAME DESC 进行排序。这里返回的是一个游标集合。但是使用了ORDER
BY 子句的查查不能用作表表达式。 

10:LIMIT: 从V9中选择需要的记录行。返回给客户端。至于如何高效的选择LIMIT查询,就不多说。

from: http://wzmtony.blog.163.com/blog/static/203180156201301744238502/

抱歉!评论已关闭.