확인한 환경과 범위

Windows · SQLite 3.45.3. 본문의 첫 예제를 실행하여 표준 출력과 예상 결과가 일치함을 확인했습니다. 연습문제의 모든 입력을 검증한 것은 아닙니다.

이 글의 순서 4개 단락

상품 가격을 한 행씩 살펴보지 않고도 조건에 맞는 상품이 몇 개인지, 평균 가격과 최저 가격은 얼마인지 확인할 수 있습니다. SQLite의 집계 함수는 여러 행의 값을 모아 하나의 결과로 계산합니다.

여러 행을 하나로 요약하기

이 글의 실행 환경은 SQLite입니다. 집계 함수에는 다음과 같은 함수가 있습니다.

  • COUNT(*): 행의 개수
  • SUM(price): 가격의 합계
  • AVG(price): 가격의 평균
  • MIN(price): 가장 낮은 가격
  • MAX(price): 가장 높은 가격

WHERE를 함께 쓰면 조건에 맞는 행만 집계할 수 있습니다. 예를 들어 가격이 2,000 이상인 상품만 골라 그 범위의 평균을 구합니다.

조건에 맞는 상품 집계하기

다음 예제의 입력은 가격이 각각 1,000, 2,000, 3,000인 상품과 가격이 NULL인 상품입니다. WITH ... AS는 이 한 번의 조회에서 사용할 임시 데이터에 products라는 이름을 붙입니다. VALUES 안의 각 괄호가 한 행이며, 열 이름은 차례로 name과 price입니다. 별도의 테이블을 만들 필요는 없습니다.

WITH products(name, price) AS (
  VALUES
    ('연필', 1000),
    ('공책', 2000),
    ('파일', 3000),
    ('지우개', NULL)
)
SELECT
  COUNT(*) AS product_count,
  SUM(price) AS total_price,
  AVG(price) AS average_price,
  MIN(price) AS lowest_price,
  MAX(price) AS highest_price
FROM products
WHERE price >= 2000;

집계 함수로 전체 데이터 요약하기 — 첫 예제의 실제 실행 결과

예상 결과는 다음 한 행입니다. 열 구분 방식은 사용하는 SQLite 실행 환경에 따라 다를 수 있습니다.

product_count | total_price | average_price | lowest_price | highest_price
2             | 5000        | 2500.0        | 2000         | 3000

WHERE price >= 2000에 맞는 행은 공책과 파일입니다. 두 가격의 합은 5,000이고, 이를 두 값으로 나눈 평균은 2,500입니다. SQLite의 AVG는 값이 하나 이상 있으면 실수로 결과를 반환하므로 여기서는 2500.0으로 표시합니다. AS 뒤의 이름은 결과 열을 읽기 쉽게 붙인 별칭입니다.

NULL과 빈 결과에서 주의할 점

COUNT(*)는 선택된 행을 모두 세지만 COUNT(price)는 선택된 행 중 가격이 NULL이 아닌 행만 셉니다. 예제에서 WHERE를 없애면 전체 행 수는 4이고 가격이 있는 행 수는 3입니다. SUM, AVG, MIN, MAX도 NULL 가격을 집계에서 제외합니다. 따라서 평균을 구할 때 없는 가격을 0으로 계산하지 않습니다.

또한 price >= 2000은 NULL 가격을 선택하지 않습니다. 가격이 없는 행을 찾으려면 앞에서 배운 price IS NULL을 사용합니다.

조건을 price >= 10000으로 바꾸면 선택된 행이 없습니다. 이때도 집계 결과는 한 행이며 COUNT(*)는 0, 나머지 네 함수는 NULL입니다. SUM의 결과도 자동으로 0이 되지는 않으므로 결과를 사용할 때 구분해야 합니다.

연습과 풀이

위 예제의 조건을 price >= 1000으로 바꾸면 각 결과는 무엇일까요? 먼저 해당하는 가격을 고른 다음 합계와 평균을 계산해 보세요.

해당 가격은 1,000, 2,000, 3,000입니다. 따라서 product_count는 3, total_price는 6,000, average_price는 2,000.0, lowest_price는 1,000, highest_price는 3,000입니다. 가격이 NULL인 행은 이 조건에도 포함되지 않습니다.

집계 함수의 동작과 SELECT의 조건 처리에 관한 자세한 내용은 SQLite 집계 함수 공식 문서와 SQLite SELECT 공식 문서를 참고하세요.

CHECK THE SOURCE

참고한 공식 문서

기능 설명은 위 문서를 참고했으며, 예제의 입력·결과와 한계는 본문에 따로 기록했습니다.

한 줄씩 이해하고, 차곡차곡 기록합니다.이 글의 오류 제보하기 ↗