首页 游戏 软件 资讯 排行榜 专题
首页
数据库
如何处理SQL重复数据删除_巧用DISTINCT与GROUP BY语句

如何处理SQL重复数据删除_巧用DISTINCT与GROUP BY语句

热心网友
60
转载
2026-04-26

优先用 DISTINCT 去重;需聚合计算则必须用 GROUP BY;二者语义不同不可互换,混用易报错或漏数据;真正删重需用 DELETE 配合窗口函数或自连接。

如何处理SQL重复数据删除_巧用DISTINCT与GROUP BY语句

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

重复数据到底该用 DISTINCT 还是 GROUP BY

先说一个核心结论:如果只是想查询去重后的结果,优先用 DISTINCT;如果要对重复的数据组进行聚合计算,比如统计次数、取最新时间,那就必须用 GROUP BY。这两者背后的语义完全不同,不能随意互换,强行混用很容易导致数据遗漏或者直接报错。

一个常见的误区是,一看到“有重复”就下意识地加上 GROUP BY,却忘了写聚合函数。这在 MySQL 5.7+ 版本会直接抛出 ERROR 1055,而 PostgreSQL 和 SQL Server 的语法检查更严格,连执行的机会都不会给。

  • DISTINCT 是行级去重,作用于整个 SELECT 列表,它比较的是所有选中字段的组合值是否完全相同。
  • GROUP BY 是分组操作,必须配合聚合函数(如 COUNT()MAX())使用,否则那些不在分组字段里的列,数据库根本不知道该取哪一行的值。
  • 从性能角度看,DISTINCT 通常比 GROUP BY 更轻量,尤其是在没有索引的字段上操作时,GROUP BY 很可能会触发临时表和文件排序,拖慢查询速度。

GROUP BY 删除重复行时为什么不能只写 DELETE FROM t GROUP BY x

原因很简单:标准 SQL 语法就不支持直接对 GROUP BY 的结果执行 DELETE 操作。虽然 MySQL 允许通过 DELETE ... JOIN 或子查询的方式变通实现,但写法一旦有误,后果很严重——要么删不干净,要么可能把数据全删光。

安全的做法是,先精准定位出每组中需要保留的那条记录(比如保留 id 最小的那条),再删除其余重复项。一个经典的写法是利用自连接:

DELETE t1 FROM users t1
INNER JOIN users t2 WHERE t1.email = t2.email AND t1.id > t2.id;

这个写法的精妙之处在于:

  • 条件 t1.id > t2.id 确保了只删除那些“ID更大”的重复行,从而为每组保留了 id 最小的那条记录。
  • 务必为连接条件字段(如这里的 email)建立索引,否则面对大数据表时,多表全扫描会慢得让人无法忍受。
  • 需要注意的是,SQLite 等数据库不支持这种 DELETE ... JOIN 语法,得改用基于 ROWID 的子查询来实现。

DISTINCT 在多字段场景下容易误判“不重复”

DISTINCTNULL 值的处理是个隐蔽的坑,常常被忽略。在大多数数据库中,NULL = NULL 的比较结果会是 false(未知),但 DISTINCT 却会把多个 NULL 视为相同的值进行合并。这可能导致一些本该保留的记录被错误地去除。

举个例子:SELECT DISTINCT name, phone FROM customer,如果表里有两行数据都是 (‘张三’, NULL),那么 DISTINCT 会把它们当成重复数据,只返回一条。但从业务角度看,我们可能希望保留所有电话为空的“张三”记录。

  • 解决方法之一:使用 COALESCE(phone, CONCAT('null_', id)) 这类技巧,将 NULL 显式转换为可以相互区分的值。
  • 更可控的方法是换用 GROUP BY 配合 ROW_NUMBER() 窗口函数(前提是数据库支持),这样可以更精细地控制去重逻辑。
  • 提醒一下:MySQL 8.0+、PostgreSQL、SQL Server 都支持窗口函数,但旧版本的 MySQL 就只能依靠变量来模拟实现了。

真正要“删除物理重复行”,别只盯着 DISTINCTGROUP BY

必须明确一点:DISTINCTGROUP BY 都只是查询层面的操作,不会改变原始表中的数据。真想从物理上删除重复行,必须动用 DELETE 语句,并配合子查询或 CTE(公共表表达式)。至于子查询里要不要用 DISTINCTGROUP BY,完全取决于你如何定义“每组保留哪一条”。

目前最稳健且通用的方案(兼容 MySQL 8.0+ 和 PostgreSQL 等主流数据库)是利用窗口函数:

WITH ranked AS (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY email ORDER BY updated_at DESC) rn
  FROM users
)
DELETE FROM users WHERE id IN (
  SELECT id FROM ranked WHERE rn > 1
);

这里的关键已经不是 DISTINCTGROUP BY 了,而是通过 ROW_NUMBER() 窗口函数,明确指定了“在每个邮箱分组内,按更新时间倒序排列,只保留第一条”。在实际执行删除前,务必先用 SELECT 语句查看一下 ranked 这个 CTE 的结果,确认即将删除的数据完全符合预期。

对于不支持窗口函数的老版本 MySQL,就只能依赖更绕的自连接或临时表方案,逻辑复杂,出错概率也更高。有时候,花点时间升级数据库版本,可能比折腾几个小时调试复杂的 SQL 要划算得多。

来源:https://www.php.cn/faq/2312040.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

如何处理SQL重复数据删除_巧用DISTINCT与GROUP BY语句
数据库
如何处理SQL重复数据删除_巧用DISTINCT与GROUP BY语句

