SQL에서 여러 테이블을 JOIN하여 데이터를 COUNT하는 방법

SQL에서 여러 테이블에 걸쳐 데이터를 집계할 때, JOIN을 이용하여 테이블을 결합하고 COUNT 함수를 사용하여 데이터를 효율적으로 계산하는 것이 중요합니다. 이 기사에서는 SQL에서 여러 테이블을 JOIN하여 데이터를 COUNT하는 방법을 구체적인 쿼리 예를 들어 쉽게 설명합니다.

목차

JOIN의 기본 개념

SQL에서 JOIN은 여러 테이블을 연결하여 데이터를 얻는 작업입니다. JOIN에는 여러 종류가 있으며, 각기 다른 사용 방법과 목적이 있습니다.

INNER JOIN

INNER JOIN은 두 테이블 모두에 존재하는 일치하는 레코드만 가져옵니다. 공통 키를 사용하여 테이블을 결합하며, 완전히 일치한 행만 결과에 포함됩니다.

LEFT JOIN

LEFT JOIN은 왼쪽 테이블의 모든 레코드와 오른쪽 테이블에서 일치하는 레코드를 가져옵니다. 왼쪽 테이블에는 존재하지만 오른쪽 테이블에는 존재하지 않는 경우 NULL이 반환됩니다.

RIGHT JOIN

RIGHT JOIN은 오른쪽 테이블의 모든 레코드와 왼쪽 테이블에서 일치하는 레코드를 가져옵니다. 오른쪽 테이블에는 존재하지만 왼쪽 테이블에는 존재하지 않는 경우 NULL이 반환됩니다.

FULL OUTER JOIN

FULL OUTER JOIN은 두 테이블의 모든 레코드를 가져오며, 일치하지 않는 부분에는 NULL을 반환합니다. 모든 데이터를 망라한 결과를 얻을 수 있습니다.

이러한 JOIN을 이해함으로써, 필요에 따라 적절한 JOIN을 선택하고 여러 테이블에서 데이터를 효과적으로 가져올 수 있습니다.

COUNT 함수의 기본

COUNT 함수는 SQL에서 특정 조건에 일치하는 행의 수를 반환하는 데 사용됩니다. 데이터베이스 집계에서 자주 사용되는 기본 함수입니다.

COUNT(*)

COUNT(*)는 지정된 테이블의 모든 행을 셉니다. NULL을 포함한 모든 행이 계산됩니다.

SELECT COUNT(*)
FROM 테이블명;

COUNT(column_name)

COUNT(column_name)은 지정된 열의 값이 NULL이 아닌 행만 셉니다. 특정 열에 제한하여 계산할 때 사용합니다.

SELECT COUNT(열명)
FROM 테이블명;

COUNT(DISTINCT column_name)

COUNT(DISTINCT column_name)은 지정된 열의 서로 다른 값을 셉니다. 중복을 제외하고 고유한 값의 수를 얻을 때 유용합니다.

SELECT COUNT(DISTINCT 열명)
FROM 테이블명;

이러한 COUNT 함수를 적절히 구분하여 사용함으로써 데이터의 정확한 집계가 가능해집니다. 다음 섹션에서는 JOIN과 COUNT를 결합하는 방법을 구체적인 SQL 쿼리 예와 함께 설명합니다.

JOIN과 COUNT를 결합하는 방법

JOIN과 COUNT를 결합하여 여러 테이블에서 관련 데이터를 집계할 수 있습니다. 여기서는 구체적인 SQL 쿼리 예를 들어 설명합니다.

기본적인 쿼리의 구조

먼저, JOIN을 사용하여 여러 테이블을 결합한 후 COUNT 함수를 사용하여 집계합니다. 아래는 기본적인 구조입니다.

SELECT COUNT(*)
FROM 테이블1
JOIN 테이블2 ON 테이블1.공통열 = 테이블2.공통열
WHERE 조건;

예1: INNER JOIN을 사용한 집계

