sql语句执行序列详细解决方案
我们的大多数软件开发人员都离不开处理数据库,尤其是那些由ERP开发的数据库,这些数据库更为频繁。由于SQL不同于其他编程语言,最明显的特点是处理代码的顺序。在大编程语言中,代码是按编码顺序进行处理的,但在sql语言中,第一个处理子句是从子句。尽管SELECT语句第一次出现,但它几乎总是最后处理。每一步生成一个虚表,作为下一步的输入。这些虚拟表不提供给调用者(客户端应用程序或外部查询),该表的最后一步将返回给调用者,如果条款中没有指定的查询,相应的步骤会被跳过。以下是一个简单的描述的逻辑步骤,SQL Server 2000和SQL Server 2005。
(8)选择(9)明确的(11)
(1)从left_table } {
(3)加入
(2)关于
(4)在何处
(5)按组
(6)
(7)有
(10)按顺序
逻辑查询处理过程简介
来自:执行笛卡儿积(积)(交叉连接)在FROM子句生成虚拟表VT1第一个表
在应用对滤波器对VT1。只有那些真正的线插入VT2。
外(加入):如果外连接指定的(相对于跨(内连接)或加入(保存:表、预约表左外连接标志左表为预约表,右外部联接标记右表为预约表,全外连接两个表标记为保留表)没有发现,作为外部行添加到VT2、VT3。如果from子句包含一个连接表中的两个以上表,并在表重复步骤1到步骤3时生成结果,直到处理完所有表为止。
其中:应用在滤波器VT3。只有行,使真正的插入VT4。
组:组VT4行由GROUP BY子句中的列的列表生成VT5。
立方体|汇总:插入超级组(把超组)到VT5生成VT6。
有:应用具有过滤器的VT6。只有集体的使真正的插入VT7。
选择:选择列表和vt8生产加工。
明显的:删除重复行vt8产生VT9。
按:在VT9的行是由在ORDERBY子句中的列的列表进行排序,并将光标(VC10)产生。
上图:选择从VC10开始一行指定的数量或比例,生成表vt11,并返回到调用者。
注:步骤10,根据列表中的顺序,在子句返回排名,光标返回VC10。这一步是第一个也是唯一的一步可以使用列别名选择列表的步骤。这一步是不同于其他的步骤,和它不返回有效的表,但返回一个cursor.sql是基于集合论,集合不提前订购其行;它只是一个逻辑组的成员,和其成员的顺序是无关紧要的。查询排序表可以返回一个对象,包括组织在一个特定的物理order.ansi行调用该对象的一个指针。理解这一步是正确理解SQL的基础。
因为这一步不回表(但返回光标),使用ORDER BY子句的查询不能被用来作为一个表。表表达式包括视图、内联表值函数、子查询、派生表和常用表达,其结果必须返回到客户端应用程序,有望获得一个物理记录。例如,下面的派生表查询是无效的,产生一个错误:
选择*
从(选择行,CustomerID从OrderID为了订单)
D
下面的视图也会产生错误
创建视图my_view
作为
选择*
从订单
以行
在SQL中,表表达式不允许使用逐项子句使用查询,而T - sql中有一个异常(应用顶部选项)。
所以请记住,不要假设表中的行有任何特定的顺序。换句话说,不要指定按订单子句,除非你确定要按顺序进行排序。排序是有成本效益的,而SQL Server需要执行有序的索引扫描或使用排序运行字符。
好了,这是本教程的结尾。我相信您对SQL语句执行序列有更多的了解。更多的知识,请访问官方网站了解更多。