[DB]SQL실무

[SQL]WITH 절

greeniti 2025. 3. 18. 20:49

WITH 절을 활용하여 여러 개의 테이블을 조인하는 예제를 살펴보겠습니다.


예제 시나리오

회사에서 직원 정보(employees), 부서 정보(departments), 급여 내역(salaries)을 관리하는 테이블이 있다고 가정합니다.
각 테이블을 조인하여 직원 이름, 부서 이름, 급여를 출력하는 SQL 쿼리를 작성해보겠습니다.


1. 테이블 및 데이터 생성

-- 직원 테이블
CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    department_id INT
);

INSERT INTO employees (id, name, department_id) VALUES
(1, 'Alice', 1),
(2, 'Bob', 2),
(3, 'Charlie', 1),
(4, 'David', 3),
(5, 'Eve', 2);

-- 부서 테이블
CREATE TABLE departments (
    id INT PRIMARY KEY,
    department_name VARCHAR(50)
);

INSERT INTO departments (id, department_name) VALUES
(1, 'HR'),
(2, 'IT'),
(3, 'Sales');

-- 급여 테이블
CREATE TABLE salaries (
    employee_id INT PRIMARY KEY,
    salary INT
);

INSERT INTO salaries (employee_id, salary) VALUES
(1, 5000),
(2, 7000),
(3, 6000),
(4, 4000),
(5, 5500);

2. WITH 절을 활용한 다중 테이블 조인

WITH emp_dept AS (
    -- 직원과 부서 정보를 먼저 조인
    SELECT e.id AS emp_id, e.name, d.department_name
    FROM employees e
    JOIN departments d ON e.department_id = d.id
), salary_info AS (
    -- 직원과 급여 정보를 조인
    SELECT s.employee_id, s.salary
    FROM salaries s
)
-- 최종적으로 직원, 부서, 급여 데이터를 합침
SELECT ed.name, ed.department_name, si.salary
FROM emp_dept ed
JOIN salary_info si ON ed.emp_id = si.employee_id;

출력 결과

name department_name salary

Alice HR 5000
Bob IT 7000
Charlie HR 6000
David Sales 4000
Eve IT 5500

설명

  1. WITH emp_dept AS (...)
    • employees와 departments 테이블을 조인하여 직원의 부서 정보를 가져옵니다.
  2. WITH salary_info AS (...)
    • salaries 테이블에서 급여 정보를 가져옵니다.
  3. 메인 쿼리에서 emp_dept와 salary_info를 조인하여 최종 결과를 출력합니다.

이렇게 WITH 절을 사용하면 복잡한 쿼리를 모듈화하여 가독성을 높이고 유지보수성을 향상할 수 있습니다!