SQL에서 여러 테이블에 걸쳐 있는 데이터를 SUM 함수로 계산하는 방법

SQL의 SUM 함수를 사용하여 여러 테이블에 걸쳐 있는 데이터를 집계하는 방법에 대해 설명합니다. 데이터베이스를 사용할 때, 여러 테이블에서 관련 데이터를 집계하는 것은 흔한 일입니다. 이 기사에서는 테이블 결합의 기본부터 SUM 함수의 구체적인 사용 방법까지 설명하며, 실제 업무에서 도움이 되는 기술을 소개합니다.

목차

테이블 결합의 기본

여러 테이블에서 데이터를 집계하려면 먼저 테이블 결합이 필요합니다. SQL에서는 INNER JOIN이나 LEFT JOIN과 같은 결합 절을 사용하여 테이블을 결합합니다. 이를 통해 관련된 데이터를 하나의 결과 세트로 가져올 수 있습니다.

INNER JOIN의 사용 예

INNER JOIN은 두 테이블에 존재하는 공통 키를 기반으로 데이터를 결합합니다. 다음은 고객 테이블과 주문 테이블을 결합하는 예입니다.

SELECT customers.customer_id, customers.name, orders.order_id, orders.amount
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id;

LEFT JOIN의 사용 예

LEFT JOIN은 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행을 결합합니다. 일치하지 않는 경우 오른쪽 테이블의 값은 NULL이 됩니다. 다음은 그 예입니다.

SELECT customers.customer_id, customers.name, orders.order_id, orders.amount
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;

SUM 함수의 기본 사용 방법

SUM 함수는 지정한 열의 값의 합계를 계산하는 데 사용됩니다. 특히 숫자 데이터를 집계할 때 유용합니다. 다음은 SUM 함수의 기본 사용 방법을 설명합니다.

단일 테이블에서 SUM 함수의 사용 예

단일 테이블에서 특정 열의 합계를 계산하는 기본적인 SQL 문을 예로 보여드립니다.

SELECT SUM(amount) AS total_amount
FROM orders;

이 쿼리는 orders 테이블의 amount 열의 모든 값의 합계를 계산하고, total_amount라는 별칭으로 결과를 반환합니다.

조건부 SUM 함수의 사용 예

특정 조건을 만족하는 데이터의 합계를 계산하려면 WHERE 절을 사용합니다. 다음은 특정 고객의 주문 금액 합계를 계산하는 예입니다.

SELECT SUM(amount) AS total_amount
FROM orders
WHERE customer_id = 1;

이 쿼리는 customer_id가 1인 모든 주문의 amount 열의 합계를 계산합니다.

여러 테이블을 결합하여 SUM 함수를 사용하는 방법

여러 테이블을 결합하여 SUM 함수로 데이터를 집계하는 방법을 구체적인 예로 설명합니다. 이를 통해 여러 테이블에 걸쳐 있는 데이터를 하나의 결과 세트로 모아 집계할 수 있습니다.

여러 테이블의 결합과 SUM 함수의 사용 예

고객 테이블(customers)과 주문 테이블(orders)을 결합하여 각 고객의 총 주문 금액을 계산하는 예를 보여드립니다.

SELECT customers.customer_id, customers.name, SUM(orders.amount) AS total_amount
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id
GROUP BY customers.customer_id, customers.name;

이 쿼리는 다음 처리를 수행합니다:

  1. customers 테이블과 orders 테이블을 customer_id로 결합합니다.
  2. 각 고객의 orders.amount 합계를 계산합니다.
  3. 고객 ID와 고객 이름별로 결과를 그룹화합니다.

LEFT JOIN과 SUM 함수의 사용 예

LEFT JOIN을 사용하여 고객 테이블에 주문이 없는 경우에도 고객 정보를 표시하고, 그 경우 합계 금액을 0으로 설정하는 예입니다.

SELECT customers.customer_id, customers.name, COALESCE(SUM(orders.amount), 0) AS total_amount
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
GROUP BY customers.customer_id, customers.name;

이 쿼리는 다음 처리를 수행합니다:

  1. customers 테이블의 모든 행과 orders 테이블의 일치하는 행을 결합합니다.
  2. 일치하지 않는 경우, 합계 금액을 0으로 설정하기 위해 COALESCE 함수를 사용합니다.
  3. 고객 ID와 고객 이름별로 결과를 그룹화합니다.

그룹화와 집계의 응용

GROUP BY 절을 사용하여 특정 조건으로 데이터를 그룹화하고, SUM 함수로 집계하는 방법을 설명합니다. 이를 통해 특정 카테고리나 조건별로 데이터를 집계할 수 있습니다.

카테고리별 합계를 계산하는 예

