SQL中的关键字的执行顺序

SQL 确实简单,基本上学完之后自己多写几遍熟练后就能无障碍的写出和读懂 SQL 。但是计算机可没有人脑这么智能,它必然是对每个 SQL 关键字进行解析形成语法解析树后才能执行,那么每个 SQL 的关键字的执行顺序到底是怎么样呢?


从一个最完整的 SQL 分析:

1
2
3
4
5
6
7
8
9
10
(8)SELECT (9)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)WITH { CUBE | ROLLUP }
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>
(11)LIMIT <limit_number>;

  • FROM:对 FROM 左边的表和右边的表计算笛卡尔积,产生虚表 VT1
  • ON:对虚拟表 VT1 进行 ON 筛选,只有那些符合 ** 条件的行才会被记录在虚拟表 VT2 中;
  • JOIN:如果是 OUT JOIN ,那么将保留表中(如左表或者右表)未匹配的行作为外部行添加到虚拟表 VT2 中,从而产生虚拟表 VT3
  • WHERE:对虚拟表 VT3 进行 WHERE 条件过滤,只有符合 ** 的记录才会被放入到虚拟表 VT4
  • GROUP BY:根据 GROUP BY 子句中的列,对虚拟表 VT4 进行分组操作,产生虚拟表 VT5
  • CUBE | ROLLUP:对虚拟表 VT5 进行 CUBE 或者 ROLLUP 操作,产生虚拟表 VT6
  • HAVING:对虚拟表 VT6 进行 HAVING 条件过滤,只有符合 ** 的记录才会被插入到虚拟表 VT7 中;
  • SELECT:执行 SELECT 操作,选择指定的列,插入到虚拟表 VT8 中;
  • DISTINCT:对虚拟表 VT8 中的记录进行去重,产生虚拟表 VT9
  • ORDER BY:将虚拟表 VT9 中的记录按照 ** 进行排序操作,产生虚拟表 VT10
  • LIMIT:取出指定行的记录,产生虚拟表 VT11 ,并将结果返回。
Java Web Servlet 快速入门 Java 动态代理

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×