> ## Documentation Index
> Fetch the complete documentation index at: https://villagesql.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# MySQL COUNT DISTINCT

> MySQL에서 COUNT(DISTINCT column)이 행이 아니라 서로 다른 값을 세는 방법, 서로 다른 조합을 세는 방법, 그리고 NULL을 완전히 건너뛰는 이유입니다.

> [card] [VillageSQL is a drop-in replacement for MySQL with extensions.](https://villagesql.com/docs/en/8.4/stable/install-server.md)
>
> All examples on this page work on VillageSQL. Install Now →

`COUNT(*)`는 행이 몇 개인지 답합니다. `COUNT(DISTINCT column)`은 서로 다른 값이 몇 개인지 답하는데, 처음 만나는 열에 대해서는 보통 이쪽이 더 흥미로운 질문입니다.

시작하기 전에 `mysql -u root -p sakila`로 클라이언트를 여세요.

## COUNT DISTINCT의 동작 방식

```sql theme={null}
SELECT COUNT(DISTINCT COLUMN_NAME)
FROM TABLE_NAME;
```

`COLUMN_NAME`을 서로 다른 값을 세고 싶은 열로, `TABLE_NAME`을 테이블로 바꾸세요. 서버는 모든 행을 읽고, 반복되는 것을 버리고, 남은 것을 셉니다.

이것은 [SELECT DISTINCT](https://villagesql.com/docs/ko/tutorial/select-distinct.md)가 반환할 것의 개수이며, 그것을 반환하지는 않습니다.

## 예제

### 서로 다른 값이 몇 개인가

```sql theme={null}
SELECT COUNT(*) AS rows_total, COUNT(DISTINCT rating) AS ratings FROM film;
```

```text theme={null}
+------------+---------+
| rows_total | ratings |
+------------+---------+
|       1000 |       5 |
+------------+---------+
1 row in set (0.01 sec)
```

5개의 등급에서 나온 1,000편의 영화입니다.

### 서로 다른 조합

여러 열을 지정하면 조합 하나가 한 번 세어지며, `GROUP BY`가 그것들을 다루는 방식과 같습니다.

```sql theme={null}
SELECT COUNT(DISTINCT rating, rental_rate) AS combinations FROM film;
```

```text theme={null}
+--------------+
| combinations |
+--------------+
|           15 |
+--------------+
1 row in set (0.00 sec)
```

5개의 등급 곱하기 3개의 요금이고, 모든 조합이 나타납니다. 지정한 열 중 어느 하나라도 NULL인 행은 전혀 세어지지 않습니다.

## NULL을 건너뛰므로, 답이 잘못된 것처럼 보일 수 있습니다

`address2`는 4개 행에서 NULL이고 나머지 599개 행에서 빈 문자열입니다.

```sql theme={null}
SELECT COUNT(*) AS rows_total,
       COUNT(DISTINCT address2) AS distinct_values
FROM address;
```

```text theme={null}
+------------+-----------------+
| rows_total | distinct_values |
+------------+-----------------+
|        603 |               1 |
+------------+-----------------+
1 row in set (0.00 sec)
```

답은 1입니다. 빈 문자열은 1개의 서로 다른 값이고, NULL은 자체의 값으로 세어지는 대신 건너뛰어집니다. 그래서 일부 행이 비어 있을 때 이 함수가 답하는 것은 "이 열에 서로 다른 것이 몇 개 있는가"가 아닙니다: 이 함수는 "서로 다른 값이 몇 개인가"에 답하고, NULL은 값의 부재입니다.

두 숫자가 모두 필요하면, 두 번째 쿼리로 빠진 행을 세세요: `SELECT COUNT(*) FROM address WHERE address2 IS NULL`.

## 요약

* 행이 아니라 서로 다른 값을 세려면 `COUNT(DISTINCT column)`을 사용하세요.
* 서로 다른 조합을 세려면 여러 열을 지정하세요.
* NULL은 값으로 세어지지 않고 건너뛰어진다고 예상하세요.
* 두 숫자가 모두 필요하면 빠진 행을 따로 세세요.

## 함께 보기

* [집계 함수](https://villagesql.com/docs/ko/tutorial/aggregate-functions.md) — 나머지 집계 함수들
* [SELECT DISTINCT](https://villagesql.com/docs/ko/tutorial/select-distinct.md) — 그 값들을 세는 대신 반환하기
* [GROUP BY](https://villagesql.com/docs/ko/tutorial/group-by.md) — 범주별로 세기
* [MySQL GROUP BY 성능](https://villagesql.com/docs/ko/guides/group-by-having.md) — 대규모에서 중복 제거에 드는 비용


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.