MySQL에서 DISTINCT와 COUNT, HAVING 절을 함께 사용하면 테이블 내에서 두 번 이상 반복해서 나타나는 값만 손쉽게 추출할 수 있습니다. 이번 글에서는 실제 예제를 통해 그 사용 방법을 단계별로 살펴보겠습니다.
기본 문법
특정 횟수 이상 나타나는 필드 값을 반환하려면 아래와 같은 형식의 쿼리를 사용합니다.
select distinct yourColumnName, count(yourColumnName) from yourTableName where yourColumnName LIKE 'J%' group by yourColumnName having count(*) > 1 order by yourColumnName;
여기서 핵심은 GROUP BY로 값을 그룹화한 뒤, HAVING 절에서 그룹의 개수 조건을 필터링한다는 점입니다. WHERE 절은 개별 행에 대한 조건이기 때문에 집계 결과에는 사용할 수 없으며, 반드시 HAVING 절을 사용해야 합니다.
예제 테이블 생성하기
1. 테이블 만들기
먼저 실습용 테이블을 생성합니다.
mysql> create table DemoTable1500
-> (
-> Name varchar(20)
-> );
Query OK, 0 rows affected (0.86 sec)2. 데이터 삽입하기
INSERT 명령으로 몇 개의 레코드를 추가합니다. 일부러 중복되는 이름('John', 'Jace')도 함께 넣습니다.
mysql> insert into DemoTable1500 values('Adam');
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable1500 values('John');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable1500 values('Mike');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable1500 values('John');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable1500 values('Jace');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1500 values('Jace');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1500 values('Jackie');
Query OK, 1 row affected (0.06 sec)3. 저장된 데이터 확인하기
SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1500;
실행 결과는 다음과 같습니다.
+--------+ | Name | +--------+ | Adam | | John | | Mike | | John | | Jace | | Jace | | Jackie | +--------+ 7 rows in set (0.00 sec)
총 7개의 행이 있으며, 'John'과 'Jace'는 각각 2번씩 등장한 것을 확인할 수 있습니다.
두 번 이상 나타나는 값만 조회하는 쿼리
이제 DISTINCT, GROUP BY, HAVING을 조합하여 이름이 'J'로 시작하고 두 번 이상 등장하는 값만 반환하는 쿼리를 실행해 보겠습니다.
mysql> select distinct Name, count(Name)
-> from DemoTable1500
-> where Name LIKE 'J%'
-> group by Name
-> having count(*) > 1
-> order by Name;실행 결과는 다음과 같습니다.
+------+-------------+ | Name | count(Name) | +------+-------------+ | Jace | 2 | | John | 2 | +------+-------------+ 2 rows in set (0.00 sec)
결과 분석
- WHERE Name LIKE 'J%': 이름이 'J'로 시작하는 행만 우선 걸러냅니다. 따라서 'Adam'과 'Mike'는 처음부터 제외됩니다.
- GROUP BY Name: 남은 값들을 이름 기준으로 그룹화합니다.
- HAVING count(*) > 1: 그룹 내 행의 수가 2개 이상인 그룹만 남깁니다. 'Jackie'는 한 번만 등장했으므로 여기서 제외됩니다.
- ORDER BY Name: 최종 결과를 이름 순으로 정렬합니다.
결국 'Jace'와 'John'처럼 정확히 두 번 이상 나타나는 값만 출력되며, 각 값의 등장 횟수까지 함께 확인할 수 있습니다. 이 패턴은 중복 데이터 분석, 통계 집계, 이상치 탐지 등 실무에서 매우 자주 활용되므로 꼭 익혀두시길 권장합니다.