T-SQL查询的逻辑处理过程
对于一个查询SQL而言,通常将其逻辑处理过程分成7个大的阶段
分别是:
1.FROM
2.WHERE
3.GROUP BY
4.HAVING
5.SELECT
6.ORDER BY
7.TOP/OFFSET/FETCH
1、SQL语句执行阶段示例.
(5)select (5-2) distinct(5-3) top(<top_specification>)(5-1)<select_list>
(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 <where_pridicate>
(3)group by <group_by_specification>
(4)having<having_predicate>
(6)order by<order_by_list>
2、流程图

流程:
1.FROM:该步骤用于验证查询的源表,并处理表操作符,生成虚拟表VT1
1-1.如果存在左表和右表的交叉连接(求笛卡尔积),生成一个虚拟表VT1_1.
1-2.对笛卡尔积(VT1)应用ON筛选器,生成虚拟表VT1_2.
1-3.如果是外部连接,1-2中被过滤掉的数据将会被重新添加到虚拟表VT1_2中,生成虚拟表VT1_3.
2.WHERE:对虚拟表VT1应用WHERE筛选器,生成虚拟表VT2
3.GROUP BY:将VT2中的数据进行分组,生成VT3,如果语句包含WITH CUBE 或者WITH ROLLUP语句,则将分组统计结果再次加总后插入VT3,生成VT3_1.
4.HAVING:对VT3虚拟表应用HAVING筛选器,生成虚拟表VT4.
5.SELECT:处理SELECT中的子元素,生成虚拟表VT5.
5-1.计算表达式:处理SELECT列表中的计算表达式,生成VT5_1.
5-2.DISTINCT:处理VT5_1中的重复行,生成VT5_2.
6.ORDER BY:对VT5_2进行排序,生成一个游标VT6
6-1.该步骤中已经可以使用SELECT列表中的列别名
6-2.ORDER BY子句是应用到最终结果集上的,因此当SQL中出现UNION等关键字时,ORDER BY执行顺序在UNION操作之后.
7.TOP:根据ORDER BY子句中指定的排序规则,从VT6中筛选指定数量的行
参考资料:王晓文、张洪举<<锋利的SQL>>
T-SQL查询的逻辑处理过程的更多相关文章
- C# EF使用SqlQuery直接操作SQL查询语句或者执行过程
Entity Framework是微软出品的高级ORM框架,大多数.NET开发者对这个ORM框架应该不会陌生.本文主要罗列在.NET(ASP.NET/WINFORM)应用程序开发中使用Entity F ...
- .NET Entity Framework(EF)使用SqlQuery直接操作SQL查询语句或者执行过程
Entity Framework是微软出品的高级ORM框架,大多数.NET开发者对这个ORM框架应该不会陌生.本文主要罗列在.NET(ASP.NET/WINFORM)应用程序开发中使用Entity F ...
- 详细分析SQL语句逻辑执行过程和相关语法
本文目录: 1.SQL语句的逻辑处理顺序 1.2 各数据库系统的语句逻辑处理顺序 1.2.1 SQL Server和Oracle的逻辑执行顺序 1.2.2 MariaDB的逻辑执行顺序 1.2.3 M ...
- SQL查询(医疗项目的SQL复习)
内容来自于
- mysql体系结构和sql查询执行过程简析
一: mysql体系结构 1)Connectors 不同语言与 SQL 的交互 2)Management Serveices & Utilities 系统管理和控制工具 备份和恢复的安全性,复 ...
- SQL SERVER 2008:内部查询处理器错误: 查询处理器在执行过程中遇到意外错误
今天一个同事突然告诉我,以前跑得很正常的一个SQL语句,执行时突然报如下错误: 消息1222,级别16,状态18,第1 行 已超过了锁请求超时时段. ...
- SQL 查询的执行过程
所述内容均来自互联网,文章仅作为学习笔记,备忘使用. 有时候我在想我们总是在谈优化,FA 优化结构.优化框架.优化程序…,可是我真的了解将要进行的操作[优化]吗?以最近我的工作-优化SQL为例,我真的 ...
- SQL查询语句执行的逻辑顺序
一.简介 大家都知道SELECT语句是用来查询数据表中的数据的,构成SELECT语句的还有各种元素(where.from.group by等),不同元素又代表了不同的处理逻辑,那么这些元素在执行查询时 ...
- Oracle常用SQL查询(2)
三.查看数据库的SQL 1 .查看表空间的名称及大小 select t.tablespace_name, round ( sum (bytes / ( 1024 * 1024 )), 0 ) ts ...
随机推荐
- 好文:javascript中的四种循环
https://juejin.im/entry/5a1654e951882554b8373622?utm_medium=hao.caibaojian.com&utm_source=hao.ca ...
- 关于json.stringify的注意事项
今天通过navigator.getCurrentPosition中的success回调,用json.stringify打印postion时,怎么打印都只是一个{}, 而打印postion.coords ...
- linux命令学习之:route
我们在网络基础的时候谈过关于路由的问题,两台主机之间一定要有路由才能够互通TCP/IP的协议,否则就无法进行联机.一般来说,只要有网络接口,该接口就会产生一个路由,例如:eth0及lo. route命 ...
- python调试工具pdb
pdb是基于命令行的调试工具,非常类似gnu的gdb(调试c/c++). 命令 简写命令 作用 break b 设置断点 continue c 继续执行程序 list l 查看当前行的代码段 step ...
- ECharts动态获取后台传过来的json数据进行多个折线图的显示,折线的数据由后台传过来
ECharts 多个折线图动态获取json数据 效果图如下: 一.html部分 <p id="TwoLineChart" style="width:100%; he ...
- 在pom.xml中引入jar包坐标的依赖范围
A依赖B,需要在A的pom.xml文件中添加B的坐标,添加坐标时需要指定依赖范围,依赖范围包括: compile:编译范围,指A在编译时依赖B,此范围为默认依赖范围.编译范围的依赖会用在编译.测试.运 ...
- 分享插件的使用加一个echart走数据
html部分: <div class="topLink clearfix bdsharebuttonbox bdshare-button-style0-16" data-b ...
- c#devexpress GridContorl添加进度条
demo 的实现图 下边是步骤和代码 1定义 时钟事件,定时的增加进度条的增量. 2: 添加进度条 3;定义字段属性 using System; using System.Collections.G ...
- (转)HTTP 错误 404.2 - Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面
详细错误:HTTP 错误 404.2 - Not Found. 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面. 出现环境:win7 + IIS7.0 解决办法 ...
- poj 2528(线段树+离散化) 市长的海报
http://poj.org/problem?id=2528 题目大意是市长竞选要贴海报,给出墙的长度和依次张贴的海报的长度区间(参考题目给的图),问最后你能看见的海报有几张 就是有的先贴的海报可能会 ...