데이터베이스 작업을 하다 보면 특정 컬럼의 값이 중복된 레코드를 찾아야 하는 경우가 자주 발생합니다. 이 글에서는 MySQL에서 GROUP BY와 HAVING 절을 활용해 중복 레코드를 찾고 표시하는 방법을 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 CREATE 명령어를 사용하여 예제용 테이블을 생성합니다.
mysql> CREATE table DuplicateFound
-> (
-> ID int,
-> Name varchar(100),
-> Location varchar(200)
-> );
Query OK, 0 rows affected (0.45 sec)
2. 레코드 삽입하기
테이블 생성이 완료되면 INSERT 명령어로 데이터를 입력합니다. 여기서는 Location 값에 의도적으로 중복('US', 'UK')이 포함되도록 구성했습니다.
mysql> INSERT into DuplicateFound values(1,'John','US');
Query OK, 1 row affected (0.10 sec)
mysql> INSERT into DuplicateFound values(2,'Bob','UK');
Query OK, 1 row affected (0.18 sec)
mysql> INSERT into DuplicateFound values(3,'David','US');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT into DuplicateFound values(4,'Smith','US');
Query OK, 1 row affected (0.16 sec)
mysql> INSERT into DuplicateFound values(5,'Carol','UK');
Query OK, 1 row affected (0.16 sec)
3. 전체 데이터 확인하기
SELECT 문으로 테이블에 저장된 전체 레코드를 조회합니다.
mysql> SELECT * from DuplicateFound;
실행 결과는 다음과 같습니다.
+------+-------+----------+
| ID | Name | Location |
+------+-------+----------+
| 1 | John | US |
| 2 | Bob | UK |
| 3 | David | US |
| 4 | Smith | US |
| 5 | Carol | UK |
+------+-------+----------+
5 rows in set (0.00 sec)
4. 중복 레코드 찾아 표시하기
중복된 Location 값을 가진 모든 레코드를 함께 조회하려면 서브쿼리와 GROUP BY ... HAVING COUNT() > 1 조건을 활용합니다.
mysql> SELECT * from DuplicateFound
-> where location in (select location from DuplicateFound group by location having count(location) >1 )
-> order by location;
실행 결과는 다음과 같습니다. 중복된 위치(US, UK)에 속한 레코드만 위치별로 정렬되어 출력됩니다.
+------+-------+----------+
| ID | Name | Location |
+------+-------+----------+
| 2 | Bob | UK |
| 5 | Carol | UK |
| 1 | John | US |
| 3 | David | US |
| 4 | Smith | US |
+------+-------+----------+
5 rows in set (0.06 sec)
5. 중복 그룹별 대표 레코드만 표시하기
전체 레코드가 아닌, 중복이 존재하는 각 위치별로 하나의 대표 레코드만 확인하고 싶다면 GROUP BY와 HAVING 절만 사용하면 됩니다.
mysql> select Name,location from DuplicateFound
-> group by location
-> having count(location) > 1;
실행 결과는 다음과 같습니다.
+------+----------+
| Name | Location |
+------+----------+
| John | US |
| Bob | UK |
+------+----------+
2 rows in set (0.04 sec)
핵심 정리
- WHERE IN + 서브쿼리: 중복 값을 가진 모든 레코드를 상세히 조회할 때 사용합니다.
- GROUP BY + HAVING COUNT() > 1: 중복이 발생한 그룹 자체를 식별할 때 사용합니다.
- ORDER BY: 결과를 특정 컬럼 기준으로 정렬하여 가독성을 높입니다.
이처럼 GROUP BY와 HAVING 절의 조합은 데이터 정제, 중복 검사, 데이터 품질 관리 등 다양한 실무 상황에서 유용하게 활용될 수 있습니다.