Programming/MySQL

MySQL 중복 데이터 조회 및 삭제 방법(GROUP BY HAVING)

Jan92 2023. 10. 21. 15:13

mysql 중복 데이터 조회(group by having) 및 삭제 방법

mysql 중복 데이터 조회 및 삭제

데이터를 관리하다 보면 중복된 데이터를 찾아야 하는 경우가 있는데요.

해당 포스팅은 MySQL에서 'GROUP BY HAVING'을 사용하여 중복 데이터를 조회하는 방법과 삭제하는 방법에 대해 정리한 내용입니다.

 

CREATE TABLE `users` (
  `idx` bigint NOT NULL AUTO_INCREMENT,
  `last_name` varchar(45) COLLATE utf8mb4_bin DEFAULT NULL,
  `first_name` varchar(45) COLLATE utf8mb4_bin DEFAULT NULL,
  `birth` varchar(45) COLLATE utf8mb4_bin DEFAULT NULL,
  PRIMARY KEY (`idx`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

(아래 예시에 사용되는 users 테이블입니다.)

 


중복 데이터 조회

#단일 컬럼에 대한 중복 조회
SELECT column_name,
       COUNT(column_name)
FROM   table_name
GROUP  BY column_name
HAVING COUNT(column_name) > 1; 

#복수 컬럼에 대한 중복 조회
SELECT column_a,
       column_b,
       COUNT(*)
FROM   table_name
GROUP  BY column_a,
          column_b
HAVING COUNT(*) > 1;

중복 데이터의 조회는 다음과 같이 'GROUP BY HAVING'을 사용하여 확인할 수 있으며, 단일 컬럼이 아닌 복수 컬럼에 대해서도 가능한데요.

복수 컬럼에 대한 중복 조회의 경우 'HAVING COUNT(column_a) > 1 AND COUNT(column_b) > 2'와 같이 각각의 컬럼에 대해 조건을 걸 수도 있습니다.

 

단일 컬럼에 대한 중복 조회

해당 결과는 위 users 테이블의 first_name(이름)에 대한 중복 데이터를 조회한 예시입니다.

 


중복 데이터 삭제

#JOIN을 통한 중복 데이터 삭제
DELETE t1
FROM   table_name t1
       JOIN table_name t2
         ON t1.column_a = t2.column_a
            AND t1.column_b = t1.column_b
WHERE  t1.idx > t2.idx;

다음과 같이 'JOIN'을 사용한 쿼리를 통해 중복된 데이터를 삭제할 수 있는데요.

'WHERE' 조건절에 PK 또는 create_at 같은 생성일을 기준으로도 조회 기준을 설정할 수 있기 때문에, 필요한 결과에 맞게 where 조건문을 적용하면 될 것 같습니다.

 

 

#UPDATE 문을 통한 Soft Delete
UPDATE table_name t1
       JOIN table_name t2
         ON t1.column_a = t2.column_a
            AND t1.column_b = t2.column_b
SET    t1.delete_yn = true
WHERE  t1.idx > t2.idx;

실제로 해당 데이터를 삭제하는 물리적 삭제(Hard Delete)가 아니라 논리적 삭제(Soft Delete)인 경우 다음과 같이 'UPDATE' 문을 사용할 수도 있습니다.

 

 

 

< GROUP BY HAVING을 사용하여 데이터를 삭제하는 참고 자료 >

https://steemit.com/kr/@yjiq150/mysql

https://hyeon9mak.github.io/mysql-delete-duplicate-data-troubleshooting/