SQL 不同于与其他编程语言的最明显特征是处理代码的顺序。在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后被处理。

每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只是最后一步生成的表才会返回
给调用者。如果没有在查询中指定某一子句,将跳过相应的步骤。下面是对应用于SQL server 2000和SQL Server
2005的各个逻辑步骤的简单描述。

( 8 ) SELECT ( 9 ) DISTINCT ( 11 ) < Top Num > < 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 >

逻辑查询处理阶段简介
FROM:对FROM子句中的前两个表执行笛卡尔积(Cartesian product)(交叉联接),生成虚拟表VT1

ON:对VT1应用ON筛选器。只有那些使为真的行才被插入VT2。

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

WHERE:对VT3应用WHERE筛选器。只有使为true的行才被插入VT4.

GROUP BY:按GROUP BY子句中的列列表对VT4中的行分组,生成VT5.

CUBE|ROLLUP:把超组(Suppergroups)插入VT5,生成VT6.

HAVING:对VT6应用HAVING筛选器。只有使为true的组才会被插入VT7.

SELECT:处理SELECT列表,产生VT8.

DISTINCT:将重复的行从VT8中移除,产生VT9.

ORDER BY:将VT9中的行按ORDER BY 子句中的列列表排序,生成游标(VC10).

TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回调用者。

注:步骤10,按ORDER
BY子句中的列列表排序上步返回的行,返回游标VC10.这一步是第一步也是唯一一步可以使用SELECT列表中的列别名的步骤。这一步不同于其它步骤的

是,它不返回有效的表,而是返回一个游标。SQL是基于集合理论的。集合不会预先对它的行排序,它只是成员的逻辑集合,成员的顺序无关紧要。对表进行排序
的查询可以返回一个对象,包含按特定物理顺序组织的行。ANSI把这种对象称为游标。理解这一步是正确理解SQL的基础。

最新文章

  1. 一步步构造自己的vue2.0+webpack环境
  2. 使用C#类向数据库添加数据的例子源码
  3. PowerDesigner设计时表显示注释选项
  4. centos 7.0 编译安装mysql 5.6.22 再次总结 成功编译安装~ 越来越熟练了~
  5. Hibernate 分页时 Long 无法转化成Integer类型 异常
  6. MUI - Scroll插件的使用
  7. hdu-----(1150)Machine Schedule(最小覆盖点)
  8. protobuf的使用
  9. POJ 2724 Purifying Machine (二分图匹配)
  10. (转)PHP中的ob_start用法详解
  11. C#高级编程随笔
  12. 动态规划---最长上升子序列问题(O(nlogn),O(n^2))
  13. Java进阶(九)正则表达式
  14. 820板子安装python
  15. Linux 与 Unix 到底有什么不同?区别在哪?
  16. $Django patch与put,视图组件,路由控制,响应器
  17. 【SQL】glob 和 like 的区别
  18. Mysql的基本操作(一)增、删、改
  19. I Hate It---hdu1754线段树
  20. Codefores 835C-Star sky

热门文章

  1. Docker构建FastDFS镜像
  2. spring 事务传播机制
  3. python通配符之glob模块
  4. dd/MMM/yyyy:hh:mm:ss +0800日期格式的转化
  5. devexpress gridview代码设置
  6. Jboss安装配置以及相关的问题
  7. Spring Boot的日志配置
  8. c# BackgroundWorker初试
  9. 未处理AccessViolationException 异常
  10. 数据分组分析—-groupby