MySQL从入门到精通(第二篇):数据查询进阶与实战

目录

引言:从基础到进阶,解锁SQL的真正威力

一、GROUP BY:数据分组与聚合统计

1.1 GROUP BY 的核心作用

1.2 进阶技巧

二、JOIN:多表关联查询的艺术

2.1 四种 JOIN 类型

2.2 多表关联实战

三、HAVING:分组后的精准过滤

四、实战题目:从理论到应用

题目1:计算各部门平均工资

题目2:统计订单数量与总金额

五、下篇预告


引言:从基础到进阶,解锁SQL的真正威力

在上一篇中,我们已经掌握了数据库基础和SQL入门操作。但真正的数据查询远不止简单的增删改查,如何通过分组、关联、过滤等高级技巧从海量数据中提炼价值,才是SQL的精髓所在。本篇将深入讲解 GROUP BY 分组统计JOIN 多表关联查询HAVING 分组过滤,并通过实战题目帮助你巩固知识!


一、GROUP BY:数据分组与聚合统计

1.1 GROUP BY 的核心作用

GROUP BY 用于将数据按某一列或多列的值进行分组,常与聚合函数(如 COUNTSUMAVG)结合使用,实现统计分析。

示例:统计各部门员工数量

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大师!