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

MySQL에서 컬럼의 고유 값 개수 구하기 – COUNT(DISTINCT) 완벽 가이드

MySQL에서 특정 컬럼의 고유한(distinct) 값의 개수를 세고 싶다면 DISTINCT 키워드를 사용하면 됩니다. 이 글에서는 실제 예제 테이블을 만들고, IP 주소별 고유 접속 수를 집계하는 과정을 단계별로 살펴보겠습니다.

1. 예제 테이블 생성하기

먼저 사용자 접속 정보를 저장할 테이블을 생성합니다. 아래 쿼리는 자동 증가되는 Id, 조회 수(UserHits), 사용자 IP 주소(UserIPAddress)를 컬럼으로 갖는 테이블을 만듭니다.

mysql> create table UniqueCountByIPAddress
    -> (
    -> Id int NOT NULL AUTO_INCREMENT,
    -> UserHits int,
    -> UserIPAddress varchar(50),
    -> PRIMARY KEY(Id)
    -> );
Query OK, 0 rows affected (0.69 sec)

2. 샘플 데이터 삽입하기

테이블이 준비되었으면 INSERT 문으로 여러 건의 레코드를 입력합니다. 의도적으로 동일한 IP 주소와 조회 수가 중복되도록 데이터를 넣어, 나중에 DISTINCT 집계 결과를 명확하게 확인할 수 있도록 했습니다.

mysql> insert into UniqueCountByIPAddress(UserHits,UserIPAddress) values(10,'127.0.0.1');
Query OK, 1 row affected (0.20 sec)
mysql> insert into UniqueCountByIPAddress(UserHits,UserIPAddress) values(10,'127.0.0.1');
Query OK, 1 row affected (0.20 sec)
mysql> insert into UniqueCountByIPAddress(UserHits,UserIPAddress) values(20,'127.0.0.1');
Query OK, 1 row affected (0.20 sec)
mysql> insert into UniqueCountByIPAddress(UserHits,UserIPAddress) values(20,'127.0.0.1');
Query OK, 1 row affected (0.17 sec)
mysql> insert into UniqueCountByIPAddress(UserHits,UserIPAddress) values(20,'127.0.0.2');
Query OK, 1 row affected (0.13 sec)
mysql> insert into UniqueCountByIPAddress(UserHits,UserIPAddress) values(20,'127.0.0.2');
Query OK, 1 row affected (0.20 sec)
mysql> insert into UniqueCountByIPAddress(UserHits,UserIPAddress) values(30,'127.0.0.2');
Query OK, 1 row affected (0.17 sec)
mysql> insert into UniqueCountByIPAddress(UserHits,UserIPAddress) values(30,'127.0.0.2');
Query OK, 1 row affected (0.28 sec)
mysql> insert into UniqueCountByIPAddress(UserHits,UserIPAddress) values(30,'127.0.0.2');
Query OK, 1 row affected (0.14 sec)

3. 전체 데이터 확인하기

SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.

mysql> select *from UniqueCountByIPAddress;

실행 결과는 다음과 같습니다.

+----+----------+--------------+
| Id | UserHits | UserIPAddress|
+----+----------+--------------+
|  1 |       10 | 127.0.0.1    |
|  2 |       10 | 127.0.0.1    |
|  3 |       20 | 127.0.0.1    |
|  4 |       20 | 127.0.0.1    |
|  5 |       20 | 127.0.0.2    |
|  6 |       20 | 127.0.0.2    |
|  7 |       30 | 127.0.0.2    |
|  8 |       30 | 127.0.0.2    |
|  9 |       30 | 127.0.0.2    |
+----+----------+--------------+

4. COUNT(DISTINCT)로 고유 값 개수 집계하기

이제 핵심인 고유 값 집계 쿼리입니다. UserHits 값을 기준으로 그룹화(GROUP BY)한 뒤, 각 그룹 내에서 서로 다른 IP 주소가 몇 개인지 count(distinct UserIPAddress)로 계산합니다.

mysql> select UserHits,count(distinct UserIPAddress) as TotalHits
   -> from UniqueCountByIPAddress group by UserHits;

실행 결과는 다음과 같습니다.

+----------+-----------+
| UserHits | TotalHits |
+----------+-----------+
|       10 |         1 |
|       20 |         2 |
|       30 |         1 |
+----------+-----------+
3 rows in set (0.05 sec)

결과 해석

  • UserHits = 10: 해당 그룹에는 '127.0.0.1' 하나의 고유 IP만 존재하므로 1입니다.
  • UserHits = 20: '127.0.0.1'과 '127.0.0.2' 두 개의 서로 다른 IP가 있으므로 2입니다.
  • UserHits = 30: '127.0.0.2' 하나의 고유 IP만 있으므로 1입니다.

이처럼 COUNT(DISTINCT 컬럼명)GROUP BY를 함께 사용하면 중복을 제거한 고유 값의 개수를 손쉽게 집계할 수 있습니다. 로그 분석, 방문자 통계 등 중복 제거 카운트가 필요한 다양한 상황에서 유용하게 활용할 수 있습니다.