다음 예에서는 orders 테이블과 customers 테이블을 INNER JOIN으로 결합하여 특정 고객의 주문 수를 계산합니다.

SELECT COUNT(*)
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id
WHERE customers.customer_name = '타나카';

이 쿼리는 고객 이름이 ‘타나카’인 고객의 주문 수를 계산합니다.

예2: LEFT JOIN을 사용한 집계

다음으로, employees 테이블과 departments 테이블을 LEFT JOIN으로 결합하여 각 부서에 속한 직원 수를 계산합니다.

SELECT departments.department_name, COUNT(employees.employee_id)
FROM departments
LEFT JOIN employees ON departments.department_id = employees.department_id
GROUP BY departments.department_name;

이 쿼리는 각 부서의 직원 수를 계산하고 부서별로 결과를 그룹화하여 표시합니다.

JOIN과 COUNT를 결합함으로써 복잡한 데이터의 집계를 효율적으로 수행할 수 있습니다. 다음 섹션에서는 INNER JOIN을 사용한 집계 방법에 대해 더 자세히 설명합니다.

INNER JOIN을 사용한 집계 방법

INNER JOIN을 사용하여 여러 테이블 간 일치하는 데이터를 집계할 수 있습니다. 여기에서는 INNER JOIN을 사용한 구체적인 집계 방법을 설명합니다.

INNER JOIN의 기본 구문

INNER JOIN은 결합 조건에 일치하는 레코드를 두 테이블에서 가져옵니다. 아래는 기본적인 구문입니다.

SELECT 열명1, 열명2, ...
FROM 테이블1
INNER JOIN 테이블2 ON 테이블1.공통열 = 테이블2.공통열
WHERE 조건;

실제 예시: 상품과 주문의 집계

다음으로, products 테이블과 orders 테이블을 INNER JOIN으로 결합하여 특정 상품의 주문 수를 계산합니다.

SELECT products.product_name, COUNT(orders.order_id) AS order_count
FROM products
INNER JOIN orders ON products.product_id = orders.product_id
GROUP BY products.product_name;

이 쿼리는 각 상품의 주문 수를 계산하고 상품별로 결과를 그룹화하여 표시합니다.

실제 예시: 학생과 코스의 성적 집계

다음으로, students 테이블과 enrollments 테이블을 INNER JOIN으로 결합하여 각 코스의 등록 학생 수를 계산합니다.

SELECT courses.course_name, COUNT(enrollments.student_id) AS student_count
FROM courses
INNER JOIN enrollments ON courses.course_id = enrollments.course_id
GROUP BY courses.course_name;

이 쿼리는 각 코스에 등록된 학생 수를 계산하고 코스별로 결과를 그룹화하여 표시합니다.

INNER JOIN을 사용하여 관련 데이터를 효율적으로 결합하고 필요한 집계를 수행할 수 있습니다. 다음 섹션에서는 LEFT JOIN을 사용한 집계 방법에 대해 설명합니다.

LEFT JOIN을 사용한 집계 방법

LEFT JOIN을 사용하면, 왼쪽 테이블의 모든 행과 오른쪽 테이블에서 일치하는 행을 결합하고, 일치하지 않는 경우에는 NULL을 반환합니다. 이를 통해, 왼쪽 테이블의 데이터를 완전히 보존하면서 관련 데이터를 집계할 수 있습니다.

LEFT JOIN의 기본 구문

LEFT JOIN의 기본 구문은 다음과 같습니다.

SELECT 열명1, 열명2, ...
FROM 테이블1
LEFT JOIN 테이블2 ON 테이블1.공통열 = 테이블2.공통열
WHERE 조건;

실제 예시: 부서와 직원의 집계

다음 예에서는, departments 테이블과 employees 테이블을 LEFT JOIN으로 결합하여 각 부서의 직원 수를 계산합니다.

SELECT departments.department_name, COUNT(employees.employee_id) AS employee_count
FROM departments
LEFT JOIN employees ON departments.department_id = employees.department_id
GROUP BY departments.department_name;

