在SQL中,合理使用 ORDER BY
、GROUP BY
、BETWEEN AND
及其他过滤条件,需明确它们的用途和执行顺序。以下是详细总结:
1. ORDER BY
- 用途:对查询结果按指定字段排序(升序
ASC
或降序DESC
)。 - 使用场景:
- 需要排序结果时,如排行榜、时间线等。
- 通常位于SQL语句末尾,执行顺序在
SELECT
之后。
- 示例:
SELECT name, score FROM students ORDER BY score DESC;
2. GROUP BY
- 用途:将数据按指定字段分组,常与聚合函数(
SUM
、AVG
、COUNT
等)配合生成汇总数据。 - 使用场景:
- 统计分组数据,如“每个部门的平均工资”。
SELECT
后的字段必须是分组字段或聚合函数。
- 示例:
SELECT department, AVG(salary) FROM employees GROUP BY department;
3. BETWEEN AND
- 用途:过滤指定范围内的值(包含边界)。
- 使用场景:
- 替代
>=
和<=
组合,提升可读性。 - 可用于
WHERE
或HAVING
子句。
- 替代
- 示例:
SELECT * FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31';
4. 其他过滤条件
- WHERE:分组前过滤行,不可直接使用聚合函数。
SELECT * FROM products WHERE price > 100;
- HAVING:分组后过滤组,需搭配聚合函数。
SELECT department, AVG(salary) FROM employees GROUP BY department HAVING AVG(salary) > 5000;
- LIKE/IN/IS NULL:用于模式匹配、多值匹配或空值检查。
SELECT name FROM users WHERE email IS NULL;
执行顺序与组合使用
-
执行顺序:
FROM
→WHERE
→GROUP BY
→HAVING
→SELECT
→ORDER BY
-
典型组合示例:
SELECT department, AVG(salary) AS avg_salary FROM employees WHERE hire_date > '2020-01-01' -- 先过滤行 GROUP BY department -- 再分组 HAVING AVG(salary) > 5000 -- 后过滤组 ORDER BY avg_salary DESC; -- 最后排序
关键区别
- WHERE vs HAVING:
WHERE
过滤行(分组前),HAVING
过滤组(分组后,可含聚合函数)。 - GROUP BY vs ORDER BY:
GROUP BY
影响数据分组,ORDER BY
影响最终排序。
通过理解这些关键字的用途和执行顺序,可高效编写逻辑清晰的SQL查询,满足不同数据操作需求。