MySQL에서 특정 열에 중복된 값이 있는지 확인하고 싶다면 GROUP BY 절과 HAVING 절을 함께 사용하면 됩니다. 이 글에서는 실제 예제를 통해 중복 데이터를 찾는 방법을 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다. 여기서는 자동차 모델명을 저장하는 간단한 테이블을 만들어 보겠습니다.
mysql> create table DemoTable1858 ( ModelNumber varchar(50) ); Query OK, 0 rows affected (0.00 sec)
2. 샘플 데이터 삽입하기
INSERT 명령을 사용해 테이블에 레코드를 추가합니다. 의도적으로 중복되는 값('Audi A4', 'Audi Q5')을 포함시켰습니다.
mysql> insert into DemoTable1858 values('Audi A4');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1858 values('Audi A6');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1858 values('Audi A4');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1858 values('Audi Q5');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1858 values('Audi R8');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1858 values('Audi Q5');
Query OK, 1 row affected (0.00 sec)3. 전체 데이터 확인하기
SELECT 문을 사용해 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1858;
위 쿼리는 다음과 같은 결과를 출력합니다.
+-------------+ | ModelNumber | +-------------+ | Audi A4 | | Audi A6 | | Audi A4 | | Audi Q5 | | Audi R8 | | Audi Q5 | +-------------+ 6 rows in set (0.00 sec)
결과를 보면 'Audi A4'와 'Audi Q5'가 각각 두 번씩 저장되어 있음을 확인할 수 있습니다.
4. 중복 값 찾기 — GROUP BY + HAVING
이제 핵심인 중복 값 조회 쿼리입니다. GROUP BY로 열 값을 그룹화한 뒤, HAVING 절에서 COUNT가 2 이상인 그룹만 필터링하면 중복된 값만 추출할 수 있습니다.
mysql> select ModelNumber from DemoTable1858 group by ModelNumber having count(ModelNumber) >=2;
실행 결과는 다음과 같습니다.
+-------------+ | ModelNumber | +-------------+ | Audi A4 | | Audi Q5 | +-------------+ 2 rows in set (0.00 sec)
동작 원리 정리
이 쿼리가 작동하는 방식은 다음과 같습니다.
GROUP BY ModelNumber — 동일한 모델명을 가진 행들을 하나의 그룹으로 묶습니다.
HAVING count(ModelNumber) >= 2 — 각 그룹 내 행의 개수가 2개 이상인 경우, 즉 중복이 발생한 값만 최종 결과에 남깁니다.
WHERE 절은 그룹화 전에 개별 행을 필터링하지만, HAVING 절은 그룹화 이후 집계 결과를 기준으로 필터링한다는 점이 핵심입니다. 따라서 COUNT(), SUM() 같은 집계 함수 조건에는 반드시 HAVING을 사용해야 합니다.
또한 중복 횟수까지 함께 확인하고 싶다면 SELECT 절에 count(ModelNumber)를 추가하면 각 값이 몇 번 반복되었는지 한눈에 파악할 수 있습니다.