본문 바로가기
n8n 이야기

SQL 심화 이해하기 : 서브쿼리, CASE WHEN, JOIN, WITH

by 주아라기 2024. 12. 18.
반응형

 

목차

     

     

    기본적인 SQL 구문에 익숙해졌다면, 이제 더욱 강력하고 효율적인 쿼리를 작성할 시간입니다!

    이 글에서는 데이터를 자유자재로 다룰 수 있도록 도와주는 서브쿼리, CASE WHEN, JOIN, WITH 구문에 대해 알아보겠습니다.

     

    SQL 기본 이해를 위해 이전 내용을확인하면 도움이 됩니다. 👇

     

    서브쿼리 사용하기

    서브쿼리는 쿼리 안에 또 다른 쿼리를 포함하여 데이터를 처리할 수 있는 방법입니다. 서브쿼리는 주로 WHERE, FROM, SELECT 구문과 함께 사용됩니다.

     

    주의사항 : 서브쿼리를 과도하게 사용하면 쿼리 성능이 저하될 수 있습니다. JOIN을 활용하거나 인덱스를 생성하여 성능을 최적화할 수 있습니다.

     

    단일행 서브쿼리

    /* 
     급여가 5000 이상인 직원의 이름과 부서 정보를 조회합니다. (단일행 서브쿼리)
    */
    
    SELECT
     employee_name, -- 직원 이름
     department_id -- 부서 ID
    FROM
     employees
    WHERE
     salary > ( SELECT 
                 AVG(salary)
                FROM
                 employees
               )

     

    다중행 서브쿼리

    /*
     '개발팀'에 속한 직원의 이름과 급여를 조회합니다. (다중행 서브쿼리)
    */
    
    SELECT
     employee_name,
     salary
    FROM
     employees
    WHERE
     department_id IN ( SELECT
                         department_id
                        FROM
                         departments
                        WHERE
                         department_name = '개발팀'
                       )

     

    상관 서브쿼리

    /*
     각 직원의 급여와 해당 부서의 평균 급여를 비교합니다. (상관 서브쿼리)
    */
    
    SELECT
     employee_name,
     salary,
     ( SELECT
        AVG(salary)
       FROM
        employees
       WHERE
        department_id = e.department_id
      ) AS avg_salary
    FROM
     employees e;

     

    CASE WHEN 사용하기

     

    마치 엑셀의 IF 함수처럼, CASE WHEN 구문을 사용하면 조건에 따라 다른 결과를 출력할 수 있습니다.

    데이터를 특정 기준에 따라 분류하거나, 조건에 맞는 값을 계산할 때 유용합니다.

    /* 
     급여 상태를 '우수', '보통', '개선 필요'로 분류하여 조회합니다.
    */
    
    SELECT
     employee_name, -- 직원 이름
     salary, -- 급여 
     CASE WHEN
      salary > 5000 THEN '우수' WHEN 
      salary BETWEEN 3000 AND 5000 THEN '보통'
     ELSE '개선 필요' END AS salary_status -- 급여 상태를 분류합니다.
    FROM
     employees
     

     

    JOIN 사용하기

    JOIN은 여러 테이블에 흩어져 있는 정보를 하나로 합쳐줍니다.

    테이블 간의 관계를 정의하고, 공통된 컬럼을 기준으로 데이터를 연결하여 원하는 정보를 효율적으로 조회할 수 있습니다.

    JOIN 종류

    • INNER JOIN : 두 테이블에서 공통된 값을 가진 행만 반환합니다.
    • LEFT JOIN : 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행을 반환합니다. 일치하는 행이 없으면 NULL 값을 반환합니다.
    • RIGHT JOIN : 오른쪽 테이블의 모든 행과 왼쪽 테이블의 일치하는 행을 반환합니다. 일치하는 행이 없으면 NULL 값을 반환합니다.
    • FULL OUTER JOIN : 두 테이블의 모든 행을 반환합니다. 일치하는 행이 없으면 NULL 값을 반환합니다.

    JOIN 종류

     

    /*
     직원과 부서 정보를 결합하여 조회합니다.
    */
    SELECT
     employees.employee_name, -- 직원 이름
     departments.department_name -- 부서 이름
    FROM
     employees INNER JOIN departments ON employees.department_id = departments.department_id
     

     

    WITH 구문 사용하기

     

    WITH 구문은 복잡한 쿼리를 단순화하고 가독성을 높여줍니다.

    마치 긴 글을 여러 단락으로 나누어 쓰는 것처럼, 쿼리를 여러 개의 CTE(Common Table Expression)로 나누어 작성할 수 있습니다.

    장점

    • 가독성 향상 : 쿼리가 간결하고 명확해집니다.
    • 재사용성 증가 : CTE를 여러 번 재사용할 수 있습니다.
    • 성능 향상 : 쿼리 최적화에 도움이 될 수 있습니다.
    /*
     상위 3명의 급여가 높은 직원을 WITH 구문을 사용하여 조회합니다.
    */
    
    WITH TopSalaries AS ( SELECT
                           employee_name, -- 직원 이름
                           salary -- 급여 
                          FROM
                           employees
                          ORDER BY
                           salary DESC -- 급여 내림차순 정렬
                          LIMIT 3
                        )
    
    SELECT
     * 
    FROM
     TopSalaries
     

     

    실용적인 예시

    다음은 서브쿼리, CASE WHEN, JOIN, WITH 구문을 종합적으로 사용하는 예시입니다.

    예를 들어, 매출이 가장 높은 상위 5개 제품을 매출 합계와 함께 조회하는 복잡한 쿼리를 작성할 수 있습니다.

     

     

    /*
     각 제품의 총 매출을 계산하고, 매출이 가장 높은 5개 제품을 조회합니다.
    */
    WITH ProductSales AS ( SELECT
                            product_id, -- 제품 ID
                            SUM(sale_amount) AS total_sales -- 총 매출
                           FROM
                            sales
                           GROUP BY
                            product_id -- 제품별 매출 합계
                         )
     
    SELECT
     ps.product_id, -- 제품 ID
     ps.total_sales, -- 매출 합계
     CASE WHEN
      ps.total_sales > 10000 THEN '우수' WHEN
      ps.total_sales BETWEEN 5000 AND 10000 THEN '보통'
     ELSE 
      '개선 필요' END AS performance_status -- 매출 성과 상태
    FROM
     ProductSales ps
    ORDER BY
     ps.total_sales DESC
    LIMIT 5; -- 매출 상위 5개 제품

     

    👇 자세한 SQL 튜토리얼을 지금 바로 확인하세요 😉

     

    반응형