SQL 스칼라 서브 쿼리로 데이터 분석 최적화

1. 핵심 원리:

  • SELECT 절의 서브 쿼리 (Scalar Subquery): SQL의 SELECT 절에서 서브 쿼리를 사용하는 것은 각 행에 대해 개별적으로 실행되는 값을 계산하기 위해서입니다. 이 경우, 서브 쿼리는 스칼라 서브 쿼리라고 불리며, 단일 값을 반환합니다.
  • 이 예제에서는 SELECT 절 내에서 최대 월급과 최소 월급을 계산하는 서브 쿼리를 사용합니다. 직업이 ‘SALESMAN’인 사원들에 대해 각각의 이름과 월급을 출력하고, 그들과 같은 직업군 내에서 가장 높은 월급과 가장 낮은 월급을 함께 출력합니다.

2. 실무에서 쓰이는 이유:

  • 실무에서는 여러 그룹에 대한 집계 값을 개별 행과 함께 출력해야 할 때가 많습니다. 이때 스칼라 서브 쿼리를 사용하여 특정 조건에 맞는 데이터를 행별로 계산할 수 있습니다.
  • 스칼라 서브 쿼리는 반복적으로 실행되어 각각의 행에 대해 계산되므로, 데이터베이스의 성능에 영향을 줄 수 있습니다. 따라서 성능 최적화가 필요한 경우 서브 쿼리 캐싱(caching)과 같은 기술을 활용합니다.

3. 실무에서 구체적으로 사용되는 상황 예측:

  • 상황 예시: 회사에서 ‘SALESMAN’ 직무를 가진 모든 사원들의 이름과 현재 월급, 그리고 해당 직무 내에서의 최고 및 최저 월급을 동시에 출력하려는 상황. SELECT ename, sal, (SELECT MAX(sal) FROM emp WHERE job = 'SALESMAN') AS 최대_월급, (SELECT MIN(sal) FROM emp WHERE job = 'SALESMAN') AS 최소_월급 FROM emp WHERE job = 'SALESMAN'; -- 예시 결과: -- ENAME | SAL | 최대_월급 | 최소_월급 -- -------|------|-----------|----------- -- MARTIN | 1250 | 1600 | 1250 -- ALLEN | 1600 | 1600 | 1250 -- TURNER | 1500 | 1600 | 1250 -- WARD | 1250 | 1600 | 1250

4. 자주 사용되는 윈도우 함수 및 설명:

  • 스칼라 서브 쿼리: 스칼라 서브 쿼리는 SELECT 절에서 하나의 값(스칼라 값)을 반환하는 서브 쿼리입니다. 주로 각 행에 대해 독립적인 계산을 수행할 때 사용됩니다.
  • 핵심 원리와 연관성: 스칼라 서브 쿼리는 SELECT 절에서 각 행에 대해 독립적으로 계산을 수행하기 때문에, 특정 그룹의 최대값이나 최소값을 출력할 때 유용합니다. 이 예제에서는 동일한 직무를 가진 사원들 간의 최대 및 최소 월급을 출력하는 데 사용되었습니다.

5. 연습 문제:

  • emp 테이블에서 직무가 ‘SALESMAN’인 사원들의 이름, 월급, 그리고 직무가 ‘SALESMAN’인 모든 사원들의 평균 월급을 함께 출력하는 SQL 쿼리를 작성하세요.

6. 연습 문제 해답 및 테이블 표시 (SQL 코드 형식):

   SELECT ename, sal, 
          (SELECT AVG(sal) FROM emp WHERE job = 'SALESMAN') AS 평균_월급
   FROM emp
   WHERE job = 'SALESMAN';

   -- 예시 결과:
   -- ENAME  | SAL  | 평균_월급
   -- -------|------|----------
   -- MARTIN | 1250 | 1400
   -- ALLEN  | 1600 | 1400
   -- TURNER | 1500 | 1400
   -- WARD   | 1250 | 1400

7. 응용 문제:

  • 직무가 ‘SALESMAN’인 사원들의 월급이 직무가 ‘CLERK’인 사원들의 평균 월급보다 높은 경우, 그 사원들의 이름과 월급을 출력하는 SQL 쿼리를 작성하세요.