이 쿼리는 각 부서의 전체 직원 수를 계산하며, 직원이 없는 부서도 결과에 포함합니다.

실제 예시: 고객과 주문의 집계

다음으로, customers 테이블과 orders 테이블을 LEFT JOIN으로 결합하여 각 고객의 주문 수를 계산합니다.

SELECT customers.customer_name, COUNT(orders.order_id) AS order_count
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
GROUP BY customers.customer_name;

이 쿼리는 각 고객의 주문 수를 계산하며, 주문이 없는 고객도 결과에 포함합니다.

LEFT JOIN을 사용함으로써, 일치하지 않는 데이터를 포함한 완전한 집계를 수행할 수 있습니다. 다음 섹션에서는 실제 데이터베이스를 사용하여 JOIN과 COUNT를 결합한 실습 예를 소개합니다.

실습 예

실제 데이터베이스를 사용하여 JOIN과 COUNT를 결합한 집계 쿼리를 작성합니다. 여기서는 온라인 스토어의 데이터베이스를 예로 들어 설명합니다.

실제 예시: 상품별 주문 수 집계

먼저, products 테이블과 orders 테이블을 사용하여 각 상품의 주문 수를 집계합니다.

SELECT products.product_name, COUNT(orders.order_id) AS order_count
FROM products
INNER JOIN orders ON products.product_id = orders.product_id
GROUP BY products.product_name;

이 쿼리는 각 상품의 주문 수를 집계하고 상품별로 결과를 표시합니다. 결과는 아래와 같습니다.

+----------------+-------------+
| product_name   | order_count |
+----------------+-------------+
| 상품A          | 10          |
| 상품B          | 5           |
| 상품C          | 8           |
+----------------+-------------+

실제 예시: 고객별 총 구매 금액 집계

다음으로, customers 테이블과 orders 테이블을 사용하여 각 고객의 총 구매 금액을 집계합니다.

SELECT customers.customer_name, SUM(orders.total_amount) AS total_spent
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
GROUP BY customers.customer_name;

이 쿼리는 각 고객의 총 구매 금액을 집계하고 고객별로 결과를 표시합니다. 결과는 아래와 같습니다.

+----------------+-------------+
| customer_name  | total_spent |
+----------------+-------------+
| 고객A          | 20000       |
| 고객B          | 15000       |
| 고객C          | 30000       |
+----------------+-------------+

실제 예시: 카테고리별 재고 상품 수 집계

마지막으로, categories 테이블과 products 테이블을 사용하여 각 카테고리의 재고 상품 수를 집계합니다.

SELECT categories.category_name, COUNT(products.product_id) AS product_count
FROM categories
LEFT JOIN products ON categories.category_id = products.category_id
GROUP BY categories.category_name;

이 쿼리는 각 카테고리의 재고 상품 수를 집계하고 카테고리별로 결과를 표시합니다. 결과는 아래와 같습니다.

+----------------+--------------+
| category_name  | product_count|
+----------------+--------------+
| 카테고리A      | 12           |
| 카테고리B      | 8            |
| 카테고리C      | 5            |
+----------------+--------------+

이러한 실습 예를 참고로 하여, 다양한 시나리오에서 JOIN과 COUNT를 결합한 데이터 집계가 가능합니다. 다음 섹션에서는 집계 쿼리를 최적화하기 위한 힌트를 소개합니다.

최적화의 힌트

JOIN과 COUNT를 사용한 집계 쿼리는 적절히 최적화함으로써 성능을 향상시킬 수 있습니다. 다음은 집계 쿼리를 최적화하기 위한 힌트와 베스트 프랙티스를 소개합니다.

인덱스의 활용

인덱스를 적절히 설정함으로써 쿼리 실행 속도를 대폭 향상시킬 수 있습니다. 특히 JOIN에 사용하는 열이나 집계 대상 열에 인덱스를 생성하는 것이 중요합니다.

