MySQL에서 중복된 행을 찾아야 할 때 가장 효과적인 방법은 GROUP BY 절과 HAVING 절을 함께 사용하는 것입니다. 특히 두 개 이상의 컬럼이 조합된 복합 키(composite key)를 기준으로 중복을 판별할 때 유용합니다.
이 글에서는 배송 날짜(ShippingDate)와 고객 국가명(CustomerCountryName)을 조합하여 중복 데이터를 찾는 과정을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 실습에 사용할 테이블을 생성합니다. 테이블에는 datetime 타입의 배송 날짜와 varchar 타입의 국가명 컬럼이 포함됩니다.
mysql> create table DemoTable1494
-> (
-> ShippingDate datetime,
-> CustomerCountryName varchar(20)
-> );
Query OK, 0 rows affected (0.63 sec)2. 샘플 데이터 삽입
INSERT 명령어를 사용해 몇 개의 레코드를 입력합니다. 의도적으로 같은 날짜(일 단위)와 국가 조합이 반복되도록 데이터를 구성했습니다.
mysql> insert into DemoTable1494 values('2018-09-10 12:34:50','US');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1494 values('2019-09-10 12:34:50','AUS');
Query OK, 1 row affected (0.65 sec)
mysql> insert into DemoTable1494 values('2018-09-10 11:00:00','US');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1494 values('2017-12-31 01:10:40','UK');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable1494 values('2019-09-10 05:00:50','AUS');
Query OK, 1 row affected (0.49 sec)3. 전체 레코드 확인
SELECT 문으로 테이블의 모든 데이터를 조회해 보겠습니다.
mysql> select * from DemoTable1494;
실행 결과는 다음과 같습니다.
+---------------------+---------------------+ | ShippingDate | CustomerCountryName | +---------------------+---------------------+ | 2018-09-10 12:34:50 | US | | 2019-09-10 12:34:50 | AUS | | 2018-09-10 11:00:00 | US | | 2017-12-31 01:10:40 | UK | | 2019-09-10 05:00:50 | AUS | +---------------------+---------------------+ 5 rows in set (0.00 sec)
4. 중복 행 조회 쿼리 작성
이제 핵심인 중복 확인 쿼리입니다. date() 함수로 datetime 값을 일(day) 단위로 변환한 뒤 국가명과 함께 그룹화하고, HAVING 절로 그룹 내 건수가 2건 이상인 경우만 필터링합니다.
mysql> select ShippingDate,CustomerCountryName,count(*) as c
-> from DemoTable1494
-> group by date(ShippingDate),CustomerCountryName
-> having c >=2
-> order by c;5. 실행 결과 분석
쿼리 실행 결과는 다음과 같습니다.
+---------------------+---------------------+---+ | ShippingDate | CustomerCountryName | c | +---------------------+---------------------+---+ | 2018-09-10 12:34:50 | US | 2 | | 2019-09-10 12:34:50 | AUS | 2 | +---------------------+---------------------+---+ 2 rows in set (0.00 sec)
결과를 보면 2018-09-10의 'US'와 2019-09-10의 'AUS' 조합이 각각 2건씩 존재하는 것, 즉 중복 데이터임을 확인할 수 있습니다.
핵심 포인트 정리
- GROUP BY: 중복 여부를 판단할 기준 컬럼들(복합 키)로 데이터를 그룹화합니다.
- COUNT(*): 각 그룹에 속한 행의 개수를 계산합니다.
- HAVING: 집계 함수의 결과를 조건으로 필터링할 때 사용하며, WHERE 절과 달리 그룹화 이후에 적용됩니다.
- date() 함수: 시간 정보를 제외하고 날짜만 비교하고 싶을 때 유용합니다.
이처럼 GROUP BY와 HAVING을 조합하면 복합 키 기준의 중복 데이터를 손쉽게 식별할 수 있으며, 필요에 따라 DELETE 문과 서브쿼리를 결합해 중복 행을 제거하는 것도 가능합니다.