메인 콘텐츠로 건너뛰기

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
지금까지의 모든 쿼리는 행을 반환했습니다. 집계 함수는 여러 행을 읽고 1개의 값을 반환합니다: 몇 개인지, 합계, 평균, 최댓값. 질문이 행 하나가 아니라 집합에 관한 것일 때 가장 먼저 손을 뻗는 도구입니다. 시작하기 전에 mysql -u root -p sakila로 클라이언트를 여세요.

집계 함수의 동작 방식

AGGREGATE_FUNCTION을 아래 함수 중 하나로, COLUMN_NAME을 읽을 열로, TABLE_NAME을 테이블로 바꾸세요. GROUP BY가 없으면 테이블 전체가 1개의 그룹이므로, 결과는 항상 정확히 1개의 행입니다. 대신 범주마다 1개의 행을 얻는 방법은 GROUP BY입니다.

예제

  1. 행 세기

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

  1. 여러 집계를 한 번에

각 함수가 같은 1,000개의 행을 읽습니다. 기본 제목은 표현식 전체이므로, 별칭으로 이름을 붙이세요.

  1. 금액 열 합산

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

COUNT(*)는 행을 셉니다. COUNT(column)은 그 열에 값이 있는 행을 세므로, NULL을 건너뜁니다.
603개의 주소가 있고, 그중 4개는 두 번째 줄이 아예 없습니다. 나머지 599개는 빈 문자열을 담고 있는데, COUNT는 그것을 다른 값과 똑같은 값으로 취급합니다: COUNT가 찾는 것은 NULL이지 빈칸이 아닙니다. IS NULL 레슨이 그 차이를 다룹니다.

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

이 규칙은 COUNT에만 특별한 것이 아닙니다. 어떤 집계 함수도 NULL을 보지 않으므로, 아무것도 들어 있지 않은 열은 평균 낼 것도 만들어내지 않습니다. id의 평균을 내는 것은 의미 없는 산술이고, 이 쿼리가 그렇게 하는 이유는 original_language_id가 Sakila에서 모든 행이 NULL인 유일한 열이기 때문입니다.
AVG는 0이 아니라 NULL을 반환했는데, 나눌 것이 없었기 때문입니다. 이것이 가장 중요한 경우는 가끔만 채워지는 열에 대한 AVG입니다: 평균은 전체 행이 아니라 값이 있는 행에 대한 것이고, 그 2개의 숫자는 같지 않습니다. 아무것도 없을 때 SUM도 NULL이지만, 아무것도 없을 때 COUNT는 0입니다.

요약

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

함께 보기