SQL执行顺序

SQL 是一种为数不多的声明性语言,我们告诉系统我们需要什么。


SQL语句的语法顺序:

```
SELECT [DISTINCT]
FROM
JOIN
ON
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
```

对于MySQL,除了第一行,其他部分都是可选的,有的DBMS要求FROM从句也是必须的。


执行顺序:

```
(1) FROM <left_table>
(2) ON <join_condition>
(3) <join_type> JOIN <right_table>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) HAVING <having_condition>
(7) SELECT
(8) DISTINCT <select_list>
(9) ORDER BY <order_by_condition>
(10) LIMIT <limit_number>
```


SQL语句的执行过程中,每一步都会产生一个虚拟表用来保存SQL语句的执行结果 为下一步提供数据。


> from

sql首先执行from将数据从硬盘加载到数据缓冲区中,以便对这些数据进行操作。如果有多个表则求所有表的笛卡尔积。
(table1的记录条数 * table2的记录条数 * tableN的记录条数)这时第一个虚拟表产生VT1


> on

其次执行on,从VT1中取出匹配on条件的行, 产生VT2。


> join

left join,right join 外部连接就是在这个时候执行的,在VT2的基础上添加符合条件的外部的行,产生VT3。


> where

执行where过滤,产生VT4
*由于这个时候select没有执行,所以select中的别名不可以用于where
SELECT T1.c1 + T1.c2 AS v FROM T1 WHERE v = 1
-- v 在此处不可用,因为先执行where语句
SELECT T1.c1 + T1.c2 AS v FROM T1 WHERE (T1.c1 + T1.c2 ) = 1


> group by

在VT4的基础上执行group by 分组数据,产生VT5。


> having

在VT5的基础上执行having过滤,产生VT6。


> select

查出我们要的字段,产生VT7。


> order by

排序 产生VT8


> limit

限制返回行数


SQL 语言的核心是对表的引用(table references)

posted @ 2016-08-08 18:11  anyeshe  阅读(913)  评论(0编辑  收藏  举报