본문 바로가기

DB/MySQL

[ MySQL ] Select로 만든 결과 값을 하나의 Table로 만들기

반응형

서브쿼리를 통해 만든 결과값을 특정 컬럼 기준으로 하나의 테이블로 합치려면 JOIN, UNION, 또는 CASE 문을 사용할 수 있습니다. 아래에서 각 방법을 설명합니다.


1. JOIN을 사용하여 컬럼 기준으로 결합

JOIN을 사용하면 서브쿼리의 결과를 특정 컬럼을 기준으로 합칠 수 있습니다.

예제

아래는 두 개의 서브쿼리 결과를 id 컬럼 기준으로 합치는 예제입니다.

SELECT 
    a.id, 
    a.name, 
    b.total_sales, 
    c.total_orders
FROM 
    (SELECT id, name FROM employees) AS a
LEFT JOIN 
    (SELECT employee_id AS id, SUM(sales) AS total_sales FROM sales GROUP BY employee_id) AS b
ON a.id = b.id
LEFT JOIN 
    (SELECT employee_id AS id, COUNT(order_id) AS total_orders FROM orders GROUP BY employee_id) AS c
ON a.id = c.id;
  • employees 테이블의 id를 기준으로 salesorders 서브쿼리 결과를 결합.
  • 결과 테이블:
id name total_sales total_orders
1 Alice 5000 10
2 Bob 3000 5

 


 

2. UNION을 사용하여 결과를 합치기

UNION은 두 개 이상의 서브쿼리 결과를 행 단위로 결합합니다. 다만, 컬럼 개수와 순서가 동일해야 합니다.

예제

SELECT id, name, 'sales' AS category, total AS value
FROM (SELECT employee_id AS id, SUM(sales) AS total FROM sales GROUP BY employee_id) AS sales_data
UNION
SELECT id, name, 'orders' AS category, total AS value
FROM (SELECT employee_id AS id, COUNT(order_id) AS total FROM orders GROUP BY employee_id) AS orders_data;
  • 결과:
id name category value
1 Alice sales 5000
1 Alice orders 10
2 Bob sales 3000
2 Bob orders 5

 


 

3. CASE 문을 사용하여 테이블 결합

CASE 문으로 여러 서브쿼리 결과를 단일 테이블에서 표현할 수 있습니다.

예제

SELECT 
    e.id,
    e.name,
    (SELECT SUM(sales) FROM sales WHERE employee_id = e.id) AS total_sales,
    (SELECT COUNT(order_id) FROM orders WHERE employee_id = e.id) AS total_orders
FROM employees AS e;
  • 서브쿼리를 각각의 컬럼으로 활용.
  • 결과 테이블:

 

id name total_sales total_oders
1 Alice 5000 10
2 Bob 3000 5

 


 

4. CTE(Common Table Expression)를 활용한 결합

CTE를 사용하면 서브쿼리를 명시적으로 분리하여 가독성을 높일 수 있습니다.

예제

WITH sales_data AS (
    SELECT employee_id AS id, SUM(sales) AS total_sales 
    FROM sales 
    GROUP BY employee_id
),
orders_data AS (
    SELECT employee_id AS id, COUNT(order_id) AS total_orders 
    FROM orders 
    GROUP BY employee_id
)
SELECT 
    e.id, 
    e.name, 
    COALESCE(s.total_sales, 0) AS total_sales, 
    COALESCE(o.total_orders, 0) AS total_orders
FROM employees AS e
LEFT JOIN sales_data AS s ON e.id = s.id
LEFT JOIN orders_data AS o ON e.id = o.id;
  • WITH 절을 사용하여 서브쿼리를 정의.
  • COALESCE는 NULL 값을 0으로 변환.
  • 결과 테이블:
id name total_sales total_orfers
1 Alice 5000 100
2 Bob 3000 5

 

 


요약

  1. JOIN: 특정 컬럼을 기준으로 서브쿼리 결과를 결합.
  2. UNION: 결과를 행 단위로 합침.
  3. CASE: 서브쿼리의 결과를 각 컬럼으로 처리.
  4. CTE: 복잡한 서브쿼리를 가독성 좋게 작성.

가장 적합한 방법은 데이터 구조와 목적에 따라 선택하세요. JOINCTE는 성능 및 유지보수 측면에서 추천됩니다.

반응형