Skip to content

Sql执行顺序

SQL 查询语句执行步骤详解

执行步骤及示例

执行步骤SQL 示例部分描述
1. FROM 子句FROM table1 JOIN table2 ON table1.id = table2.id首先确定要查询的数据来源,包括要查询的表以及它们之间的连接关系。在这个例子中,table1table2通过id字段进行连接,这一步会生成一个临时的笛卡尔积结果集(如果没有ON条件限制的话),但因为有连接条件,会根据条件筛选出符合连接要求的行组合。
2. WHERE 子句WHERE table1.status = 'active' AND table2.amount > 100在第一步生成的临时结果集基础上,根据WHERE条件筛选行。这里只保留table1statusactivetable2amount大于 100 的行组合。
3. GROUP BY 子句(如果有)GROUP BY table1.category如果查询中有GROUP BY子句,此时会按照指定的列(这里是table1.category)对数据进行分组。这一步会将之前筛选后的结果集按照分组列的值进行分组,将相同组别的行组合在一起。
4. HAVING 子句(如果有)HAVING COUNT(table2.id) > 1如果有HAVING子句,会在GROUP BY分组后的结果集上进行筛选。这里只保留分组后table2.id的计数大于 1 的组。
5. SELECT 子句SELECT table1.category, SUM(table2.amount)从经过前面步骤筛选和分组后的结果集中选择需要的列或表达式。在这个例子中,选择table1.category列和table2.amount列的总和。如果查询中有表达式,如聚合函数(SUMCOUNT等),会在这一步进行计算。
6. ORDER BY 子句(如果有)ORDER BY SUM(table2.amount) DESC如果有ORDER BY子句,会根据指定的列或表达式(这里是SUM(table2.amount))对最终结果集进行排序。DESC表示降序排列,也可以使用ASC表示升序排列。

复杂情况说明

如果查询涉及子查询、窗口函数等复杂情况,执行顺序会更加复杂,不过基本原则仍然适用。子查询通常会先执行,窗口函数会在分组等操作后执行(具体取决于其定义位置和用途)。