8. 응용 문제 해답 및 테이블 표시 (SQL 코드 형식):

   SELECT ename, sal
   FROM emp
   WHERE job = 'SALESMAN'
     AND sal > (SELECT AVG(sal) FROM emp WHERE job = 'CLERK');

   -- 예시 결과:
   -- ENAME  | SAL  
   -- -------|------
   -- ALLEN  | 1600 
   -- TURNER | 1500 

9. 전자상거래 업계에서 쓰일 수 있는 경우 예측:

  • 전자상거래에서는 특정 제품 카테고리 내에서 최고 판매량과 최저 판매량을 가진 제품을 비교하거나, 특정 고객 그룹 내에서 최고 구매 금액과 최저 구매 금액을 가진 고객을 비교하는 데 스칼라 서브 쿼리를 사용할 수 있습니다.

10. 전자상거래 업계에서 사용할 수 있는 경우 예상 상황 문제 2가지 및 그 경우에 대한 SQL 코드 작성:

  • 상황 1: 특정 제품 카테고리에서 가장 많이 판매된 제품과 가장 적게 판매된 제품의 정보를 함께 출력하는 쿼리.
  • SELECT product_name, sales, (SELECT MAX(sales) FROM products WHERE category = 'Electronics') AS 최고_판매량, (SELECT MIN(sales) FROM products WHERE category = 'Electronics') AS 최저_판매량 FROM products WHERE category = 'Electronics'; -- 예시 결과: -- product_name | sales | 최고_판매량 | 최저_판매량 -- --------------|-------|-------------|------------- -- TV | 5000 | 7000 | 1000 -- Radio | 3000 | 7000 | 1000 -- Laptop | 7000 | 7000 | 1000 -- Headphones | 1000 | 7000 | 1000
  • SELECT product_name, sales,
  • (SELECT MAX(sales) FROM products WHERE category = ‘Electronics’) AS 최고판매량, (SELECT MIN(sales) FROM products WHERE category = ‘Electronics’) AS 최저판매량
  • FROM products
  • WHERE category = ‘Electronics’;
  • — 예시 결과:
  • — product_name | sales | 최고판매량 | 최저판매량
  • — ————–|——-|————-|————-
  • — TV | 5000 | 7000 | 1000
  • — Radio | 3000 | 7000 | 1000
  • — Laptop | 7000 | 7000 | 1000
  • — Headphones | 1000 | 7000 | 1000
  • 상황 2: 지난 달 가장 많이 구매한 고객과 가장 적게 구매한 고객의 정보를 출력하는 쿼리. SELECT customer_id, total_purchase, (SELECT MAX(total_purchase) FROM orders WHERE order_date BETWEEN '2024-07-01' AND '2024-07-31') AS 최고_구매액, (SELECT MIN(total_purchase) FROM orders WHERE order_date BETWEEN '2024-07-01' AND '2024-07-31') AS 최저_구매액 FROM orders WHERE order_date BETWEEN '2024-07-01' AND '2024-07-31'; -- 예시 결과: -- customer_id | total_purchase | 최고_구매액 | 최저_구매액 -- ------------|----------------|-------------|------------- -- 12345 | 5000 | 10000 | 500 -- 67890 | 10000 | 10000 | 500 -- 54321 | 500 | 10000 | 500
  • SELECT customer_id, total_purchase,
  • (SELECT MAX(total_purchase) FROM orders WHERE order_date BETWEEN ‘2024-07-01’ AND ‘2024-07-31’) AS 최고구매액, (SELECT MIN(total_purchase) FROM orders WHERE order_date BETWEEN ‘2024-07-01’ AND ‘2024-07-31’) AS 최저구매액
  • FROM orders
  • WHERE order_date BETWEEN ‘2024-07-01’ AND ‘2024-07-31’;
  • — 예시 결과:
  • — customer_id | total_purchase | 최고구매액 | 최저구매액
  • — ————|—————-|————-|————-
  • — 12345 | 5000 | 10000 | 500
  • — 67890 | 10000 | 10000 | 500
  • — 54321 | 500 | 10000 | 500

요약:

  • 이번 예제에서는 SELECT 절에서 사용되는 스칼라 서브 쿼리를 활용하여, 특정 조건에 따른 최대 및 최소 값을 계산하고 이를 행 단위로 출력하는 방법을 다룹니다. 스칼라 서브 쿼리는 각 행에 대해 독립적으로 실행되기 때문에, 데이터베이스의 성능 최적화를 위해 서브 쿼리 캐싱(caching) 기법이 중요합니다.

Posts created 411

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top