Mysql去重查询---DISTINCT、group by

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


DISTINCT

语法:

关键词 distinct用于返回唯一不同的值。

  • distinct必须放在开头

表结构

在这里插入图片描述

案例

SELECT DISTINCT age FROM emp1

在这里插入图片描述

SELECT DISTINCT age ,NAME FROM emp1

实际上是根据age 和 NAME 两个字段来去重的在这里插入图片描述

SELECT DISTINCT * FROM emp1

在这里插入图片描述

COUNT统计

  • 统计字段列重复的个数

SELECT COUNT(DISTINCT age) FROM emp1

在这里插入图片描述

SELECT COUNT(DISTINCT NAME) FROM emp1

在这里插入图片描述

SELECT age,COUNT(DISTINCT NAME) FROM emp1 GROUP BY age;

在这里插入图片描述

group by 去重

用法:

在这里插入图片描述

表结构

在这里插入图片描述

案例:

SELECT age, COUNT(age) FROM emp1 GROUP BY age;

在这里插入图片描述

根据age去重 ,如果age重复,记录选id最小的

  • 法1
SELECT * FROM emp1 
WHERE id IN ( 
   SELECT MIN(id) FROM emp1 GROUP BY age
)

在这里插入图片描述

  • 法2
SELECT t1.id ,t1.name ,t1.age
FROM ( 
SELECT  id,NAME,age FROM  emp1 
) t1 
INNER JOIN
( 
   SELECT MIN(id) AS id FROM emp1 GROUP BY age
)t2  ON t1.id=t2.id

在这里插入图片描述

查找所有age重复的 记录

SELECT age FROM emp1 GROUP BY age HAVING COUNT(*)>1

在这里插入图片描述

  • 方法1
SELECT * FROM emp1 
WHERE age IN (
   SELECT age FROM emp1 GROUP BY age HAVING COUNT(*)>1
)

在这里插入图片描述

  • 方法2
SELECT * FROM emp1 a
INNER JOIN  (
  SELECT age FROM emp1 GROUP BY age HAVING COUNT(*)>1
)b ON  a.age = b.age

在这里插入图片描述

查找所有age不重复的 记录

  • 方法1
SELECT * FROM emp1
WHERE age NOT IN (
   SELECT age FROM emp1 GROUP BY age HAVING COUNT(*)>1
)

在这里插入图片描述

  • 方法2
SELECT * FROM emp1 a
LEFT JOIN  (
  SELECT age FROM emp1 GROUP BY age HAVING COUNT(*)>1
)b ON  a.age = b.age
WHERE  b.age IS null

在这里插入图片描述

删除重复的数据

1. age重复的数据,只保留id最小的,其余删除

DELETE FROM emp1
WHERE id NOT IN(
  SELECT MIN(id) minid FROM emp1
GROUP BY age
)

在这里插入图片描述

低版本 mysql 有可能报错

在这里插入图片描述

解决方法是:需要先把查询处理的id结果,as 一张表,再做delete操作,调整如下:

DELETE FROM emp1
WHERE id NOT IN
(
 SELECT a.id  FROM (
    SELECT MIN(id)AS id FROM emp1 GROUP BY age 
    ) a
)

在这里插入图片描述

2.只要age重复的数据 都删除,不保留

DELETE FROM emp1
WHERE age  IN
( SELECT age AS id FROM emp1 GROUP BY age HAVING COUNT(*)>1  
)

在这里插入图片描述

Guess you like

Origin blog.csdn.net/weixin_48052161/article/details/122464301