优先用 DISTINCT 去重;需聚合计算则必须用 GROUP BY;二者语义不同不可互换,混用易报错或漏数据;真正删重需用 DELETE 配合窗口函数或自连接。 重复数据到底该用 DISTINCT 还是 GROUP BY? 先说一个核心结论:如果只是想查询去重后的结果,优先用 DISTINCT;如

热心网友
04.26
SQL如何快速查找分组中的重复数据_使用GROUP BY加HAVING计数
数据库
SQL如何快速查找分组中的重复数据_使用GROUP BY加HAVING计数

最常用、最可靠的查重复方法是用 GROUP BY 配合 HA VING COUNT(*) > 1,但必须确保 GROUP BY 字段组合准确反映业务意义上的重复定义;COUNT() 必须用于计数,不可用 COUNT(字段) 替代,否则会忽略 NULL 导致漏判。 直接说结论:用 GROUP BY 配

热心网友
04.26
SQL如何对数据进行分组统计?GROUP BY聚合函数应用
数据库
SQL如何对数据进行分组统计?GROUP BY聚合函数应用

SQL如何对数据进行分组统计?GROUP BY聚合函数应用 说到数据分组统计,GROUP BY绝对是绕不开的核心。但你真的用对了吗?先记住一个核心原则:GROUP BY必须与聚合函数配合使用,非聚合字段须出现在GROUP BY子句中或包裹于聚合函数内;HA VING用于分组后过滤,WHERE用于分组

热心网友
04.25
SQL如何通过嵌套查询实现多维数据分析_嵌套GROUPING SETS
数据库
SQL如何通过嵌套查询实现多维数据分析_嵌套GROUPING SETS

SQL如何通过嵌套查询实现多维数据分析:嵌套GROUPING SETS的实战拆解 直接说结论:GROUPING SETS 本身不支持语法上的嵌套。但别急,这并不意味着你实现不了类似“嵌套”的多维分析需求。关键在于转换思路:用子查询做预处理,再用GROUPING SETS做汇总。这本质上是一种“分步聚

热心网友
04.25
SQL怎样实现多列组合分组查询_深入理解GROUP BY多字段逻辑
数据库
SQL怎样实现多列组合分组查询_深入理解GROUP BY多字段逻辑

GROUP BY 多字段:从“分组”到“定义新维度”的深度解析 GROUP BY 多字段的执行逻辑到底是什么 很多朋友对 GROUP BY a, b 有个常见的误解,以为它是先按 a 分大组,再在每个大组里按 b 分小组。其实不然,数据库的处理方式要更直接:它把 (a, b) 这个组合,当作一个**

热心网友
04.24

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

一片金色的阳光
职业与学业
一片金色的阳光

2026年的夏天,一片金色的阳光 那是2026年一个周日的上午,天气热得发烫,天上的云朵仿佛都被烈日烘烤得卷了边。我和妹妹坐在妈妈的电瓶车后座,正赶往书法学馆。 车子刚到保利东湾北门,麻烦就来了——电瓶车的内胎毫无预兆地瘪了下去。妈妈赶忙向岗亭伞下的保安叔叔求助,询问有没有打气筒。对方摇了摇头说没有

热心网友
04.27
黄河
职业与学业
黄河

黄河:一条河流与一个文明的塑造 自西向东,跨越5464公里,黄河的旅程本身就是一曲不屈不挠的史诗。它绕过高山,流过平原,穿越沙漠,在地图上勾勒出一个雄浑的“几”字形。而正是在这条大河的臂弯里,华夏文明的诸多基石被一一奠定。 黄河所滋养的,是一种丰富、多样且源远流长的文化。传说中的黄帝与炎帝,这两位杰

热心网友
04.27
库克计划将九月推出的折叠版iPhone产品线移交给继任者约翰·特努斯
web3.0
库克计划将九月推出的折叠版iPhone产品线移交给继任者约翰·特努斯

库克交棒进行时:折叠屏iPhone重任,已移交继任者特努斯 科技圈又有新动向。根据知名记者马克·古尔曼的最新报道,苹果公司的权力交接正在产品层面悄然推进。就在4月27日,消息指出,CEO蒂姆·库克已经开始将一条堪称“实力担当”的核心产品线,正式移交给他的继任者约翰·特努斯。而这条产品线的重中之重,正

热心网友
04.27
家乡的母亲河
职业与学业
家乡的母亲河

家乡的母亲河 在成都,有一条河无人不晓,那便是锦江。她承载着漫长的历史,成都人更习惯唤她一个亲切的名字——府南河。这声称呼里,饱含着我们对母亲河的深厚敬意。 历史上的府南河,河水清澈见底。诗圣杜甫曾在此留下千古名句:“窗含西岭千秋雪,门泊东吴万&里船。”要知道,古时没有火车飞机,交通全靠舟车。对深处

热心网友
04.27
入冬以来的第一场雪
职业与学业
入冬以来的第一场雪

十一月份悄然而至 十一月份,真是个奇妙的月份。天气的脾气变化多端,让人捉摸不透。有时它会骤然变脸,寒气逼人,时不时还洒下一场鹅毛大雪;有时却又阳光和煦,暖意融融,直照得人心里亮堂堂的;偶尔,它还会飘下丝丝凉雨,带来一阵清爽。 瞧,这就是入冬以来的第一场雪,我们期盼已久的景象终于成了真。起初,天空只是

热心网友
04.27