> ## 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 집계 함수

> MySQL에서 COUNT, SUM, AVG, MIN, MAX가 여러 행을 1개의 값으로 줄이는 방법, 모든 집계 함수가 NULL을 건너뛰는 이유, 그리고 COUNT(*)와 COUNT(column)의 차이입니다.

> [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 →

지금까지의 모든 쿼리는 행을 반환했습니다. 집계 함수는 여러 행을 읽고 1개의 값을 반환합니다: 몇 개인지, 합계, 평균, 최댓값. 질문이 행 하나가 아니라 집합에 관한 것일 때 가장 먼저 손을 뻗는 도구입니다.

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

## 집계 함수의 동작 방식

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

`AGGREGATE_FUNCTION`을 아래 함수 중 하나로, `COLUMN_NAME`을 읽을 열로, `TABLE_NAME`을 테이블로 바꾸세요.

| 함수 | 반환값 |
| - | - |
| `COUNT(*)` | 행의 개수, NULL 포함 |
| `COUNT(column)` | 그 열에 값이 있는 행의 개수 |
| `SUM(column)` | 합계 |
| `AVG(column)` | 평균 |
| `MIN(column)` | 가장 작은 값 |
| `MAX(column)` | 가장 큰 값 |

`GROUP BY`가 없으면 테이블 전체가 1개의 그룹이므로, 결과는 항상 정확히 1개의 행입니다. 대신 범주마다 1개의 행을 얻는 방법은 [GROUP BY](https://villagesql.com/docs/ko/tutorial/group-by.md)입니다.

## 예제

### 행 세기

```sql theme={null}
SELECT COUNT(*) AS films FROM film;
```

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

테이블에 무엇이 들어 있든 1개의 행입니다. 집계 함수는 항상 답합니다.

### 여러 집계를 한 번에

```sql theme={null}
SELECT MIN(length) AS shortest, MAX(length) AS longest, AVG(length) AS mean
FROM film;
```

```text theme={null}
+----------+---------+----------+
| shortest | longest | mean     |
+----------+---------+----------+
|       46 |     185 | 115.2720 |
+----------+---------+----------+
1 row in set (0.00 sec)
```

각 함수가 같은 1,000개의 행을 읽습니다. 기본 제목은 표현식 전체이므로, [별칭](https://villagesql.com/docs/ko/tutorial/column-aliases.md)으로 이름을 붙이세요.

### 금액 열 합산

```sql theme={null}
SELECT SUM(amount) AS takings, COUNT(*) AS payments FROM payment;
```

```text theme={null}
+----------+----------+
| takings  | payments |
+----------+----------+
| 67406.56 |    16044 |
+----------+----------+
1 row in set (0.00 sec)
```

## COUNT(\*)와 COUNT(column)은 다른 질문입니다

`COUNT(*)`는 행을 셉니다. `COUNT(column)`은 그 열에 값이 있는 행을 세므로, NULL을 건너뜁니다.

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

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

603개의 주소가 있고, 그중 4개는 두 번째 줄이 아예 없습니다. 나머지 599개는 빈 문자열을 담고 있는데, `COUNT`는 그것을 다른 값과 똑같은 값으로 취급합니다: `COUNT`가 찾는 것은 NULL이지 빈칸이 아닙니다. [IS NULL](https://villagesql.com/docs/ko/tutorial/is-null.md) 레슨이 그 차이를 다룹니다.

## 모든 집계 함수는 NULL을 건너뜁니다

이 규칙은 `COUNT`에만 특별한 것이 아닙니다. 어떤 집계 함수도 NULL을 보지 않으므로, 아무것도 들어 있지 않은 열은 평균 낼 것도 만들어내지 않습니다. id의 평균을 내는 것은 의미 없는 산술이고, 이 쿼리가 그렇게 하는 이유는 `original_language_id`가 Sakila에서 모든 행이 NULL인 유일한 열이기 때문입니다.

```sql theme={null}
SELECT COUNT(*) AS films,
       COUNT(original_language_id) AS with_a_value,
       AVG(original_language_id) AS mean
FROM film;
```

```text theme={null}
+-------+--------------+------+
| films | with_a_value | mean |
+-------+--------------+------+
|  1000 |            0 | NULL |
+-------+--------------+------+
1 row in set (0.00 sec)
```

`AVG`는 0이 아니라 NULL을 반환했는데, 나눌 것이 없었기 때문입니다. 이것이 가장 중요한 경우는 가끔만 채워지는 열에 대한 `AVG`입니다: 평균은 전체 행이 아니라 값이 있는 행에 대한 것이고, 그 2개의 숫자는 같지 않습니다. 아무것도 없을 때 `SUM`도 NULL이지만, 아무것도 없을 때 `COUNT`는 0입니다.

## 요약

* 여러 행을 1개의 값으로 줄이려면 집계 함수를 사용하세요.
* `GROUP BY`가 없으면 정확히 1개의 행이 돌아온다고 예상하세요.
* `COUNT(*)`는 행이 몇 개인지로, `COUNT(column)`은 값이 있는 행이 몇 개인지로 읽으세요.
* 모든 집계 함수가 NULL을 건너뛰므로, 평균은 값이 있는 행에 대한 것이라고 예상하세요.
* 해당하는 행이 없을 때 `SUM`과 `AVG`는 0이 아니라 NULL을 준다고 예상하세요.

## 함께 보기

* [GROUP BY](https://villagesql.com/docs/ko/tutorial/group-by.md) — 전체 1개 대신 범주마다 1개의 결과 행
* [COUNT DISTINCT](https://villagesql.com/docs/ko/tutorial/count-distinct.md) — 행이 아니라 서로 다른 값 세기
* [IS NULL](https://villagesql.com/docs/ko/tutorial/is-null.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.