SQLServer查询处理中的每个阶段的示例(SQL执行顺序)
在大型程序设计语言中,代码按编码顺序进行处理,而在sql语言中,第一个处理子句是从子句。尽管SELECT语句第一次出现,但它几乎总是最后处理。每一步生成一个虚表,作为下一步的输入。这些虚拟表不提供给调用者(客户端应用程序或外部查询),该表的最后一步将返回给调用者,如果条款中没有指定的查询,相应的步骤会被跳过。以下是一个简单的描述的逻辑步骤,SQL Server 2000和SQL Server 2005。
复制代码代码如下所示:
(8)选择(9)明确的(11)
(1)从left_table } {
(3)加入
(2)关于
(4)在何处
(5)按组
(6)
(7)有
(10)按顺序
逻辑查询处理过程简介
1.from:执行笛卡儿积(积)(交叉连接)在FROM子句生成虚拟表VT1第一个表
2.on:应用过滤器到VT1。只有那些真正的线插入VT2。
3.outer(加入):如果外连接指定的(相对于跨(内连接)或加入(保存:表、预约表左外连接标志左表为预约表,右外部联接标记右表为预约表,全外连接的两桌左侧的标记不是保罗)找到匹配的外部行添加到VT2、VT3产生的。如果from子句包含一个连接表中的两个以上表,并在表重复步骤1到步骤3时生成结果,直到处理完所有表为止。
4.where:应用在滤波器VT3。只有行,使真正的插入VT4。
5.group:组VT4行由GROUP BY子句中的列的列表生成VT5。
6。立方体|汇总:插入超级组(把超组)到VT5生成VT6。
7.having:应用具有过滤器的VT6。只有集体的使真正的插入VT7。
8.select:处理选择列表,处理各种各样的积累功能,并产生vt8。
9.distinct:删除重复行vt8产生VT9。
10.order:在VT9的行是由在ORDERBY子句中的列的列表进行排序,并将光标(VC10)产生。
11.top:选择从VC10开始一行指定的数量或比例,生成表vt11,并返回到调用者。
注:步骤10,根据列表中的顺序,在子句返回排名,光标返回VC10。这一步是第一个也是唯一的一步可以使用列别名选择列表的步骤。这一步是不同于其他的步骤,和它不返回有效的表,但返回一个cursor.sql是基于集合论,集合不提前订购其行;它只是一个逻辑组的成员,和其成员的顺序是无关紧要的。查询排序表可以返回一个对象,包括组织在一个特定的物理order.ansi行调用该对象的一个指针。理解这一步是正确理解SQL的基础。
因为这一步不回表(但返回光标),使用ORDER BY子句的查询不能被用来作为一个表。表表达式包括视图、内联表值函数、子查询、派生表和常用表达,其结果必须返回到客户端应用程序,有望获得一个物理记录。例如,下面的派生表查询是无效的,产生一个错误:
复制代码代码如下所示:
选择*
从(选择行,CustomerID从OrderID为了订单)
D
下面的视图也会产生错误
复制代码代码如下所示:
创建视图my_view
作为
选择*
从订单
以行
错误信息:味精1033,级别15,状态1,程序my_viewasselect,线2the ORDER BY子句无效在视图、内联函数、派生表,子查询,公用表表达式,除非顶部或XML也指定。在SQL中,表不允许在查询表达式中使用带子句的命令,而T - sql是一个例外(top选项)。
所以请记住,不要假设表中的行有任何特定的顺序。换句话说,不要指定按订单子句,除非你确定要按顺序进行排序。排序是有成本效益的,而SQL Server需要执行有序的索引扫描或使用排序运行字符。
推荐一段SQL代码:行和列转置
复制代码代码如下所示:
/ *的问题:假设张雪胜评分表(TB):
名称课程成绩
张三的语言74
张三数学83
张三物理93
Li Si的语言74
Li Si数学84
李四物理94
想成为(获得以下结果):
名称语言的数学物理
----
Li Si 748494
张三748393
-------------------
* /
创建测试表(name varchar(10),(10),部分课程varchar int)
插入的TB值('zhang三','语言',74)
插入的TB值('zhang三、数学,83)
插入的TB值('zhang三','物理',93)
插入的TB值(李四','语言',74)
插入的TB值(李四、数学,84)
插入的TB值(李四','物理',94)
去
——SQL Server 2000静态SQL,指的课程只有语言、数学、物理三门课程(以下内容相同)。
选择名称作为名称,
马克斯(案例课什么时候,然后评分0结束),
马克斯(案例课程数学然后得分0结束),
马克斯(案例课程物理然后分数其他0结束)物理
西霸
组的名称