select的书写顺序和执行顺序
时间: 2025-04-02 18:07:08 浏览: 36
在SQL查询中,`SELECT`语句的书写顺序和实际执行顺序是有区别的。理解这一点对于优化查询性能非常重要。
### SELECT 的书写顺序:
标准 SQL 查询的基本结构如下:
```sql
SELECT 列名列表
FROM 表名
WHERE 条件表达式
GROUP BY 分组列
HAVING 筛选条件
ORDER BY 排序列;
```
**书写的典型顺序:**
1. **SELECT**: 指定需要检索哪些字段。
2. **FROM**: 定义数据来源表或视图。
3. **WHERE**: 设置过滤条件以限制返回行数。
4. **GROUP BY**: 将结果集按指定列分组(通常用于聚合函数)。
5. **HAVING**: 对已经完成分组的数据设置筛选条件。
6. **ORDER BY**: 规定排序规则对最终输出的结果排序。
---
### 执行顺序
尽管我们按照上述语法来编写 `SELECT` 语句,但是数据库引擎内部会调整执行计划,并非完全依照这个顺序处理每一部分。一般来说,其真实的物理执行流程更接近于以下步骤:
1. **FROM**: 首先确定操作的基础表或者联结后的临时结果集。
- 如果有 JOIN 子句,则在此阶段进行连接运算生成新的记录集合;
2. **ON (如果存在)**: 这是在 JOIN 中使用的约束条件,在这里判断是否符合条件加入新纪录;
3. **OUTER (如果有外链接的情况)**: 在此步计算外部联合的相关信息;
4. **WHERE**: 应用 WHERE 子句中的条件进一步缩小数据范围;
5. **GROUP BY**: 根据 GROUP BY 字段值将当前结果集中所有行划分为若干个小组;
6. **AGGREGATE FUNCTIONS & HAVING**: 此处开始应用聚集函数如 SUM(), COUNT()等并同时检查 HAVING 后面附加的额外限定条件;
7. **SELECT**: 最终选择投影出所需的列(包括别名转换),这一步决定了用户可见的内容是什么样子的;
8. **DISTINCT (若有 distinct 关键字)**: 去除重复项;
9. **ORDER BY**: 实施 ORDER BY 提供的一系列指令来进行最后排版整理工作前最后一次重组动作;
10. **LIMIT/OFFSET(若支持这两种机制的话)** : 控制总条目显示数目以及起始位置设定。
---
#### 示例说明:
假设有这样一个 SQL 请求:
```sql
SELECT product_name, AVG(price) AS avg_price
FROM products
JOIN sales ON products.id = sales.product_id
WHERE sale_date >= '2023-01-01' AND category='Electronics'
GROUP BY product_name
HAVING AVG(price)>100
ORDER BY avg_price DESC LIMIT 10 ;
```
虽然我们在脚本里首先写下的是 “SELECT”,但在运行期间它却是最后一个被执行的部分!
---
阅读全文
相关推荐

















