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)