MySQL에서 특정 값이 두 번 이상 반복해서 나타나는 레코드를 찾고 싶다면 GROUP BY 절과 HAVING 절을 함께 사용하면 됩니다. GROUP BY로 데이터를 그룹화한 뒤, HAVING 조건을 통해 그룹별 개수가 특정 기준을 초과하는 항목만 필터링할 수 있습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다. Id 컬럼은 자동 증가 기본 키로 설정하고, Subject 컬럼에는 과목명을 저장합니다.
mysql> create table DemoTable
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Subject varchar(100)
-> );
Query OK, 0 rows affected (0.53 sec)2. 샘플 데이터 삽입하기
INSERT 명령어를 사용해 몇 개의 레코드를 삽입합니다. 이때 'MySQL'과 'MongoDB'는 의도적으로 여러 번 삽입하여 중복 데이터를 만듭니다.
mysql> insert into DemoTable(Subject) values('MySQL');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(Subject) values('MongoDB');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable(Subject) values('MySQL');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable(Subject) values('Java');
Query OK, 1 row affected (0.56 sec)
mysql> insert into DemoTable(Subject) values('SQL Server');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(Subject) values('MongoDB');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(Subject) values('MySQL');
Query OK, 1 row affected (0.48 sec)3. 전체 레코드 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
출력 결과
+----+------------+ | Id | Subject | +----+------------+ | 1 | MySQL | | 2 | MongoDB | | 3 | MySQL | | 4 | Java | | 5 | SQL Server | | 6 | MongoDB | | 7 | MySQL | +----+------------+ 7 rows in set (0.00 sec)
테이블을 살펴보면 'MySQL'은 3번, 'MongoDB'는 2번 등록되어 있는 것을 확인할 수 있습니다.
4. 두 번 이상 중복된 레코드 조회하기
이제 GROUP BY와 HAVING 절을 사용해 두 번 이상(2회 초과) 나타난 고유한 레코드를 조회하는 쿼리입니다. COUNT 함수로 각 Subject의 빈도수를 계산하고, HAVING 조건으로 2보다 큰 경우만 출력합니다.
mysql> select Subject,count(Subject) freq from DemoTable -> group by Subject -> having count(Subject) > 2;
출력 결과
+---------+------+ | Subject | freq | +---------+------+ | MySQL | 3 | +---------+------+ 1 row in set (0.00 sec)
정리
위 쿼리의 실행 결과, 'MySQL'만 3번 등록되어 조건을 충족했음을 알 수 있습니다. 참고로 MongoDB는 정확히 2번 등록되었기 때문에 > 2 조건에는 포함되지 않습니다. 만약 2번 이상(2회 포함) 중복된 항목까지 찾고 싶다면 조건을 having count(Subject) >= 2로 변경하면 됩니다.
이처럼 GROUP BY + HAVING 조합은 중복 데이터 분석, 통계 집계, 이상치 탐지 등 다양한 상황에서 유용하게 활용될 수 있습니다.