개요
MySQL에서 중복을 제외한 고유한 항목의 개수를 구하려면 COUNT() 함수와 DISTINCT 키워드를 함께 사용하면 됩니다. DISTINCT는 지정된 컬럼에서 중복된 값을 제거하고 유일한 값만 반환하는 역할을 합니다.
이번 글에서는 실제 예제를 통해 단일 쿼리로 서로 다른 항목의 개수를 계산하는 방법을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 실습에 사용할 테이블을 생성합니다. 고객 ID, 고객 이름, 제품 이름을 저장하는 간단한 테이블입니다.
mysql> create table DemoTable
(
CustomerId int,
CustomerName varchar(20),
ProductName varchar(40)
);
Query OK, 0 rows affected (1.02 sec)2. 샘플 데이터 삽입
INSERT 명령을 사용해 몇 개의 레코드를 삽입합니다. 의도적으로 동일한 데이터를 여러 번 추가하여 중복 데이터가 있는 상황을 만들었습니다.
mysql> insert into DemoTable values(101,'Chris','Product-1'); Query OK, 1 row affected (0.10 sec) mysql> insert into DemoTable values(102,'David','Product-2'); Query OK, 1 row affected (0.19 sec) mysql> insert into DemoTable values(101,'Chris','Product-1'); Query OK, 1 row affected (0.30 sec) mysql> insert into DemoTable values(101,'Chris','Product-2'); Query OK, 1 row affected (0.14 sec) mysql> insert into DemoTable values(101,'Chris','Product-1'); Query OK, 1 row affected (0.14 sec)
3. 전체 레코드 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+------------+--------------+-------------+ | CustomerId | CustomerName | ProductName | +------------+--------------+-------------+ | 101 | Chris | Product-1 | | 102 | David | Product-2 | | 101 | Chris | Product-1 | | 101 | Chris | Product-2 | | 101 | Chris | Product-1 | +------------+--------------+-------------+ 5 rows in set (0.00 sec)
테이블에는 총 5개의 레코드가 있으며, 그중 CustomerId가 101인 고객 'Chris'의 레코드는 4개입니다. 이 레코드들을 자세히 보면 'Product-1'이 3번, 'Product-2'가 1번 등장합니다. 즉, 중복을 제거하면 실제 구매한 서로 다른 제품은 2개입니다.
4. 단일 쿼리로 고유 항목 개수 세기
다음은 COUNT(DISTINCT)를 활용해 특정 고객이 구매한 서로 다른 제품의 개수를 한 번의 쿼리로 구하는 방법입니다.
mysql> select count(distinct ProductName) from DemoTable where CustomerId=101;
실행 결과는 다음과 같습니다.
+-----------------------------+ | count(distinct ProductName) | +-----------------------------+ | 2 | +-----------------------------+ 1 row in set (0.00 sec)
결과 분석
CustomerId가 101인 레코드는 총 4개지만, ProductName 기준으로 중복을 제거하면 'Product-1'과 'Product-2' 두 가지뿐입니다. 따라서 쿼리 결과로 2가 반환됩니다.
핵심 정리
- COUNT(컬럼명): 해당 컬럼의 NULL이 아닌 값의 개수를 반환합니다.
- COUNT(DISTINCT 컬럼명): 중복을 제거한 후의 고유한 값 개수를 반환합니다.
- WHERE 절: 특정 조건(예: 특정 고객)에 해당하는 행만 대상으로 집계할 수 있습니다.
이처럼 COUNT()와 DISTINCT를 조합하면 별도의 서브쿼리나 복잡한 로직 없이도 단일 쿼리만으로 원하는 고유 항목의 개수를 손쉽게 계산할 수 있습니다.