详解SQL查询语句关键字执行顺序
1. SQL语句的书写顺序
在编写 SQL 查询时,我们通常按照以下顺序书写关键字:
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
例如:
SELECT name, COUNT(*) as count
FROM users
WHERE age > 18
GROUP BY name
HAVING count > 1
ORDER BY count DESC
LIMIT 10;
2. SQL 语句的实际执行顺序
SQL 语句的实际执行顺序与书写顺序不同,以下是 SQL 查询的执行顺序:
FROM
ON
JOIN
WHERE
GROUP BY
HAVING
SELECT
DISTINCT
ORDER BY
LIMIT/OFFSET
3. 各关键字的执行顺序详解
1. FROM
作用:确定查询的数据来源(表或子查询)。
执行顺序:首先执行,从指定的表或子查询中加载数据。
示例:
FROM users
2. ON
作用:在 JOIN 操作中指定连接条件。
执行顺序:在 FROM 之后执行,用于过滤 JOIN 的结果。
示例:
FROM users
JOIN orders ON users.id = orders.user_id
3. JOIN
作用:将多个表的数据连接在一起。
执行顺序:在 ON 之后执行,根据连接条件合并数据。
示例:
FROM users
JOIN orders ON users.id = orders.user_id
4. WHERE
作用:过滤数据,保留满足条件的行。
执行顺序:在 FROM 和 JOIN 之后执行,对加载的数据进行过滤。
示例:
FROM users
WHERE age > 18
5. GROUP BY
作用:将数据按指定列分组。
执行顺序:在 WHERE 之后执行,对过滤后的数据进行分组。
示例:
GROUP BY name
6. HAVING
作用:对分组后的数据进行过滤。
执行顺序:在 GROUP BY 之后执行,类似于 WHERE,但用于分组数据。
示例:
HAVING COUNT(*) > 1
7. SELECT
作用:选择需要返回的列或表达式。
执行顺序:在 GROUP BY 和 HAVING 之后执行,确定最终返回的数据。
示例:
SELECT name, COUNT(*) as count
8. DISTINCT
作用:去除重复的行。
执行顺序:在 SELECT 之后执行,对结果集去重。
示例:
SELECT DISTINCT name
9. ORDER BY
作用:对结果集进行排序。
执行顺序:在 SELECT 之后执行,对最终结果进行排序。
示例:
ORDER BY count DESC
10. LIMIT/OFFSET
作用:限制返回的行数或跳过指定的行数。
执行顺序:最后执行,对排序后的结果进行分页。
示例:
LIMIT 10
4.示例分析
以下是一个完整的 SQL 查询示例及其执行顺序:
SELECT name, COUNT(*) as count
FROM users
JOIN orders ON users.id = orders.user_id
WHERE age > 18
GROUP BY name
HAVING count > 1
ORDER BY count DESC
LIMIT 10;
执行顺序:
FROM users
:加载users
表的数据。JOIN orders ON users.id = orders.user_id
:将users
表和orders
表连接。WHERE age > 18
:过滤出age > 18
的行。GROUP BY name
:按name
列分组。HAVING count > 1
:过滤出分组后count > 1
的组。SELECT name, COUNT(*) as count
:选择name
和count
列。ORDER BY count DESC
:按count
列降序排序。LIMIT 10
:返回前 10 行。
5. 总结
- SQL 语句的执行顺序与书写顺序不同,理解执行顺序有助于优化查询性能。
- 关键字的执行顺序为:
FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT/OFFSET
。 - 在实际开发中,应尽量避免在 WHERE 和 HAVING 中使用复杂的计算,以减少查询的开销。
通过掌握 SQL 语句的执行顺序,我们可以更好地编写高效、可维护的查询语句,并深入理解 SQL 查询的底层逻辑。