`
newleague
  • 浏览: 1471820 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

SQL查询顺序处理

 
阅读更多

select的解析执行顺序1. from语句 2. where语句 (结合条件) 3. start with语句 4. connect by语句 5. where语句 6. group by语句 7. having语句 8. model语句 9. select语句 10. union、minus、intersect等集合演算演算11. order by语句

 

SQL逻辑查询处理

如下代码清单:

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

 

以上的一个SQL语句,就是按照上面的序号的顺序来执行,每个步骤会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只有最后一步生成的表才会返回给调用者。

 

步骤一,FROM:对FROM子句中的两个表执行笛卡尔积(交叉连接),生成虚拟表VT1。

步骤二, ON:对VT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入VT2。

步骤三,OUTER(JOIN):如果指定的OUTER JOIN (相对于CROSS   JOIN或 INNER JOIN),保留表(preservedt able)中未找到匹配的行将作为外部行添加到VT2,生成VT3。如果FROM子句中包含两个以上的表,则对上一个联接生成的结果表与下一个表重复执行步骤一到步骤三,直到所有的表为止。

步骤四,WHERE:对VT3应用WHERE筛选器。只有使<where_condition>为TRUE的行才会被插入VT4。

步骤五,GROUP BY :按GROUP BY子句中的列表对VT4中的行分组,生成VT5。

步骤六,CUBE|ROLLUP:把超组(Supergroups)插入VT5,生成VT6。

步骤七,对VT6应用HAVING 筛选器。只有使<having_condition>为TRUE的租才会被插入VT7。

步骤八,SELECT:处理SECLECT列表,产生VT8。

步骤九,DISTINCT:讲重复的行从VT8中移除,产生VT9。

步骤十,ORDER BY :将VT9中的行按ORDER BY子句中列列表排序,生成一个游标(VC10)。

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

 

以上步骤的注意点:

1.       如果步骤三中联接两个以上的表,将会对VT3和FROM子句中第三张表重复执行步骤一到步骤三。

2.       在步骤四中,因为数据还未被分组,这里还不能使用聚合筛选器。例如:不能使用

Where orderdate=Max(orderdate)。也不能引用SELECT 列表中别名,因为SELECT列表这时还未被处理。

3.       步骤三与步骤四中关于ON与Where筛选器的区别,只有在使用外部联接时,才会出现ON与Where这种逻辑差别。当使用内部联接时,在哪里制定逻辑表达式都无所谓,因为步骤三将被跳过。这些筛选器相继被应用,中间没有任何步骤。

二者之间的主要区别是,ON是在添加外部行(步骤三)之前被应用,而Where是在步骤三之后被应用。ON筛选器对保留中部分行的移除并不是最终的,因为步骤三回把这些行再添加进来,而Where筛选器对行的移除是最终的。

4.       步骤七中,Having是第一个也是唯一一个应用到已分组数据的筛选器。

5.       步骤八中,在Select列表中创建的别名不能在前面的步骤使用。实际上表达式别名甚至不能用于Select列表中其他表达式。你只能在Select列表后面的步骤中(如:Order By步骤)使用列的别名。

6.       步骤十中,这一步不同于其他步骤的是,该步骤返回的是一个游标。SQL是基于集合理论的。集合不会预先对它的行排序,它只是成员的逻辑集合,成员的顺序无关紧要。对表进行的查询可以返回一个对象,包含按特定物理顺序组织的行。ANSI把这种对象称为游标。             尽管SQL并不为表的行程序特定的顺序,但它却按特定的顺序维护列的位置。指定Select * 可以确保按照特定顺序返回


分享到:
评论

相关推荐

    SQL查询处理进程

    SQL Server 逻辑查询执行过程,详细说明了SQL 语句执行的顺序

    Microsoft SQL Server 2008技术内幕:T-SQL查询(第二卷)

    《Microsoft SQL Server 2008技术内幕:T-SQL查询》全面深入地介绍了Microsoft SQL Server 2008中高级T-SQL查询、性能优化等方面的内容,以及SQL Server 2008新增加的一些特性。主要内容包括SQL的基础理论、查询优化...

    SQL Server 查询处理中的各个阶段(SQL执行顺序)示例

    SQL不同于与其他编程语言的最明显特征是处理代码的顺序,以下就为大家详细的介绍一下,需要的朋友可以参考下

    SQL查询安全性及性能优化

     执行SQL语句:【把编译过的查询要求提交并进行处理】 如何优化SQL 完善开发的管理 完善代码审核、测试机制,软件开发是艺术! 检测SQL查询的效率 语法【对IO和Time对SQL执行进行统计】: SET STATISTICS IO ...

    多关系SQL查询中连接顺序的优化.pdf

    多关系SQL查询中连接顺序的优化.pdf

    Oracle SQL 官方文档

    Oracle SQL 11G2 官方文档,包含4份,分别是PLSQL语言参考、PLSQL程序包与类型、Oracle SQL参考、SQL快速参考

    SQLServer2008技术内幕T-SQL查询包含源代码及附录A

    《Microsoft SQL Server 2008技术内幕:T-SQL查询》全面深入地介绍了Microsoft SQL Server 2008中高级T-SQL查询、性能优化等方面的内容,以及SQL Server 2008新增加的一些特性。主要内容包括SQL的基础理论、查询优化...

    常用SQL_sql_

    常用SQLSelect查询语句按以下顺序处理

    Microsoft+SQL+Server+2008技术内幕:T-SQL查询_源代码及附录 中文版

    《Microsoft SQL Server 2008技术内幕:T-SQL查询》全面深入地介绍了Microsoft SQL Server 2008中高级T-SQL查询、性能优化等方面的内容,以及SQL Server 2008新增加的一些特性。主要内容包括SQL的基础理论、查询优化...

    SQLServer2008查询性能优化 2/2

    《SQL Server 2008查询性能优化》为你提供了处理查询性能所需要的工具。建立、维护数据库和数据库服务器可能是个困难的工作。当服务器的运行越来越慢时,这个工作就变得更加困难。来自用户的愤怒的电话以及站在你...

    逻辑查询处理顺序你不知道的二三事

    SQL逻辑查询处理顺序你不知道的二三事(数据库查询你看不到的程序)

    精通sql结构化查询语句

    8.2.1 日期时间函数 8.2.2 CONVERT函数转换日期、时间 8.2.3 数据运算函数 8.3 字符串函数 8.3.1 字符串处理函数介绍 8.3.2 字符转换函数 8.3.3 去字符串空格函数 8.3.4 取字符串长度的函数 8.3.5 查询包含部分字符...

    SQLServer2008查询性能优化 1/2

    《SQL Server 2008查询性能优化》为你提供了处理查询性能所需要的工具。建立、维护数据库和数据库服务器可能是个困难的工作。当服务器的运行越来越慢时,这个工作就变得更加困难。来自用户的愤怒的电话以及站在你...

    SQL语句执行顺序详解

    我们做软件开发的,大部分人都离不开跟数据库打交道,特别是erp开发的,跟数据库打交道更是频繁,由于SQL 不同于与其他编程语言的最明显特征是处理代码的顺序。在大数编程语言中,代码按编码顺序被处理,但是在SQL...

    Microsoft SQL Server 2005技术内幕: T-SQ程序设计.pdf

    本书涵盖了T-SQL程序设计的方方面面,如基于集合的编程技术、日期和时间相关的XML和CLR数据类型的使用、临时对象、T-SQL和CLR用户自定义函数、存储过程、触发器、事务和新的错误处理结构、应用并发模型支持并发用户...

    SQLServer安全及性能优化

    2、使用统一的SQL语句规范,特别是访问表的顺序要保持一致,这样可以避免互相占用资源而导致的死锁。 不合理的数据文件设置,影响事务处理的性能 当事务处理产生大量数据的时候,数据文件的大小如果设置不合理将...

    SQL数据库资源大放送

    ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...

    SQL SERVER 2000开发与管理应用实例

    15.2.2 索引对查询结果顺序的影响 465 15.2.3 索引对数据操作的影响 469 15.3 数据库日志疑难解答 470 15.3.1 影响日志文件增长的因素 471 15.3.2 从事务日志中删除日志记录 472 15.3.3 日志文件...

Global site tag (gtag.js) - Google Analytics