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

MySQL에서 특정 열의 값이 중복된 행을 찾는 방법

MySQL 테이블에서 특정 열에 동일한 값이 여러 번 저장된 행(중복 데이터)만 조회해야 하는 경우가 자주 있습니다. 이 글에서는 예제 테이블을 만들고, GROUP BY와 HAVING 절을 활용해 중복된 값을 가진 행만 추출하는 방법을 단계별로 살펴보겠습니다.

1. 테이블 생성하기

먼저 실습에 사용할 테이블을 생성합니다. 아래 예제에서는 이름(Name) 값을 저장하는 간단한 테이블을 만들어 보겠습니다.

mysql> create table RowValueDemo
-> (
-> Name varchar(100)
-> );
Query OK, 0 rows affected (0.69 sec)

2. 샘플 데이터 삽입하기

INSERT 명령어를 사용해 레코드를 추가합니다. 이번 예제에서는 의도적으로 'John'과 'Bob'처럼 중복된 값을 함께 넣었습니다.

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

mysql> insert into RowValueDemo values('Bob');
Query OK, 1 row affected (0.14 sec)

mysql> insert into RowValueDemo values('Carol');
Query OK, 1 row affected (0.11 sec)

mysql> insert into RowValueDemo values('John');
Query OK, 1 row affected (0.24 sec)

mysql> insert into RowValueDemo values('John');
Query OK, 1 row affected (0.09 sec)

mysql> insert into RowValueDemo values('John');
Query OK, 1 row affected (0.10 sec)

mysql> insert into RowValueDemo values('Bob');
Query OK, 1 row affected (0.09 sec)

mysql> insert into RowValueDemo values('Bob');
Query OK, 1 row affected (0.18 sec)

3. 전체 레코드 확인하기

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

mysql> select *from RowValueDemo;

실행 결과는 다음과 같습니다.

+-------+
| Name  |
+-------+
| John  |
| Bob   |
| Carol |
| John  |
| John  |
| John  |
| Bob   |
| Bob   |
+-------+
8 rows in set (0.00 sec)

4. 중복된 값을 가진 행만 조회하기

이제 서브쿼리와 GROUP BY, HAVING 절을 조합하여 동일한 값이 두 개 이상 존재하는 행만 가져오는 쿼리를 실행해 보겠습니다.

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

실행 결과는 다음과 같습니다.

+------+
| Name |
+------+
| John |
| Bob  |
| John |
| John |
| John |
| Bob  |
| Bob  |
+------+
7 rows in set (0.06 sec)

쿼리 동작 원리

위 쿼리가 어떻게 작동하는지 간단히 정리하면 다음과 같습니다.

내부 서브쿼리: select Name from RowValueDemo group by Name having count(*) > 1 부분은 Name 열을 기준으로 그룹화한 뒤, 해당 값이 2개 이상 등장하는 이름만 반환합니다. 이 예제에서는 'John'과 'Bob'이 해당됩니다.

외부 쿼리: where Name in (...) 조건을 통해 서브쿼리가 반환한 이름과 일치하는 모든 원본 행을 그대로 출력합니다. 따라서 'Carol'처럼 한 번만 등장한 값은 결과에서 제외되고, 중복된 행 7개만 조회됩니다.

이 방식은 대용량 테이블에서도 인덱스를 적절히 활용하면 효율적으로 동작하며, 중복 데이터를 점검하거나 정리할 때 매우 유용하게 사용할 수 있습니다.