MySQL에서 특정 열에 단 한 번만 나타나는 값의 개수를 구하려면 GROUP BY와 HAVING 절을 함께 활용하면 됩니다. 이 글에서는 실제 예제를 통해 그 방법을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 실습에 사용할 간단한 테이블을 생성합니다.
mysql> create table DemoTable
(
Name varchar(20)
);
Query OK, 0 rows affected (0.55 sec)2. 데이터 삽입
다음으로 INSERT 명령어를 사용해 여러 개의 레코드를 삽입합니다. 일부 이름은 의도적으로 중복되도록 입력했습니다.
mysql> insert into DemoTable values('Larry');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('Larry');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('Sam');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('Chris');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('Sam');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('Mike');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('Sam');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('Larry');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable values('Mike');
Query OK, 1 row affected (0.32 sec)
mysql> insert into DemoTable values('Mike');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('Carol');
Query OK, 1 row affected (0.27 sec)
mysql> insert into DemoTable values('Robert');
Query OK, 1 row affected (0.27 sec)3. 저장된 데이터 확인
SELECT 문으로 테이블에 저장된 전체 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
+--------+ | Name | +--------+ | Larry | | Larry | | Sam | | Chris | | Sam | | Mike | | Sam | | Larry | | Mike | | Mike | | Carol | | Robert | +--------+ 12 rows in set (0.00 sec)
데이터를 보면 'Chris', 'Carol', 'Robert'는 각각 한 번만 나타나고, 'Larry'는 3번, 'Sam'은 3번, 'Mike'는 3번 나타납니다.
4. 한 번만 나타나는 값의 개수 세기
이제 핵심 쿼리입니다. 서브쿼리로 Name 열에서 딱 한 번만 등장하는 값들을 추출한 뒤, 바깥쪽에서 COUNT() 함수로 그 개수를 집계합니다.
mysql> SELECT COUNT(Name)
FROM (
SELECT Name
FROM DemoTable
GROUP BY Name
HAVING COUNT(*) = 1
) AS APPEAR_FIRST_TIME;쿼리 실행 결과는 다음과 같습니다.
+-------------+ | COUNT(Name) | +-------------+ | 3 | +-------------+ 1 row in set (0.00 sec)
쿼리 동작 원리
이 쿼리가 어떻게 작동하는지 살펴보겠습니다.
- GROUP BY Name: 이름별로 레코드를 그룹화합니다.
- HAVING COUNT(*) = 1: 그룹 내 레코드 수가 정확히 1개인 그룹, 즉 한 번만 나타난 값만 필터링합니다.
WHERE대신HAVING을 사용하는 이유는 집계 함수 조건은HAVING에서만 처리할 수 있기 때문입니다. - COUNT(Name): 필터링된 결과(Chris, Carol, Robert)의 개수인 3을 반환합니다.
이처럼 GROUP BY와 HAVING을 조합하면 중복 데이터 분석, 고유값 식별 등 다양한 상황에서 유용하게 활용할 수 있습니다.