在 MySQL 中,分组查询、聚合查询和联合查询是非常常见的 SQL 操作,广泛应用于数据分析、报表生成等场景。下面将分别介绍这三种查询类型。

一、分组查询(GROUP BY)

分组查询是用来将结果集中的记录按照某些字段进行分组,通常与聚合函数一起使用,能够对每个分组进行汇总、统计。

语法:

SELECT column1, column2, ..., aggregate_function(column)
FROM table_name
WHERE condition
GROUP BY column1, column2, ...
HAVING condition;
  • GROUP BY:用于将查询结果按指定列分组。
  • aggregate_function():如 COUNT()SUM()AVG()MIN()MAX() 等聚合函数,用于对每组数据进行汇总计算。
  • HAVING:与 WHERE 类似,HAVING 用于过滤分组后的数据。

示例:

假设有一个 sales 表,记录了销售订单的信息,表结构如下:

CREATE TABLE sales (
    id INT PRIMARY KEY,
    product_id INT,
    amount DECIMAL(10, 2),
    sale_date DATE
);

查询每个 product_id 的销售总额:

SELECT product_id, SUM(amount) AS total_sales
FROM sales
GROUP BY product_id;

解释

  • SUM(amount):计算每个 product_id 的销售总额。
  • GROUP BY product_id:按 product_id 对记录进行分组。

结合 HAVING 进行过滤:

查询每个产品的销售总额,但仅显示总额大于 1000 的产品:

SELECT product_id, SUM(amount) AS total_sales
FROM sales
GROUP BY product_id
HAVING total_sales > 1000;

二、聚合查询(Aggregate Functions)

聚合查询是对多个记录进行计算,并返回单一的值。常见的聚合函数包括:

  • COUNT():统计记录的数量。
  • SUM():计算某列的总和。
  • AVG():计算某列的平均值。
  • MIN():获取某列的最小值。
  • MAX():获取某列的最大值。

示例:

  1. 统计总销售量
    查询 sales 表中的所有销售订单数量:SELECT COUNT(*) AS total_orders FROM sales;
  2. 计算销售的平均金额
    查询 sales 表中所有订单的平均销售额:SELECT AVG(amount) AS avg_sales FROM sales;
  3. 查询销售的最大金额
    查询 sales 表中单笔订单的最大金额:SELECT MAX(amount) AS max_sale FROM sales;

三、联合查询(JOIN)

联合查询是将两个或多个表的数据进行连接,通常用于处理具有关联的数据。MySQL 支持不同类型的连接,如 INNER JOINLEFT JOINRIGHT JOIN 和 FULL JOIN(MySQL 不直接支持 FULL JOIN)。

1. INNER JOIN(内连接)

INNER JOIN 返回的是两个表中匹配的记录。如果表中的某行没有匹配的行,则该行不会出现在结果中。

示例:

假设有两个表:

CREATE TABLE products (
    product_id INT PRIMARY KEY,
    product_name VARCHAR(100)
);

CREATE TABLE sales (
    id INT PRIMARY KEY,
    product_id INT,
    amount DECIMAL(10, 2),
    sale_date DATE,
    FOREIGN KEY (product_id) REFERENCES products(product_id)
);

查询所有销售订单及其对应的产品名称:

SELECT sales.id, sales.amount, products.product_name
FROM sales
INNER JOIN products ON sales.product_id = products.product_id;

解释

  • INNER JOIN:连接 sales 和 products 两个表,条件是 sales.product_id 和 products.product_id 相等。
  • 结果只包含两个表中有匹配的记录。

2. LEFT JOIN(左连接)

LEFT JOIN 返回左表的所有记录,即使右表没有匹配的记录。如果右表没有匹配的记录,对应字段返回 NULL

示例:

查询所有产品及其销售订单(即使没有销售记录的产品也显示):

SELECT products.product_name, sales.amount
FROM products
LEFT JOIN sales ON products.product_id = sales.product_id;

解释

  • LEFT JOIN:返回所有产品,即使该产品没有销售记录,sales.amount 会返回 NULL

3. RIGHT JOIN(右连接)

RIGHT JOIN 与 LEFT JOIN 类似,区别在于它返回右表的所有记录,即使左表没有匹配的记录。

示例:

查询所有销售订单及对应的产品名称(即使没有产品信息的订单也显示):

SELECT sales.id, sales.amount, products.product_name
FROM sales
RIGHT JOIN products ON sales.product_id = products.product_id;

解释

  • RIGHT JOIN:返回所有 sales 表的记录,即使某些订单没有对应的产品信息,products.product_name 会返回 NULL

4. FULL JOIN(全连接)

MySQL 不直接支持 FULL JOIN,但可以通过 UNION 操作来模拟。

示例:

假设有两个表 A 和 B,要返回两个表的所有记录,包括不匹配的记录:

SELECT A.id, A.name FROM A
UNION
SELECT B.id, B.name FROM B;

解释

  • UNION:返回两个查询的并集。如果表 A 和表 B 中有不匹配的记录,都会显示出来。

四、总结

  1. 分组查询(GROUP BY):通过 GROUP BY 将记录按指定字段进行分组,并与聚合函数结合进行统计。
  2. 聚合查询:通过聚合函数(如 COUNT()SUM()AVG() 等)对数据进行计算。
  3. 联合查询(JOIN):通过 JOIN 将两个或多个表的数据连接在一起,常用的有 INNER JOINLEFT JOINRIGHT JOIN 等。

掌握这些基本查询技巧,能够有效地处理和分析数据库中的数据,解决日常的数据查询需求。