sqlserver语句执行顺序

SQL Server查询详解:逐步生成虚拟表的过程

在这里插入图片描述
注:sql server 不同于其他编程预言的最明显特征是处理代码的顺序。
每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只有最后一步生成的表才会返回给调用者。如果没有在查询中指定某一子句,将跳过相应的步骤。

 1》FROM:对from子句中前两个表执行笛卡尔积(交叉联接 ),生成虚拟表VT1;

 2》ON :对VT1应用on筛选器。只有那些使ON筛选条件为真的行才被插入VT2;

 3》OUTER(JOIN):如果指定了OUTER JOIN (相对与CROSS JOIN或者INNER JOIN),保留表中未找到匹配的行将作为外部行添加到VT2,生成VT3;如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3;只到处理完所有的表为止;

4》WHERE:对VT3应用WHERE筛选器,只有使WHERE筛选条件为TRUE的行才被插入VT4;

5》GROUP BY:按group by子句中的列列表对VT中的行分组,生成VT5;

6》CUBE|ROLLUP:把超组插入VT5,生成VT6;

7》HAVING:对VT6应用having筛选器,只有使条件为TRUE的组才被插入VT7;

8》SELECT:处理select列表,生成VT8;

9》DISTINCT:将重复的行从VT8中移除,生成VT9;

10》ORDER BY:将VT9中的行按order by子句中的列列表排序,生成一个游标 (VC10);

11》TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回给调用者。
### SQL Server 查询执行顺序解析 SQL Server 中的查询执行顺序是指在处理 SQL 查询时,各个子句的实际执行次序。尽管查询是以书写顺序呈现给用户的,但实际上其内部逻辑处理遵循特定的顺序。以下是 SQL Server 查询的主要执行阶段及其顺序: #### 1. FROM 和 JOIN `FROM` 子句用于指定查询的数据源表或视图。在此阶段,SQL Server 将确定参与查询的基础数据集,并应用任何 `JOIN` 条件以组合多个表的内容[^2]。 #### 2. WHERE `WHERE` 子句用于筛选满足条件的记录。此阶段会基于前面构建的虚拟表进一步缩小范围,仅保留符合条件的行[^3]。 #### 3. GROUP BY 如果存在聚合函数(如 `SUM()`、`COUNT()`),则需要先对数据进行分组。`GROUP BY` 子句定义了如何将数据划分为不同的组以便后续计算[^1]。 #### 4. HAVING 类似于 `WHERE`,但作用于分组后的结果集合。它允许我们过滤掉不符合某些条件的分组。 #### 5. SELECT 此时才真正选取所需的列。值得注意的是,在这个阶段还可以引入派生列或者调用内置函数等操作。 #### 6. DISTINCT 如果有重复项,则会在这一环节去除冗余条目。 #### 7. ORDER BY 最后一步是对最终的结果集按照指定字段排序。需要注意的是,这里并不创建新的物理表而是生成一个有序游标[^4]。 #### 性能优化建议 为了提升查询效率,应考虑以下几个方面: - **避免不必要的全表扫描**:尽量不用 `!=` 或 `< >` 这样的比较运算符。 - **合理利用索引**:针对频繁访问的关键字段建立适当类型的索引结构。 - **精确请求所需信息**:不要滥用通配符 `*` ,明确指出感兴趣的属性名即可。 - **采用参数化方式提交动态SQL语句** :这样有助于缓存机制发挥作用进而加快响应速度。 ```sql -- 示例代码展示了一个典型的SQL Server查询过程 SELECT CustomerName, SUM(OrderAmount) AS TotalOrders FROM Customers c INNER JOIN Orders o ON c.CustomerID = o.CustomerID WHERE OrderDate >= '2023-01-01' GROUP BY CustomerName HAVING SUM(OrderAmount) > 1000 ORDER BY TotalOrders DESC; ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值