
本文共 1234 字,大约阅读时间需要 4 分钟。
SQL 执行顺序解析
在实际操作 SQL 时,理解其执行顺序对于写出高效查询至关重要。以下是 SQL 语句执行的标准流程:
1. 从 (FROM)
从子句用于指定要查询的表。选择相对小的表作为基础表,因为这可以减少内存占用和提高查询效率。
2. 连接 (JOIN)
在从子句中指定了表后,接下来是连接子句。根据需要使用 INNER JOIN、LEFT JOIN 或 RIGHT JOIN:
- INNER JOIN:只返回两个表中都存在的记录。
- LEFT JOIN:返回左表的所有记录,右表存在的记录则与之匹配,不存在的则填充为空。
- RIGHT JOIN:返回右表的所有记录,左表存在的记录则与之匹配,不存在的则填充为空。
执行连接时,会生成一个虚拟表(virtual table 2),并在这一步中添加外部行(如使用了 OUTER JOIN)。
3. ON 条件
在连接子句后,应用 ON 条件筛选。ON 条件用于连接两个表,并根据逻辑表达式筛选出满足条件的行,生成虚拟表 2。ON 条件的重要性在于它可以在后续步骤中恢复外部行(如使用了 OUTER JOIN)。
4. WHERE 筛选
WHERE 筛选器用于对虚拟表 2 进行筛选,生成虚拟表 3。与 ON 条件不同,WHERE 条件的筛选是不可逆的,一旦筛选出记录就无法恢复。
5. 分组 (GROUP BY)
GROUP BY 子句用于将具有相同属性的行分组。在这一步中,虚拟表 3 生成虚拟表 4。需要注意的是,GROUP BY 会将重复的行合并成一组,只返回每组的唯一值。
6. 聚合函数 (COUNT, AVG, SUM 等)
在分组后,执行聚合函数,如 COUNT、AVG、SUM 等,生成虚拟表 5。这些函数会根据分组结果计算统计值。
7. HAVING 筛选
HAVING 筛选器用于对分组后的虚拟表 5 进行筛选,生成虚拟表 6。HAVING 是唯一一个用于对组的筛选器。
8. SELECT 列
在 HAVING 筛选后,执行 SELECT 列子句,生成虚拟表 7。SELECT 列子句用于从虚拟表 7 中筛选出所需的列。
9. 去重 (DISTINCT)
去重子句用于去除虚拟表 7 中重复的行,生成虚拟表 8。需要注意的是,如果在分组后已经合并了相同的行,去重的效果可能会产生冗余。
10. 排序 (ORDER BY)
最后,应用 ORDER BY 子句,按照指定的条件对虚拟表 8 进行排序,生成最终的结果。重要的是,排序是在查询执行过程中完成的,返回的是一个游标,而不是虚拟表。
构 分 筛 去 排
构造表 (FROM join on where) → 分组 (group by having count) → 筛选列 (select) → 去重 (distinct) → 排序 (order by)
这个流程确保了 SQL 查询的高效性和准确性,同时也帮助我们理解数据库查询的底层原理。
发表评论
最新留言
关于作者
