逻辑处理的各个阶段

逻辑查询的各个阶段

Sql与其他编程语言不同的最明显特征是代码的处理顺序,在大多数的变成语言中,代码是按照编写顺序来执行的。但是在SQL中,第一个要处理的子句是FROM子句,尽管SELECT语句第一个出现,但是它总是放在最后处理。

Sql的每一步都会生成一个虚拟表,该虚拟表作为下一步的输入。这些虚拟表对于调用者是不可用的,只有最后一步生成的虚拟表才会返回给调用者。如果在查询中没有指定某一个子句,则会跳过相应的步骤。

第一步:Sql查询语句进入FROM子句,如果存在一个表运算符,则根据表运算符的类型(JOIN、APPLY、PIVOT、UNPIVOT)进行运算。(JOIN处理步骤1.笛卡尔积 2.ON筛选器 3.添加外部行 ;PIVOT处理步骤:1.分组,2.扩展,3.聚合)处理完,如果有其他表运算符则循环继续处理。

例句:该SQL首先进入FORM子句,遇到 JOIN关键字,(LEFT OUTER是JOIN的修饰符),那么则执行JOIN的第一步笛卡尔积,然后再进行ON筛选器。如图:

这一步执行笛卡尔积(交叉连接),如果左表包含n行,右表包含m行,则笛卡尔积则生成(n*m行)。然后进行ON筛选。ON的逻辑值有三种:TRUE/FALSE/UNKONW。然后根据ON筛选的TRUE的插入到新生成的虚拟表中,如下图。第三步添加外部行。这时候进行Left Outer Join,由于是Left join,则把左表标记为保留表,尽管左边的表在进行ON的逻辑运算的时候,一些值没有匹配上,但是我们仍然把左表没有匹配上的数据进行

添加外部行,外部行非保留的表的属性为NULL。

第二步:

进行Where的处理。需要注意的就是Where子句还没有进行分组,所以不能使用聚合函数。使用聚合函数只有在Having的子句进行使用。也不能使用Select 列表的别名。因为Select 语句还未执行。因为使用左连接所以,如果在ON处进行我们想要的逻辑判断,那么会在ON筛选条件的外表行处把逻辑条件判断相关的也添加到虚拟表。所以如果不是使用的Inner join的话,则相关的逻辑判断在Where子句中进行判断。

第三步

进行Group by的分组。在Where条件的生效后的虚拟表进行分组。

第四步:

进行Having,这时候的Having后面的根据的聚合函数里面指定的列的就需要根据条件去判断不同列就是不同的结果。(因为如果Count(NUll)与Count(*)的结果不一样,COUNT(NULL)结果为0,COUNT(*)结果为1)而且子查询不能作为聚合函数的输入。

第五步:

进行SELECT,SELECT步骤里面进行1.计算表达式。2.进行DISTINCT子句,3.应用TOP

SQL交换两个列的值: UPDATE dbo.Customers SET customerid=city,city=customerid

TOP的应用,根据什么顺序进行排序,是根据ORDER By 或者WITH TIES,如果没有指定Order by的话,那么每次查询的返回的top就可能不确定,因为恰巧先访问了。

第六步:

进行ORDER by,这里Order by是唯一可以使用select 列的别名。Order by 返回的不是一个有效的表,是一个游标。

在SQL中,集合论最重要,而集合是没有预先定义的顺序的,它只是一种逻辑的组合,成员之间的顺序是无关紧要的,对于带有排序的作用的Order by子句的查询,可以返回一个对象,其中的行是按照特定的顺序组织在一起的。这是我们可以把这种对象成为游标。

如果在最外层查询使用top,那么order by 子句有两个含义:1.为top进行逻辑排序,2.为游标进行排序定义。

如果在以下情况使用那么order by 就只是为top进行逻辑顺序,而不保证结果排序

表运算符

1.JOIN

<left_table_expression> {cross|inner|outer} join <right_table_expression>

执行步骤:

  1. 笛卡尔积
  2. 应用ON筛选器
  3. 添加外部行

2.APPLY

<left_table_expression> {cross|outer} apply <right_table_expression>

执行步骤:

1.把右表的表达式应用于左表的行

2.添加外部行(添加未匹配的为NULL的数据)

CROSS APPLY和OUTER APPLY都包含步骤1,但是只有OUTER APPLY才包含步骤2

3.PIVOT

Pivot(聚合函数(得到结果的列) for (根据的条件的列) in(条件列的集合))

4.OVER子句

可以随聚合函数一起使用,它也是分析排名函数的需要要求的元素

集合运算符

集合运算符有:union all 、union、except、intersect

Union all :返回两个输入中所有行的结果,包括相同的

Union:返回两个输入中不相同的行

Except:返回在第一个中出现的,但是不再第二个中出现的,数学上讲:求两个集合的差集

Intersect:返回两个输入中都出现过的不同行,数学上讲:求两个集合的交集

时间: 2024-08-03 23:48:19

逻辑处理的各个阶段的相关文章

lvm 2(逻辑卷管理)基础详解

