Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 중복 데이터 전체 조회하기 – 서브쿼리와 GROUP BY 활용법

MySQL에서 중복된 데이터를 모두 조회하려면 서브쿼리(subquery)를 활용하면 됩니다. 핵심 아이디어는 GROUP BY로 이름별 개수를 세고, HAVING 절로 2개 이상 존재하는 값만 걸러내는 것입니다. 이번 글에서는 예제 테이블을 직접 만들고, 중복 레코드를 조회하는 과정을 단계별로 살펴보겠습니다.

1단계: 예제 테이블 생성

먼저 자동 증가 기본키(Id)와 이름(Name) 컬럼을 가진 데모 테이블을 생성합니다.

mysql> create table DemoTable
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name varchar(100)
-> );
Query OK, 0 rows affected (0.87 sec)

2단계: 샘플 데이터 삽입

INSERT 명령어로 여러 레코드를 입력합니다. 'John', 'Chris', 'Mike'는 의도적으로 두 번씩 삽입했습니다.

mysql> insert into DemoTable(Name) values('John');
Query OK, 1 row affected (0.16 sec)

mysql> insert into DemoTable(Name) values('Chris');
Query OK, 1 row affected (0.21 sec)

mysql> insert into DemoTable(Name) values('John');
Query OK, 1 row affected (0.14 sec)

mysql> insert into DemoTable(Name) values('David');
Query OK, 1 row affected (0.13 sec)

mysql> insert into DemoTable(Name) values('Bob');
Query OK, 1 row affected (0.15 sec)

mysql> insert into DemoTable(Name) values('Chris');
Query OK, 1 row affected (0.16 sec)

mysql> insert into DemoTable(Name) values('Mike');
Query OK, 1 row affected (0.14 sec)

mysql> insert into DemoTable(Name) values('Robert');
Query OK, 1 row affected (0.11 sec)

mysql> insert into DemoTable(Name) values('Mike');
Query OK, 1 row affected (0.12 sec)

3단계: 전체 데이터 확인

SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.

mysql> select *from DemoTable;

출력 결과

+----+--------+
| Id | Name |
+----+--------+
| 1 | John |
| 2 | Chris |
| 3 | John |
| 4 | David |
| 5 | Bob |
| 6 | Chris |
| 7 | Mike |
| 8 | Robert |
| 9 | Mike |
+----+--------+
9 rows in set (0.00 sec)

4단계: 중복 데이터 조회 쿼리 실행

아래 쿼리가 바로 모든 중복 레코드를 선택하는 핵심 쿼리입니다. 내부 서브쿼리가 GROUP BY Name HAVING COUNT(*) > 1 조건으로 중복되는 이름 목록을 추출하고, 외부 쿼리가 해당 이름을 가진 전체 행을 반환합니다.

mysql> select *from DemoTable
-> where Name in (select Name from DemoTable group by Name having count(*) > 1);

출력 결과

+----+-------+
| Id | Name |
+----+-------+
| 1 | John |
| 2 | Chris |
| 3 | John |
| 6 | Chris |
| 7 | Mike |
| 9 | Mike |
+----+-------+
6 rows in set (0.09 sec)

쿼리 동작 원리 정리

  • GROUP BY Name: 이름 값을 기준으로 레코드를 그룹화합니다.
  • HAVING COUNT(*) > 1: 그룹 내 레코드 수가 2개 이상인 경우, 즉 중복된 이름만 필터링합니다.
  • WHERE Name IN (...): 서브쿼리가 반환한 중복 이름에 해당하는 모든 행을 메인 테이블에서 가져옵니다.

이 패턴은 특정 컬럼 기준으로 중복을 찾아야 할 때 어디서든 응용할 수 있으며, 컬럼만 바꾸면 이메일·전화번호 등 다른 필드의 중복 검사에도 그대로 적용할 수 있습니다.