目录
引言:从基础到进阶,解锁SQL的真正威力
在上一篇中,我们已经掌握了数据库基础和SQL入门操作。但真正的数据查询远不止简单的增删改查,如何通过分组、关联、过滤等高级技巧从海量数据中提炼价值,才是SQL的精髓所在。本篇将深入讲解 GROUP BY 分组统计、JOIN 多表关联查询、HAVING 分组过滤,并通过实战题目帮助你巩固知识!
一、GROUP BY:数据分组与聚合统计
1.1 GROUP BY 的核心作用
GROUP BY
用于将数据按某一列或多列的值进行分组,常与聚合函数(如 COUNT
、SUM
、AVG
)结合使用,实现统计分析。
示例:统计各部门员工数量
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;
1.2 进阶技巧
- 分组后展示详细信息:使用
GROUP_CONCAT
合并组内数据。SELECT department, GROUP_CONCAT(name) AS employees FROM employees GROUP BY department;
- 多列分组:按部门和职位分组。
SELECT department, position, COUNT(*) FROM employees GROUP BY department, position;
常见错误:非聚合列不能直接出现在 SELECT
中,需使用聚合函数或包含在 GROUP BY
中。
二、JOIN:多表关联查询的艺术
2.1 四种 JOIN 类型
类型 | 说明 | 示例场景 |
---|---|---|
INNER JOIN | 返回两个表中匹配的行 | 查询员工及其部门信息 |
LEFT JOIN | 返回左表所有行,右表无匹配则为 NULL | 查询所有员工,即使未分配部门 |
RIGHT JOIN | 返回右表所有行,左表无匹配则为 NULL | 查询所有部门,即使无员工 |
FULL JOIN | 返回两个表的并集,无匹配则为 NULL | 统计所有员工和部门(含空值) |
示例:INNER JOIN 查询员工与部门
SELECT e.name, d.department_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.id;
2.2 多表关联实战
假设存在 orders
(订单表)和 customers
(客户表),查询每个客户的订单总金额:
SELECT c.customer_name, SUM(o.amount) AS total_amount
FROM customers c
LEFT JOIN orders o
ON c.id = o.customer_id
GROUP BY c.customer_name;
三、HAVING:分组后的精准过滤
HAVING
用于过滤分组后的结果,常与 GROUP BY
联合使用,而 WHERE
用于过滤行级数据。
示例:统计订单数量大于 10 的部门
SELECT department, COUNT(*) AS order_count
FROM orders
GROUP BY department
HAVING order_count > 10;
四、实战题目:从理论到应用
题目1:计算各部门平均工资
需求:查询每个部门的平均工资,仅显示平均工资高于 5000 的部门。
解答:
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING avg_salary > 5000;
题目2:统计订单数量与总金额
需求:按客户名称统计订单数量及总金额。
解答:
SELECT c.customer_name,
COUNT(o.id) AS order_count,
SUM(o.amount) AS total_amount
FROM customers c
LEFT JOIN orders o
ON c.id = o.customer_id
GROUP BY c.customer_name;
五、下篇预告
下一期我们将深入讲解 子查询与视图,包括:
- 子查询的嵌套使用场景
- 视图的创建与优化技巧
- 实战案例:通过视图简化复杂查询
关注我,持续输出数据库干货!
如果本文对你有帮助,欢迎点赞、收藏、转发,让我们一起成为SQL大师!