SQL逻辑查询语句执行顺序

来源:互联网 发布:文泰刻绘软件官网 编辑:程序博客网 时间:2024/05/21 19:57
(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_condition>(10)   LIMIT <limit_number>


上述SQL的执行顺序

1,执行FROM语句

FROM告诉我们最开始从哪个表开始。经过FROM语句对两个表执行笛卡尔积,会得到一个虚拟表


2,执行ON过滤

执行完笛卡尔积以后,接着会执行ON条件过滤,去掉不符合条件的数据,得到新的虚拟表


3,执行WHERE过滤

通过<where_condition>过滤,形成新的虚拟表

注意:

1,由于数据还没有分组,因此现在还不能在where过滤器中使用where_condition=MIN(col)这类对分组统计的过滤

2,由于还没有进行列的选取操作,因此在SELECT中使用列的别名也是不被允许的,如:SELECT city as c FROM t where c='shanghai';是不允许出现的


4,执行GROUP BY分组

GROUP BY字句主要是对使用WHERE字句得到的虚拟表进行分组操作,得到新的虚拟表


5,执行HAVING过滤

HAVING字句主要和GROUP BY子句配合使用,对GROUP BY得到的数据进行条件过滤,得倒新的虚拟表


6,SELECT列表

选取select_list中的字段形成新的虚拟表


7,执行DISTINCT子句

DISTINCT子句会创建一张内存临时表,和SELECT形成的虚拟表结果一样,但DICTINCT操作的列增加了一个唯一索引,以此去掉重复数据


8,执行ORDER BY子句

对上述虚拟表中的内容按照指定的列进行排序,然后返回一个新的虚拟表


9,执行LIMIT子句

LIMIT子句从上一步得到的虚拟表中选出从指定位置开始的指定行数据

对于小数据,LIMIT字句没有任何问题,当数据量非常大的时候,使用LIMIT n,m是非常低效的。因为LIMIT的机制是每次都是从头开始扫描

所以,对于大数据处理时,是非常有必要在应用层建立一定的缓存机制

0 0
原创粉丝点击