MySQL에서 COUNT(DISTINCT)로 고유한 행 개수 구하기
MySQL에서 COUNT() 함수는 테이블의 행(row) 개수를 반환합니다. 여기에 DISTINCT 키워드를 함께 사용하면 중복된 값을 제외하고 오직 고유한(unique) 값의 개수만 계산할 수 있습니다.
예를 들어 이름 목록에서 'John'이 3번 반복되더라도 실제 고유한 이름은 몇 개인지 확인할 때 유용합니다. 아래 예제를 통해 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 다음 쿼리로 테스트용 테이블을 생성합니다.
mysql> create table DemoTable
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
FirstName varchar(10)
);
Query OK, 0 rows affected (0.47 sec)2. 샘플 데이터 삽입하기
INSERT 명령을 사용해 중복 값을 포함한 레코드를 입력합니다.
mysql> insert into DemoTable(FirstName) values('Larry');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable(FirstName) values('John');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable(FirstName) values('Sam');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(FirstName) values('John');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(FirstName) values('John');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable(FirstName) values('Larry');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(FirstName) values('Mike');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable(FirstName) values('Robert');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(FirstName) values('Carol');
Query OK, 1 row affected (0.13 sec)mysql> insert into DemoTable(FirstName) values('Mike');
Query OK, 1 row affected (0.12 sec)3. 저장된 데이터 확인하기
SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
위 쿼리는 다음과 같은 결과를 출력합니다.
+----+-----------+ | Id | FirstName | +----+-----------+ | 1 | Larry | | 2 | John | | 3 | Sam | | 4 | John | | 5 | John | | 6 | Larry | | 7 | Mike | | 8 | Robert | | 9 | Carol | | 10 | Mike | +----+-----------+ 10 rows in set (0.00 sec)
전체 10개의 행 중 'John'은 3번, 'Larry'와 'Mike'는 각각 2번씩 반복되어 있습니다.
4. 고유한 값만 카운트하기
COUNT 함수 안에 DISTINCT를 적용하면 중복 행을 무시하고 고유한 값의 개수만 집계할 수 있습니다.
mysql> select count(distinct FirstName) from DemoTable;
실행 결과는 다음과 같습니다.
+---------------------------+ | count(distinct FirstName) | +---------------------------+ | 6 | +---------------------------+ 1 row in set (0.03 sec)
결과를 보면 전체 10개의 행이 있었지만, 실제 고유한 이름은 Larry, John, Sam, Mike, Robert, Carol의 6개임을 확인할 수 있습니다.
정리
- COUNT(*): 중복을 포함한 전체 행의 개수를 반환합니다.
- COUNT(DISTINCT 컬럼명): 해당 컬럼에서 중복을 제거한 고유한 값의 개수만 반환합니다.
이처럼 COUNT(DISTINCT) 조합을 활용하면 회원 통계, 태그 개수 집계 등 중복 없는 데이터 분석이 필요한 상황에서 손쉽게 원하는 결과를 얻을 수 있습니다.