CREATE INDEX idx_customer_id ON orders(customer_id);
CREATE INDEX idx_product_id ON orders(product_id);

필요한 열만 선택

SELECT문에서는 필요한 열만을 지정하여 데이터를 가져옵니다. 불필요한 열을 제외함으로써 데이터 전송량을 줄이고, 쿼리의 성능을 향상시킵니다.

SELECT products.product_name, COUNT(orders.order_id) AS order_count
FROM products
INNER JOIN orders ON products.product_id = orders.product_id
GROUP BY products.product_name;

적절한 JOIN의 종류 선택

사용하는 JOIN의 종류를 적절히 선택하는 것도 중요합니다. INNER JOIN이나 LEFT JOIN의 사용을 검토하고, 데이터 양이나 집계 대상에 따라 최적의 JOIN을 선택합니다.

WHERE절의 사용

WHERE절을 사용하여 불필요한 데이터를 필터링함으로써 쿼리 실행 속도를 향상시킵니다. 조건을 추가함으로써 필요한 데이터만 효율적으로 가져올 수 있습니다.

SELECT customers.customer_name, SUM(orders.total_amount) AS total_spent
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
WHERE orders.order_date >= '2023-01-01'
GROUP BY customers.customer_name;

집계 함수 사용에 주의

COUNT, SUM, AVG 등의 집계 함수는 사용하는 데이터 양이 많을 경우, 성능에 영향을 미칠 수 있습니다. 필요한 경우에만 사용하고, 데이터 양을 제한하는 노력을 기울입니다.

서브쿼리의 활용

서브쿼리를 사용하여 집계 결과를 임시로 저장하고, 메인 쿼리에서 활용함으로써 쿼리의 성능을 향상시킬 수 있습니다.

SELECT customer_name, order_count
FROM (
    SELECT customers.customer_name, COUNT(orders.order_id) AS order_count
    FROM customers
    LEFT JOIN orders ON customers.customer_id = orders.customer_id
    GROUP BY customers.customer_name
) AS subquery
WHERE order_count > 0;

이러한 최적화 힌트를 활용함으로써, JOIN과 COUNT를 결합한 집계 쿼리의 성능을 향상시킬 수 있습니다. 다음 섹션에서는 이 기사의 내용을 요약합니다.

요약

SQL에서 여러 테이블을 JOIN하여 데이터를 COUNT하는 방법에 대해, 기본부터 구체적인 실습 예까지 폭넓게 설명했습니다. 아래에 이 기사의 요점을 정리합니다.

  • JOIN의 기본 개념: INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN 등의 종류와 그 사용 방법을 이해하는 것이 중요합니다.
  • COUNT 함수의 기본: COUNT(*), COUNT(column_name), COUNT(DISTINCT column_name)의 차이와 사용 방법을 파악합시다.
  • JOIN과 COUNT의 결합: 실제 SQL 쿼리 예를 통해, JOIN과 COUNT를 결합한 데이터 집계 방법을 배웠습니다.
  • INNER JOIN을 사용한 집계 방법: 상품이나 학생 데이터를 바탕으로 한 구체적인 INNER JOIN의 집계 쿼리를 소개했습니다.
  • LEFT JOIN을 사용한 집계 방법: 부서나 고객 데이터를 바탕으로 한 구체적인 LEFT JOIN의 집계 쿼리를 설명했습니다.
  • 실습 예: 온라인 스토어 데이터베이스를 사용하여, 상품별 주문 수나 고객별 총 구매 금액 등의 실습적인 쿼리를 제시했습니다.
  • 최적화의 힌트: 인덱스 활용, 필요한 열만 선택, 적절한 JOIN 종류 선택, WHERE절 사용 등 쿼리 성능을 향상시키는 방법을 소개했습니다.

이러한 포인트를 이해하고 실천함으로써, 복잡한 데이터베이스의 집계 쿼리를 효율적으로 작성할 수 있게 됩니다. SQL의 JOIN과 COUNT를 활용하여 효과적인 데이터 집계를 실현합시다.

목차