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之DATETIME与TIMESTAMP的时间精度问题

    MySQL之DATETIME与TIMESTAMP的时间精度问题

    这篇文章主要介绍了MySQL之DATETIME与TIMESTAMP的时间精度问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 解析SQL Server 视图、数据库快照

    解析SQL Server 视图、数据库快照

    在程序开发过程中,任何一个项目都离不开数据库,这篇文章给大家详细介绍SQL Server 视图、数据库快照相关内容,需要的朋友可以参考下
    2015-08-08
  • mysql中insert ignore、insert和replace的区别及说明

    mysql中insert ignore、insert和replace的区别及说明

    这篇文章主要介绍了mysql中insert ignore、insert和replace的区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 关于mysql基础知识的介绍

    关于mysql基础知识的介绍

    本篇文章是对mysql的基础知识进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 一条SQL语句在MySQL中是如何执行的

    一条SQL语句在MySQL中是如何执行的

    本篇文章会分析下一个sql语句在mysql中的执行流程,包括sql的查询在mysql内部会怎么流转,sql语句的更新是怎么完成的,需要的朋友可以参考一下
    2021-10-10
  • navicat连接mysql出现2059错误的解决方法

    navicat连接mysql出现2059错误的解决方法

    这篇文章主要为大家详细介绍了navicat连接mysql出现2059错误的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • MySQL 创建三张关系表实操

    MySQL 创建三张关系表实操

    这篇文章主要介绍了MySQL 创建三张关系表实操,文章说先创建学生表然后科目表和分数表三张有着密切关系的表,下文实操分享需要的小伙伴可以参考一下
    2022-03-03
  • Mysql 5.7.17 winx64在win7上的安装教程

    Mysql 5.7.17 winx64在win7上的安装教程

    本文给大家介绍Mysql 5.7.17 winx64在win7上的安装教程,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-04-04
  • 一文带你了解MySQL之约束

    一文带你了解MySQL之约束

    在SQL标准中,一共规定了6种不同的约束,包括非空约束,唯一约束和检查约束等,而在MySQL中是不支持检查约束的,所以这篇文章先对其余5种约束做一个详解和练习,需要的朋友可以参考下
    2023-06-06
  • MySQL中的基本查询语句学习笔记

    MySQL中的基本查询语句学习笔记

    这篇文章主要介绍了MySQL中的基本查询语句学习笔记,包括使用limit限制查询结果条数和合并查询结果的方法,需要的朋友可以参考下
    2016-03-03

最新评论