MySQL中去重处理的方法小结

 更新时间:2024年11月22日 09:59:15   作者:安静的_显眼包O_o  
本文主要介绍了MySQL中去重方法小结,包含DISTINCT、GROUPBY、聚合函数、子查询、临时表、窗口函数、GROUP_CONCAT这些方法,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧

在MySQL中,去重通常指的是从查询结果中删除重复的行。这可以通过多种方式实现,具体取决于你的需求。以下是一些常见的去重方法:

1. DISTINCT 关键字:

如果你只是想简单地去重,不关心分组,那么使用 DISTINCT 可能更合适:
使用 DISTINCT 关键字可以返回唯一不同的值。

SELECT DISTINCT name  FROM employees;

这个查询会返回所有不重复的员工姓名。

SELECT DISTINCT column_name FROM table_name;

2. GROUP BY 子句:

使用 GROUP BY 子句可以对结果集进行分组,每个组只返回一条记录。

SELECT column_name, COUNT(*)
FROM table_name
GROUP BY column_name;
SELECT department_id, name
FROM employees
GROUP BY department_id, name;

这个查询会返回每个部门的唯一员工姓名,但请注意,如果部门中有多个人同名,他们都会被列出。

4. 结合 GROUP BY 和 DISTINCT

如果你想先对某个字段进行分组,然后在分组内去重,你可以这样做:

SELECT department_id, DISTINCT name
FROM employees
GROUP BY department_id;

但是,这个查询在大多数SQL数据库中是无效的,因为 DISTINCT 应该作用于整个 SELECT 列表,而不是单独的列。

3. 聚合函数:

使用聚合函数(如 MIN()MAX()SUM()AVG() 等)也可以实现去重的效果,因为聚合函数会对每个组返回一个值。

SELECT MIN(column_name) AS unique_column
FROM table_name
GROUP BY another_column;

4. 子查询:

使用子查询可以创建一个临时表,其中包含唯一的记录。

SELECT *
FROM (
    SELECT DISTINCT column_name
    FROM table_name
) AS subquery;

如果你需要在分组后去重,可以使用子查询:

SELECT department_id, MIN(name) AS name
FROM employees
GROUP BY department_id;

这个查询会返回每个部门的员工姓名,但每个部门只返回一个名字(这里使用了 MIN() 函数,实际上 MIN() 和 MAX() 在这种用途下效果相同,因为名字是文本,不是数值)。

5. 临时表:

创建一个临时表来存储去重后的结果。

CREATE TEMPORARY TABLE temp_table AS
SELECT DISTINCT column_name
FROM table_name;

SELECT * FROM temp_table;
DROP TEMPORARY TABLE temp_table;

6. 窗口函数(MySQL 8.0+):

使用窗口函数 ROW_NUMBER()RANK()DENSE_RANK() 等可以为每个组分配一个唯一的行号。

SELECT column_name
FROM (
    SELECT column_name, ROW_NUMBER() OVER (PARTITION BY column_name ORDER BY another_column) AS rn
    FROM table_name
) AS subquery
WHERE rn = 1;

在支持窗口函数的数据库中,你可以使用 ROW_NUMBER() 或 RANK() 来实现更复杂的去重逻辑:

SELECT department_id, name
FROM (
    SELECT department_id, name,
           ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY name) AS rn
    FROM employees
) t
WHERE t.rn = 1;

这个查询会为每个部门的员工按名字排序,并为每个部门的每个名字分配一个行号。外层查询然后选择每个部门的第一个名字,从而实现去重。

7. 使用 GROUP_CONCAT():

如果你想要将重复的行合并成一个字符串,可以使用 GROUP_CONCAT()

SELECT column_name, GROUP_CONCAT(another_column SEPARATOR ', ') AS concatenated_values
FROM table_name
GROUP BY column_name;

8.使用 DISTINCT ON(MySQL不支持,但适用于其他数据库如PostgreSQL):

在MySQL中没有 DISTINCT ON 语法,但这是其他数据库中去重的一种方法。

选择哪种方法取决于你的具体需求,比如你想要保留哪些列,是否需要考虑排序等。在实际应用中,可能需要结合使用多种方法来达到预期的效果。

到此这篇关于MySQL中去重处理的方法小结的文章就介绍到这了,更多相关MySQL 去重处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL中进行SQL调优的方法步骤

    MySQL中进行SQL调优的方法步骤

    文章主要介绍了SQL调优的方法,包括合理设计索引、避免使用SELECT*、避免函数计算、避免使用%LIKE、满足最左匹配原则、避免对无索引字段进行排序以及利用缓存来优化,需要的朋友可以参考下
    2025-11-11
  • MySQL存储过程中使用WHILE循环语句的方法

    MySQL存储过程中使用WHILE循环语句的方法

    这篇文章主要介绍了MySQL存储过程中使用WHILE循环语句的方法,实例分析了在MySQL中循环语句的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • MySQL复合查询操作实战案例

    MySQL复合查询操作实战案例

    这篇文章主要给大家介绍了关于MySQL复合查询操作的相关资料,MySQL复合查询是指在一个SQL语句中使用多个查询条件,以过滤和检索数据,需要的朋友可以参考下
    2023-08-08
  • MySQL查询全部数据集结果不一致问题解决方案

    MySQL查询全部数据集结果不一致问题解决方案

    最近出现一个很奇怪的MySQL问题,使用不同select语句查询全部数据集居然得到不同的记录数
    2012-11-11
  • MySQL数据库怎么正确查询字符串长度

    MySQL数据库怎么正确查询字符串长度

    MySQL中字符串长度一般指数据库表中一个字段或列中存储的字符串的最大长度,有时我们需要测量字符串长度,来保证表结构及数据库性能稳定,下面这篇文章主要给大家介绍了关于MySQL数据库怎么正确查询字符串长度的相关资料,需要的朋友可以参考下
    2023-06-06
  • Linux系统MySQL8.0.19快速安装配置教程图解

    Linux系统MySQL8.0.19快速安装配置教程图解

    这篇文章主要介绍了Linux系统MySQL8.0.19快速安装配置教程,本文通过图文并茂的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • MySQL主从同步延迟原因与解决方案

    MySQL主从同步延迟原因与解决方案

    本文主要介绍了MySQL主从同步延迟原因与解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • MySQL中高效删除大量数据的常见方法总结

    MySQL中高效删除大量数据的常见方法总结

    在数据库管理中,删除大量数据是常见的需求,本文将深入探讨在 MySQL 中安全高效删除大量数据的多种方法,希望可以帮助大家避免常见的陷阱
    2026-04-04
  • MySQL中数据导入恢复的简单教程

    MySQL中数据导入恢复的简单教程

    这篇文章主要介绍了MySQL中数据导入恢复的简单教程,主要用到了LOAD DATA语句,需要的朋友可以参考下
    2015-05-05
  • MySQL表操作插入数据insert语句学习(小白入门篇)

    MySQL表操作插入数据insert语句学习(小白入门篇)

    这篇文章主要为大家介绍了MySQL表操作插入数据insert语句学习小白入门篇,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05

最新评论