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

MySQL에서 열에 한 번만 나타나는 값의 개수 구하기

MySQL에서 특정 열에 단 한 번만 나타나는 값의 개수를 구하려면 GROUP BYHAVING 절을 함께 활용하면 됩니다. 이 글에서는 실제 예제를 통해 그 방법을 단계별로 살펴보겠습니다.

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 BYHAVING을 조합하면 중복 데이터 분석, 고유값 식별 등 다양한 상황에서 유용하게 활용할 수 있습니다.