SQL的逻辑执行顺序 (与书写顺序不同)和完整关键字如下:
一、SQL逻辑执行顺序(关键)
sql
(8) SELECT (9) DISTINCT (10) TOP 列名/聚合函数
(1) FROM 表/子查询
(3) JOIN 表 ON 连接条件
(2) ON JOIN连接条件
(4) WHERE 行过滤条件
(5) GROUP BY 分组列
(6) WITH CUBE/ROLLUP (部分数据库)
(7) HAVING 分组后过滤
(11) ORDER BY 排序列
(12) LIMIT/OFFSET/FETCH (MySQL: LIMIT, SQL Server: TOP/FETCH, Oracle: ROWNUM/FETCH)
核心记忆:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
二、完整SQL关键字分类
1. 数据查询(DQL)
-
SELECT,FROM,WHERE -
JOIN:INNER,LEFT,RIGHT,FULL,CROSS -
GROUP BY,HAVING -
ORDER BY,LIMIT,OFFSET,FETCH -
UNION,INTERSECT,EXCEPT -
DISTINCT,TOP -
INTO(SELECT INTO)
2. 数据操作(DML)
-
INSERT,UPDATE,DELETE -
MERGE(UPSERT) -
VALUES(配合INSERT)
3. 数据定义(DDL)
-
CREATE,ALTER,DROP -
TRUNCATE,RENAME -
COMMENT(添加注释)
4. 数据控制(DCL)
GRANT,REVOKE,DENY
5. 事务控制(TCL)
-
BEGIN/START TRANSACTION -
COMMIT,ROLLBACK -
SAVEPOINT,RELEASE
6. 其他常用关键字
-
条件/逻辑 :
AND,OR,NOT,IN,BETWEEN,LIKE,IS NULL,EXISTS,CASE,WHEN,THEN,ELSE,END -
聚合 :
COUNT,SUM,AVG,MAX,MIN -
窗口函数 :
ROW_NUMBER(),RANK(),DENSE_RANK(),LAG(),LEAD(),OVER(),PARTITION BY -
集合操作 :
UNION,UNION ALL,INTERSECT,EXCEPT/MINUS -
子查询 :
ANY,ALL,SOME -
类型转换 :
CAST,CONVERT
三、重点说明
WHERE vs HAVING
-
WHERE : 分组前过滤行(不能使用聚合函数)
-
HAVING : 分组后过滤组(可以使用聚合函数)
执行顺序示例
sql
-- 看似复杂的SQL
SELECT dept, AVG(salary) AS avg_salary
FROM employees
WHERE hire_date > '2020-01-01'
GROUP BY dept
HAVING AVG(salary) > 50000
ORDER BY avg_salary DESC
LIMIT 5;
-- 实际执行逻辑:
-- 1. FROM employees
-- 2. WHERE hire_date > '2020-01-01' (先过滤行)
-- 3. GROUP BY dept (再分组)
-- 4. HAVING AVG(salary) > 50000 (过滤分组)
-- 5. SELECT dept, AVG(salary) (最后计算输出)
-- 6. ORDER BY avg_salary DESC
-- 7. LIMIT 5
⚠️ 常见误区
-
SELECT中的别名在WHERE中不可用(逻辑上WHERE先执行) -
ORDER BY中的别名可用(最后执行) -
窗口函数在
WHERE/GROUP BY之后、ORDER BY之前执行
不同数据库(MySQL、PostgreSQL、SQL Server、Oracle)在细节上略有差异,但核心逻辑顺序一致。