[MySQL] Lateral Derived Table

기훈·2024년 7월 9일

MySQL

목록 보기
15/23

각 행에 대해 서브쿼리를 실행시킬 수 있는 기능이다. 고객(Customer)와 주문(Order) 테이블로 예시를 들어보자.

  • Customer

  • Order

각 고객의 총 주문 금액을 구하고, 각 고객의 이름과 함께 결과를 출력한다.

  • 서브쿼리를 사용하지 않고 수행

    SELECT c.customer_name, SUM(o.order_amount) AS total_amount
    FROM Customer c
    JOIN Order o ON c.customer_id = o.customer_id
    GROUP BY c.customer_name;
  • Lateral Derived Table을 사용하여 수행

    SELECT c.customer_name, total_amount
    FROM Customer c,
    LATERAL (
        SELECT SUM(o.order_amount) AS total_amount
        FROM Order o
        WHERE o.customer_id = c.customer_id
    ) AS total_order;
    
    1. 메인 쿼리: SELECT c.customer_name, total_amount FROM Customer c
      • 고객 테이블에서 각 고객의 이름을 선택한다.
    2. LATERAL 서브쿼리: LATERAL (SELECT SUM(o.order_amount) AS total_amount FROM Order o WHERE o.customer_id = c.customer_id)
      • 각 고객 행에 대해 Order 테이블에서 해당 고객의 총 주문 금액을 계산한다.
    3. 결과 결합: AS total_order
      • 서브쿼리의 결과를 total_order라는 별칭으로 지정하여 메인 쿼리에 결합한다.

조인 및 그룹화

  • 단순성과 성능

    • 일반적인 경우, 조인과 그룹화는 비교적 간단하고 효율적이다.
      대규모 데이터셋에 대해서도 성능이 좋다.
      쿼리 최적화가 잘 되어 있어 일반적으로 빠르다.
  • 명확한 집계 연산:

    • 전체 테이블을 한 번에 집계할 때 유용하다.
      SQL 문법이 간단하고 직관적이다.

Lateral Derived Table (LDT)

  • 행별 동적 서브쿼리
    • 각 행에 대해 동적으로 서브쿼리를 실행할 수 있다.
      특정 행에 기반한 복잡한 계산이 필요할 때 유용하다.
      ex) 각 고객의 주문 내역 중 특정 조건에 맞는 값을 계산하는 경우.
  • 복잡한 계산과 조건:
    • 단순한 그룹화로 해결되지 않는 복잡한 로직을 처리할 수 있다.
      각 행에 대해 개별적으로 계산을 수행할 수 있어 유연성이 높다.
  • 특정 조건에 대한 필터링:
    • LDT는 각 행마다 조건을 적용하여 필터링할 수 있다.

비교 예시
1. 단순 조인과 그룹화:
각 고객의 총 주문 금액을 구하는 경우, 단순 조인과 그룹화가 더 효율적이다.

SELECT c.customer_name, SUM(o.order_amount) AS total_amount
FROM Customer c
JOIN Order o ON c.customer_id = o.customer_id
GROUP BY c.customer_name;

2.Lateral Derived Table을 사용한 복잡한 예시:
각 고객의 최대 주문 금액이 특정 값을 초과하는지 확인하고, 그 결과를 반환하는 경우.

SELECT c.customer_name, max_order
FROM Customer c,
LATERAL (
    SELECT MAX(o.order_amount) AS max_order
    FROM Order o
    WHERE o.customer_id = c.customer_id
) AS order_info
WHERE max_order >= 100;

요약
조인과 그룹화: 단순 집계나 성능이 중요한 경우에 적합하다.
Lateral Derived Table: 각 행에 대해 동적으로 복잡한 계산이나 조건이 필요한 경우에 유용하다.

0개의 댓글