상품 테이블(products)과 주문 상세 테이블(order_details)을 결합하여 카테고리별 총 매출을 계산하는 예를 보여드립니다.

SELECT categories.category_name, SUM(order_details.quantity * order_details.unit_price) AS total_sales
FROM products
INNER JOIN categories ON products.category_id = categories.category_id
INNER JOIN order_details ON products.product_id = order_details.product_id
GROUP BY categories.category_name;

이 쿼리는 다음 처리를 수행합니다:

  1. products 테이블과 categories 테이블을 category_id로 결합합니다.
  2. products 테이블과 order_details 테이블을 product_id로 결합합니다.
  3. 각 카테고리의 총 매출(수량 × 단가)을 계산합니다.
  4. 카테고리 이름별로 결과를 그룹화합니다.

기간별 합계를 계산하는 예

주문 테이블(orders)에서 월별 총 주문 금액을 계산하는 예를 보여드립니다.

SELECT DATE_FORMAT(order_date, '%Y-%m') AS order_month, SUM(amount) AS total_amount
FROM orders
GROUP BY order_month;

이 쿼리는 다음 처리를 수행합니다:

  1. order_date를 년과 월로 포맷합니다.
  2. 각 월의 총 주문 금액을 계산합니다.
  3. 월별로 결과를 그룹화합니다.

조건부 그룹화와 집계

특정 조건을 만족하는 데이터를 그룹화하여 집계할 때는 WHERE 절을 사용합니다. 다음은 특정 지역의 고객의 총 주문 금액을 계산하는 예입니다.

SELECT customers.region, SUM(orders.amount) AS total_amount
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id
WHERE customers.region = 'North'
GROUP BY customers.region;

이 쿼리는 다음 처리를 수행합니다:

  1. customers 테이블과 orders 테이블을 customer_id로 결합합니다.
  2. customers.region이 ‘North’인 고객을 필터링합니다.
  3. 지역별 총 주문 금액을 계산합니다.

성능 최적화

대규모 데이터를 효율적으로 집계하려면 SQL 쿼리의 성능을 최적화하는 것이 중요합니다. 여기에서는 성능 향상을 위한 몇 가지 기술과 인덱스 사용 방법에 대해 설명합니다.

인덱스 사용

인덱스는 테이블 검색 속도를 향상시키기 위해 사용됩니다. 특히 결합 조건이나 집계 대상 열에 인덱스를 설정하면 효과적입니다. 다음은 customer_id에 인덱스를 설정하는 예입니다.

CREATE INDEX idx_customer_id ON orders(customer_id);

이 인덱스를 통해 customer_id를 기반으로 한 결합 작업이 고속화됩니다.

서브쿼리 활용

서브쿼리를 사용하여 중간 결과를 먼저 계산함으로써 전체 쿼리 성능을 향상시킬 수 있습니다. 다음은 서브쿼리를 사용한 예입니다.

SELECT customer_id, SUM(amount) AS total_amount
FROM (
    SELECT customer_id, amount
    FROM orders
    WHERE order_date >= '2023-01-01' AND order_date <= '2023-12-31'
) AS filtered_orders
GROUP BY customer_id;

이 쿼리는 먼저 지정된 기간의 주문을 필터링한 다음 고객별 합계를 계산합니다.

집계 전용 테이블 생성

자주 사용되는 집계 결과를 저장하기 위한 전용 테이블을 생성하고 정기적으로 업데이트함으로써 성능을 향상시킬 수 있습니다. 다음은 집계 전용 테이블을 생성하고 데이터를 삽입하는 예입니다.

CREATE TABLE customer_order_totals (
    customer_id INT,
    total_amount DECIMAL(10, 2)
);

INSERT INTO customer_order_totals (customer_id, total_amount)
SELECT customer_id, SUM(amount)
FROM orders
GROUP BY customer_id;

이 방법으로 자주 수행되는 집계 쿼리가 쉽게 고속화됩니다.

적절한 데이터 유형 사용

데이터 유형의 선택도 성능에 영향을 미칩니다. 필요 이상으로 큰 데이터 유형을 사용하지 않고, 적절한 데이터 유형을 선택함으로써 성능을 개선할 수 있습니다.

요약

이 기사에서는 SQL에서 여러 테이블에 걸쳐 있는 데이터를 SUM 함수로 집계하는 방법을 배웠습니다. 테이블 결합의 기본, SUM 함수의 기본 사용 방법, 여러 테이블을 결합하여 SUM 함수를 사용하는 방법, 그룹화와 집계의 응용, 그리고 성능 최적화에 대해 자세히 설명했습니다. 이 지식을 활용하여 복잡한 데이터베이스 작업을 효율적으로 수행합시다.

목차