sql练习-5
WHERE
和 HAVING
的区别:
WHERE
:在分组前过滤行(不能使用聚合函数的结果)•-
HAVING
:在分组后过滤分组(可以使用聚合函数的结果)
执行顺序:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
MySQL要求所有派生表必须有别名,这是SQL语法规范,所以必须加 as s
SQL语句执行顺序总结表
执行顺序 | 子句 | 作用 | 关键特点 | 注意事项 |
---|---|---|---|---|
1 | FROM | 确定数据源表 | 最先执行,生成笛卡尔积 | 多表连接时注意性能影响 |
2 | ON | 连接条件过滤 | 在JOIN之前过滤连接条件 | 只影响连接结果,不参与最终过滤 |
3 | JOIN | 执行表连接 | INNER/LEFT/RIGHT/FULL JOIN | 连接类型影响结果集 |
4 | WHERE | 行级数据过滤 | 过滤不满足条件的行 | 不能使用SELECT别名,不能使用聚合函数 |
5 | GROUP BY | 数据分组 | 与聚合函数配合使用 | 分组后每组合并为一行 |
6 | HAVING | 组级数据过滤 | 对分组结果进行过滤 | 可以使用聚合函数,可以使用SELECT别名 |
7 | SELECT | 选择返回列 | 计算表达式,定义别名 | 在此阶段才计算列表达式 |
8 | DISTINCT | 去除重复行 | 基于SELECT结果去重 | 影响性能,谨慎使用 |
9 | ORDER BY | 结果排序 | 对最终结果排序 | 可以使用SELECT中定义的别名 |
10 | LIMIT/TOP | 结果集限制 | 分页或限制返回行数 | 最后执行,影响性能最小 |