目录 ◆ 什么是逻辑卷(lvm)及其有什么优点 ◆ 逻辑卷的组成和基础概念 ◆逻辑卷原理图 ◆ lvm的实现流程 ◆ 放大lV容量 ◆ 缩小lv容量 ◆ LVM的系统快照 ◆ 练习题 *什么是逻辑卷? LVM是Logical Volume Manager(逻辑卷管理器)的简写.是Linux核心所提供的逻辑卷管理(Logical Volume Management)功能.它在硬盘的硬盘分区之上,又创建了一个逻辑层以方便系统管理硬盘分区系统.LVM的做法是将任何块设备(分区,硬盘,raid)通过软件

ASP.NET页面生命周期与控件生命周期

ASP.NET页面生命周期 (1)PreInit 预初始化(2)Init 初始化(3)InitComplete 初始化完成(4)PreLoad 预加载(5)Load 加载(6)LoadComplete 加载完成(7)PreRender 预输出(8)PreRenderComplete 预输出完成(9)Unload 卸载 ASP.NET控件生命周期 -- 实例化(Instantiate) 控件被页面或另一个控件通过调用它的构造器所实例化.这个步骤之后所列出的阶段,仅当控件加入控件树中才会发生. --

Mysql binlog 详细解读

Mysql的binlog主要用于逻辑同步以及二阶段提交的安全性保证,而在平时的使用中我们DBA也会从中获取一些重要的信息,比如说主从同步延迟了我们可以通过binlog查看当前事务执行的内容,比如可以利用binlog+备份的方式进行误删回滚,开源工具中也有很多利用binlog做闪回.同步数据到缓存中的方案,异地多活的高可用框架完成后有点空闲就对binlog的组成深入了解了下(基于mysql5.7版本,binlog版本v4),mysql 5.0之后binlog都采用的v4版本,结构如下分为heade

万法简史:肯恩&#183;威尔伯的典范革命

2015-05-27                                                 李孟浩                                                 心灵自由                         心灵自由 心灵自由                                 微信号                                 freedomloveaction 功能介绍          

Android自学历程—围住神经猫开发

学习核心内容: 1. 学会SurfaceView的绘图技巧. 2. 掌握神经猫的游戏逻辑设计. 第一阶段主要完成内容: 并且创建游戏所需的类,搭建基本的代码结构. 创建一个二维数组,用于保存游戏场景,并且将场景初始化. SurfaceView中根据场景数据,在界面中绘制点阵. 先上代码 1 package com.ryan.catchcrazycat; 2 3 /** 4 * Created by air on 15-8-1. 5 */ 6 public class Dot { 7 8 /* 9

服务器控件生命周期

服务器控件生命周期 服务器控件的生命周期是创建服务器控件最重要的概念.作为开发人员,必须对服务器控件生命周期深刻理解.当然,这不是一朝一夕就可以做到的.对于学习控件开发技术的初学者,可以不必掌握得非常详细深入,只需对服务器控件的生命周期中的不同阶段有一个大致的了解即可. 在掌握服务器控件生命周期的过程中,读者要特别注意有关服务器控件状态的相关内容.在重点了解生命周期各个阶段的同时,对服务器控件的状态变化要注意以下问题:控件的生命周期何时保存控件和恢复其状态:何时与页面及其他控件之间进行交互:何时

分布式事务解决方案(转载)

目前的应用系统,不管是企业级应用还是互联网应用,最终数据的一致性是每个应用系统都要面临的问题,随着分布式的逐渐普及,数据一致性更加艰难,但是也很难有银弹的解决方案,也并不是引入特定的中间件或者特定的开源框架能够解决的,更多的还是看业务场景,根据场景来给出解决方案.根据笔者最近几年的了解,总结了几个点,更多的应用系统在编码的时候,更加关注数据的一致性,这样系统才是健壮的. 一.基础理论 目前关于事务的几大理论包括:ACID事务特性,CAP分布式理论,以及BASE等.ACID在数据库事务中体现,CA

回归架构本真:从规划、思维到设计,构建坚不可摧的架构根基

一.什么是架构 关于什么是架构,业界从来没有一个统一的定义.Martin Fowler在<企业应用架构模式>中也没有对其给出定义,只是提到能够统一的内容有两点: 最高层次的系统分解: 系统中不易改变的决定. <软件架构设计>一书则将架构定义总结为组成派和决策派: 组成派:架构=组件+交互:软件系统的架构将系统描述为计算组件及组件之间的交互. 决策派:架构=重要决策集:软件架构是在一些重要方面所作出的决策的集合. 而架构的概念最初来源于建筑,因此,我想从建筑的角度去思考这个问题.Wi

.net面試4套

一 1. 面向对象的思想主要包括什么? 答: 继承,多态,封装,类,对象,接口,聚集,聚合,泛化 2. 什么是ASP.net中的用户控件 答: 用户控件就是使用.ascx作为扩展名的文件,其将多种服务器端控件组合在一起,作为一个单独的控件服务于页面.这种用户控件存在的问题如,将其拖到不同级别的目录下后里面的图片等的相对路径会变得不准确.需要自已写方法调整. 3.什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS.CLS和CLR分别作何解释? 答: 应用程