mysql 중복 데이터 조회(group by having) 및 삭제 방법
데이터를 관리하다 보면 중복된 데이터를 찾아야 하는 경우가 있는데요.
해당 포스팅은 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/
'Programming > MySQL' 카테고리의 다른 글
MySQL BETWEEN과 부등호 성능 비교해 보기 (+ 날짜 타입과 숫자 타입 비교) (1) | 2024.06.02 |
---|---|
MySQL 공식 샘플 데이터베이스 적용하는 방법 (테스트용 데이터베이스) (0) | 2024.05.31 |
MySQL Workbench, ERD 생성 방법(+ zero or one 설정 방법) (0) | 2023.08.27 |
mysql nextval 사용하는 방법 (oracle sequence 기능) (0) | 2023.05.13 |
MySQL 날짜, 시간 더하고 빼기 및 타임존 변경(DATE_ADD, DATE_SUB, CONVERT_TZ) (0) | 2023.04.07 |