Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL GROUP BY와 HAVING을 활용해 중복되지 않은 ID의 레코드만 조회하는 방법

MySQL에서 특정 컬럼의 값이 중복되지 않은(단 한 번만 등장하는) 레코드만 추출하고 싶다면, GROUP BYHAVING 절을 함께 사용하면 됩니다. 이 글에서는 예제 테이블을 만들고, 서브쿼리를 활용해 중복되지 않은 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 서브쿼리를 활용하면, 별도의 임시 테이블 없이도 간단하게 중복되지 않은 값만 가진 레코드를 손쉽게 조회할 수 있습니다.