与大多数语言一样,SQL语言也有一个执行顺序,只是在大多数编程语言中,代码是按照编写顺序来处理的,而在SQL中则不是,下图为SQL 执行顺序。

(5) SELECT ( 5-2 ) [ ALL | DISTINCT ]
(5- 3) [TOP ( expression ) [PERCENT] [ WITH TIES ]
(5- 1) < select_list >
--[ INTO new_table ]
(1) FROM ( 1-J ) < left_table> <join_type> join <right_table> on <on_predicate>
|(1- A) <left_table> <apply_type > apply <right_table_expression> as <alias>
|(1- P) <left_table> PIVOT (<pivot_specification>) as <alias>
|(1- U) <left_table> UNPIVOT (<unpivot_specification>) as <alias>
(2) WHERE <search_condition>
(3) <GROUP BY>
(4) HAVING < search_condition >
(6) ORDER BY < order_by_list>

(1)FROM  FROM 阶段标识出查询的来源表,处理表运算符。每个表运算符也会应用一系列子阶段。例如,在联接运算中涉及的阶段是(1-J1)笛卡尔积、(1-J2)ON筛选器 和(1-J3) 添加外部行。 FROM 阶段生成虚拟表 VT1

(1-J1) 笛卡尔积 这个阶段对表运算符涉及的两个表执行笛卡尔积(交叉连接),生成虚拟表 VT1-J1

(1-J2)ON 筛选器  这个除非对VT1-J1中的行根据ON子句(<on_predicate>)中出现的谓词进行筛选。只有让该谓词取值为true的行,才能插入 VT1-J2中

(1-J3)添加外部行  如果指定了OUTER JOIN(相对于cross join 或者 inner join ),则将保留表(preserved table) 中没有找到匹配的行,作为外部行添加到VT 1-J2中,生成 VT1- J3.

(2)WHERE  这个阶段根据在 WHERE 子句中出现的谓词(<where_predicate>)中对 VT1 中的行进行筛选。只有让谓词计算结果为 TRUE 的行,才能插入 VT2 中。

(3)GROUP BY 按照GROUP BY 子句中指定的列名列表,将 VT2 中的行进行分组,生成 VT3。最终,每个分组只有一个结果行。

(4)HAVING 根据HAVING 子句中出现的谓词(<having_predicate>) 对VT3中的分组进行筛选。只有让谓词计算结果为TRUE的组,才会插入到VT4

(5)SELECT 处理SELECT子句中的元素,产生VT5

(5-1) 计算表达式 计算SELECT 列中的表达式,生成 VT5-1

(5-2) DISTINCT 删除 VT5-1中的重复行,生成 VT5-2

(5-3)TOP 根据ORDER BY 子句定义的逻辑排序,从 VT5-2中选择前面指定数量或百分比的行,生成表 VT5-3

(6) ORDER BY  根据 ORDER BY 子句中指定的列名列表,对 VT5-3中的行进行排序,生成游标 VC6

SQLSERVER 2008 技术内幕 T-SQL查询 笔记1: SQL 执行顺序的更多相关文章

  1. SQLServer 2008 技术内幕——T-SQL 查询 笔记

    原文:SQLServer 2008 技术内幕--T-SQL 查询 笔记 1.SQL编程有许多独特之处,如:面向集合的思维方式.查询元素的逻辑处理顺序.三值逻辑.如果不掌握这些知识就开始用SQL编程,得 ...

  2. sql查询原理和Select执行顺序

    一 sql语句的执行步骤 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2) 语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. 3)视图转换,将涉及视图的 ...

  3. Microsoft SQL Server 2005技术内幕:T-SQL查询笔记

    logical operation:基于微软查询处理概念模型的逻辑操作.例如,联接运算符的physical operation属性表示联接算法(nested loops,merge ,hash)物理运 ...

  4. SQL查询中关键词的执行顺序

    写在前面:最近的工作主要是写SQL脚本,在编写过程中对SQL的执行和解析过程特别混乱不清,造成了想优化却无从下手.为此专门在网上找博文学习,并做了如下总结. 1.查询中常用到的关键词有: SELECT ...

  5. SQL查询中关键字的执行顺序

    SQL语句中的每个关键字都按照顺序往下执行,而每一步操作会生成一个临时表,最后的临时表就是最终结果: FROM <left_table>:from子句返回初始结果集 <join_ty ...

  6. 2008技术内幕:T-SQL语言基础 联接查询摘记

    续 2008技术内幕:T-SQL语言基础 单表查询摘记 第三章 联接查询 Microsoft SQL Server 2008 支持四种表运算符 join(ANSI标准).apply(T-SQL扩展). ...

  7. 2008技术内幕:T-SQL语言基础 单表查询摘记

    这里的摘抄来自<Microsoft SQL Server 2008技术内幕:T-SQL语言基础>,书中用到的案例数据库是这个 TSQLFundamentals2008 ,官网给出的连接是这 ...

  8. 2008技术内幕:T-SQL语言基础

    2008技术内幕:T-SQL语言基础 单表查询摘记 这里的摘抄来自<Microsoft SQL Server 2008技术内幕:T-SQL语言基础>,书中用到的案例数据库是这个 TSQLF ...

  9. 一文读懂一条 SQL 查询语句是如何执行的

    2001 年 MySQL 发布 3.23 版本,自此便开始获得广泛应用,随着不断地升级迭代,至今 MySQL 已经走过了 20 个年头. 为了充分发挥 MySQL 的性能并顺利地使用,就必须正确理解其 ...

随机推荐

  1. pandas的连接函数concat()函数

        pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,   keys=None, levels=No ...

  2. C语言引用连接脚本lds中的符号——清除bss段,c实现方式

    之前我们的启动文件清除bss和拷贝都是通过汇编的方式的实现,但是,我们能够使用C语言,就不使用汇编: 先看连接脚本: SECTIONS { . = 0x30000000; __code_start = ...

  3. 初步理解Python进程的信号通讯

    Reference: http://www.jb51.net/article/63787.htm 信号的概念 信号(signal)--     进程之间通讯的方式,是一种软件中断.一个进程一旦接收到信 ...

  4. Mysql注入绕过姿势

    1.内联绕过 2.编码绕过,如URLEncode编码,ASCII,HEX,unicode编码绕过 or 1=1即%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(9 ...

  5. java基础篇---注解(Annotation)

    一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类.方法.成员变量等)进行关 ...

  6. android手机安全性測试手段

    android手机安全性測试手段 罗列一下自己经常使用的android手机安全性測试攻击手段: 1. fiddler和tcpdump+wireshark抓包分析,模拟改动http请求參数,检验漏洞 2 ...

  7. C#中使用Buffer.BlockCopy()方法将string转换为byte array的方法:

    public static void BlockCopy(Array src, int srcOffset, Array dst, int dstOffset, int count); 将指定数目的字 ...

  8. C++客户端访问Java服务端发布的SOAP模式的WebService接口

    gSOAP是一个绑定SOAP/XML到C/C++语言的工具,使用它可以 简单快速地开发出SOAP/XML的服务器端和客户端 Step1 使用gsoap-2.8\gsoap\bin\win32\wsdl ...

  9. FTDI通用转USB芯片简述

    FTDI公司的FT2232系列芯片可实现USB与异步串行口RS232/RS485.同步串行总线IIC/SPI/JTAG相互通信,市场占有率,使用普遍. FTDI芯片有两种类型的驱动:virtual C ...

  10. Vue路由获取路由参数

    vue路由设置路由参数有2种方式: 1.通过query配置: <router-link :to="{ name:'login',query:{id:1} }">登录&l ...