MySQL에서 특정 컬럼의 값이 중복되지 않은(단 한 번만 등장하는) 레코드만 추출하고 싶다면, GROUP BY와 HAVING 절을 함께 사용하면 됩니다. 이 글에서는 예제 테이블을 만들고, 서브쿼리를 활용해 중복되지 않은 Id를 가진 레코드를 조회하는 과정을 단계별로 살펴봅니다.
1. 예제 테이블 생성
먼저 데모용 테이블을 생성합니다.
mysql> create table DemoTable ( Id int, ColorName varchar(100) ); Query OK, 0 rows affected (0.56 sec)
2. 샘플 데이터 삽입
INSERT 명령어를 사용해 몇 개의 레코드를 입력합니다. 이때 Id 값에 일부러 중복(100, 101)을 포함시킵니다.
mysql> insert into DemoTable values(100,'Red'); Query OK, 1 row affected (0.11 sec) mysql> insert into DemoTable values(101,'Green'); Query OK, 1 row affected (0.20 sec) mysql> insert into DemoTable values(101,'Blue'); Query OK, 1 row affected (0.28 sec) mysql> insert into DemoTable values(102,'Yellow'); Query OK, 1 row affected (0.18 sec) mysql> insert into DemoTable values(100,'Purple'); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable values(100,'Black'); Query OK, 1 row affected (0.26 sec)
3. 전체 레코드 확인
SELECT 문으로 테이블의 모든 데이터를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+------+-----------+ | Id | ColorName | +------+-----------+ | 100 | Red | | 101 | Green | | 101 | Blue | | 102 | Yellow | | 100 | Purple | | 100 | Black | +------+-----------+ 6 rows in set (0.00 sec)
위 결과를 보면 Id 100은 3번, Id 101은 2번 등장하고, 오직 Id 102만 한 번만 나타나는 것을 확인할 수 있습니다.
4. 중복되지 않은 Id를 가진 레코드 조회하기
핵심 아이디어는 서브쿼리에서 GROUP BY로 Id를 그룹화한 뒤, HAVING COUNT(*) < 2 조건으로 두 번 이상 등장하지 않는 Id만 필터링하는 것입니다.
mysql> select *from DemoTable where Id in(select Id from DemoTable group by Id having count(*) < 2);
실행 결과는 다음과 같습니다.
+------+-----------+ | Id | ColorName | +------+-----------+ | 102 | Yellow | +------+-----------+ 1 row in set (0.07 sec)
쿼리 동작 원리 정리
GROUP BY Id: 동일한 Id 값을 가진 행들을 하나의 그룹으로 묶습니다.HAVING COUNT(*) < 2: 각 그룹의 행 수가 1개인 경우, 즉 해당 Id가 테이블에 단 한 번만 등장하는 경우만 남깁니다.WHERE Id IN (...): 서브쿼리가 반환한 중복되지 않은 Id 목록에 포함된 레코드만 최종적으로 출력합니다.
이처럼 GROUP BY + HAVING 조합과 IN 서브쿼리를 활용하면, 별도의 임시 테이블 없이도 간단하게 중복되지 않은 값만 가진 레코드를 손쉽게 조회할 수 있습니다.