在 MySQL 中,更新、删除、分组和聚合查询是非常重要的操作。掌握这些操作可以帮助你进行更高效的数据处理和分析。下面,我们将通过几个实例来复习 MySQL 中的常见操作,涵盖 更新删除分组聚合查询

1. 更新数据(UPDATE)

UPDATE 语句用于修改表中的现有数据。其基本语法如下:

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

示例 1: 更新单个字段

假设有一个名为 employees 的表,包含 namesalary 字段,我们需要将员工 Alice 的工资更新为 5000。

UPDATE employees
SET salary = 5000
WHERE name = 'Alice';

示例 2: 更新多个字段

如果我们想同时更新多个字段,比如更新员工 Alice 的工资和职位:

UPDATE employees
SET salary = 5500, position = 'Manager'
WHERE name = 'Alice';

注意事项

  • 使用 WHERE 子句非常重要,否则会更新表中的所有记录。
  • 可以使用子查询来进行更复杂的更新操作。

2. 删除数据(DELETE)

DELETE 语句用于删除表中的记录。其基本语法如下:

DELETE FROM table_name
WHERE condition;

示例 1: 删除单个记录

假设我们要删除名为 Alice 的员工记录:

DELETE FROM employees
WHERE name = 'Alice';

示例 2: 删除多个记录

假设我们想删除所有工资低于 3000 的员工:

DELETE FROM employees
WHERE salary < 3000;

注意事项

  • 同样地,删除操作应使用 WHERE 条件,否则会删除所有记录。
  • 可以使用 TRUNCATE 语句清空整个表,它比 DELETE 更高效,但不能回滚。

3. 分组查询(GROUP BY)

GROUP BY 用于将查询结果按某一列进行分组,通常与聚合函数(如 COUNT, SUM, AVG 等)一起使用。

示例 1: 按部门分组,查询每个部门的员工数

假设我们有一个 employees 表,包含 departmentname 字段,我们可以按部门分组查询每个部门的员工数量:

SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;

示例 2: 按部门分组,查询每个部门的总工资

我们也可以使用 SUM 来计算每个部门的总工资:

SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department;

注意事项

  • GROUP BY 必须配合聚合函数一起使用,否则会报错。
  • 你还可以使用 HAVING 子句过滤分组后的结果。

4. 聚合函数

聚合函数用于计算一组数据的单一结果。常见的聚合函数包括:

  • COUNT():计算行数
  • SUM():计算总和
  • AVG():计算平均值
  • MIN():计算最小值
  • MAX():计算最大值

示例 1: 查询总工资

SELECT SUM(salary) AS total_salary
FROM employees;

示例 2: 查询平均工资

SELECT AVG(salary) AS average_salary
FROM employees;

示例 3: 查询部门的最大工资

SELECT department, MAX(salary) AS max_salary
FROM employees
GROUP BY department;

5. 使用 HAVING 过滤分组结果

HAVING 子句用于在分组后进行筛选,类似于 WHERE,但 WHERE 不能用于聚合查询。只有在 GROUP BY 后使用聚合函数时,才使用 HAVING

示例 1: 查询每个部门的员工数大于 5 的部门

SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;

示例 2: 查询每个部门的总工资超过 10000 的部门

SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department
HAVING SUM(salary) > 10000;

6. 排序(ORDER BY)

ORDER BY 子句用于对查询结果进行排序。默认是升序排序,使用 DESC 可以进行降序排序。

示例 1: 按工资升序排序

SELECT name, salary
FROM employees
ORDER BY salary ASC;

示例 2: 按工资降序排序

SELECT name, salary
FROM employees
ORDER BY salary DESC;

示例 3: 按部门和工资排序

你可以同时按多个列排序:

SELECT name, department, salary
FROM employees
ORDER BY department ASC, salary DESC;

7. 更新数据时使用子查询

有时,你需要使用子查询来动态获取数据并更新记录。例如,我们想把工资低于某个部门平均工资的员工的工资提升 10%。

UPDATE employees
SET salary = salary * 1.1
WHERE salary < (
    SELECT AVG(salary)
    FROM employees
    WHERE department = 'Sales'
);

8. 示例:综合应用(从更新、删除到分组聚合查询)

假设我们有一个 sales 表,包含 id, product_name, quantity_sold, sale_price, salesperson 等字段,我们想要进行一系列操作:

8.1 查询每个销售员的总销售额

SELECT salesperson, SUM(quantity_sold * sale_price) AS total_sales
FROM sales
GROUP BY salesperson;

8.2 更新销售员的销售业绩

假设我们要为销售员“John”增加销售额 10%:

UPDATE sales
SET sale_price = sale_price * 1.1
WHERE salesperson = 'John';

8.3 删除低于销售目标的记录

删除那些销售额低于 500 的记录:

DELETE FROM sales
WHERE quantity_sold * sale_price < 500;

8.4 查找销售额最高的产品

SELECT product_name, SUM(quantity_sold * sale_price) AS total_sales
FROM sales
GROUP BY product_name
ORDER BY total_sales DESC
LIMIT 1;

总结

  • 更新数据:使用 UPDATE 修改记录,需小心使用 WHERE 子句避免更新所有记录。
  • 删除数据:使用 DELETE 删除记录,同样要小心使用 WHERE,否则会删除全部记录。
  • 分组查询:使用 GROUP BY 对数据进行分组,结合聚合函数进行分析。
  • 聚合函数COUNT, SUM, AVG, MIN, MAX 等聚合函数帮助你进行统计分析。
  • HAVING:在分组后进行条件过滤,通常与聚合函数一起使用。

掌握这些基本的 SQL 操作,可以帮助你高效地进行数据库管理和数据分析。如果你有更复杂的需求,可以根据这些基础操作进行组合和扩展。