인라인 뷰와 WITH 구문

안석우(문과대학 철학)·2025년 2월 20일

SQL

목록 보기
3/3

📌 Oracle 인라인 뷰(Inline View)와 WITH 구문(CTE) 정리 🚀

SQL에서 서브쿼리를 작성해 임시테이블을 활용방법 중 대표적인 것이 인라인 뷰(Inline View)와 WITH 구문(CTE, Common Table Expression)이야.


1️⃣ 인라인 뷰(Inline View)란?

🔹 개념

인라인 뷰(Inline View)FROM 절에서 서브쿼리를 사용하여 생성하는 임시 테이블이야.
즉, SQL 문 내에서 즉석에서 생성된 테이블처럼 동작하는 서브쿼리라고 생각하면 돼.


✅ 인라인 뷰 기본 구조

SELECT 컬럼명
FROM (서브쿼리) AS 별칭;
  • FROM 절에서 서브쿼리를 사용하면, 해당 결과가 임시 테이블처럼 동작함.
  • Oracle에서는 AS 키워드를 생략 가능하지만, 명확성을 위해 별칭(Alias)은 필수!

✅ 예제: 부서별 IT 부서 직원 조회

SELECT emp_id, name, salary
FROM (SELECT emp_id, name, salary FROM employees WHERE department = 'IT') subquery;

📌 실행 과정:
1️⃣ 서브쿼리 (SELECT emp_id, name, salary FROM employees WHERE department = 'IT') 실행
2️⃣ 그 결과를 subquery라는 임시 테이블로 사용
3️⃣ SELECT emp_id, name, salary FROM subquery; 실행

💡 즉, 서브쿼리는 마치 테이블처럼 동작하며, 원하는 조건을 추가로 적용할 수 있음!


✅ 예제: 인라인 뷰를 활용한 상위 3명의 급여 정보 조회

SELECT *
FROM (
    SELECT emp_id, name, salary 
    FROM employees 
    ORDER BY salary DESC
) subquery
WHERE ROWNUM <= 3;

📌 실행 과정:
1️⃣ 서브쿼리에서 ORDER BY salary DESC로 급여가 높은 순서대로 정렬
2️⃣ ROWNUM <= 3을 적용하여 상위 3명의 직원만 선택

💡 인라인 뷰를 사용하면, 복잡한 쿼리를 간결하게 만들 수 있음!


2️⃣ WITH 구문(CTE, Common Table Expression)이란?

🔹 개념

WITH 구문(CTE, Common Table Expression)쿼리 실행 중 일시적으로 사용할 수 있는 가상의 테이블을 정의하는 방식이야.
인라인 뷰와 비슷하지만, 가독성과 성능 면에서 더 유리한 경우가 많아.


✅ WITH 구문의 기본 구조

WITH 임시테이블명 AS (
    서브쿼리
)
SELECT 컬럼명 FROM 임시테이블명;
  • WITH 절에서 서브쿼리를 정의하고, 해당 결과를 임시 테이블처럼 사용 가능
  • 여러 개의 서브쿼리를 정의할 수도 있음!

✅ 예제: WITH 구문을 활용한 부서별 평균 급여보다 높은 직원 조회

WITH DeptAvg AS (
    SELECT department, AVG(salary) AS avg_salary
    FROM employees
    GROUP BY department
)
SELECT e.emp_id, e.name, e.salary, d.avg_salary
FROM employees e
JOIN DeptAvg d
ON e.department = d.department
WHERE e.salary > d.avg_salary;

📌 실행 과정:
1️⃣ WITH DeptAvg AS (...)에서 부서별 평균 급여를 계산하여 임시 테이블 생성
2️⃣ DeptAvgemployees 테이블과 조인
3️⃣ 각 직원의 급여가 부서 평균보다 높은 직원만 필터링

💡 CTE는 동일한 서브쿼리를 여러 번 사용해야 할 때 더 효과적임!


3️⃣ 인라인 뷰 vs WITH 구문 비교

비교 항목인라인 뷰 (Inline View)WITH 구문 (CTE)
가독성복잡한 쿼리가 되면 가독성이 떨어질 수 있음쿼리를 분리하여 가독성이 뛰어남
재사용성동일한 서브쿼리를 여러 번 사용할 경우, 중복 코드 발생WITH에서 정의한 테이블을 여러 번 재사용 가능
성능 최적화실행할 때마다 서브쿼리를 다시 계산최적화 엔진이 CTE를 한 번만 계산할 수도 있음 (SQL 엔진에 따라 다름)
사용 예시단순한 서브쿼리, 임시 테이블처럼 활용할 때복잡한 쿼리, 동일한 서브쿼리를 여러 번 사용할 때

💡 즉, 인라인 뷰는 간단한 서브쿼리에 적합하고, WITH 구문(CTE)은 복잡한 쿼리를 깔끔하게 정리하는 데 유용함!


4️⃣ WITH RECURSIVE (재귀 CTE)

🔹 WITH RECURSIVE자기 자신을 참조하여 반복적으로 데이터를 생성할 때 사용돼!
🔹 일반적인 계층형 데이터(예: 조직도, 카테고리 트리)에서 활용 가능.

예제: 사원 계층 구조 (상사-부하 관계) 조회

WITH RECURSIVE EmployeeHierarchy AS (
    SELECT emp_id, name, manager_id, 1 AS level
    FROM employees
    WHERE manager_id IS NULL  -- 최고 관리자 (최상위 노드)
    
    UNION ALL
    
    SELECT e.emp_id, e.name, e.manager_id, eh.level + 1
    FROM employees e
    JOIN EmployeeHierarchy eh ON e.manager_id = eh.emp_id
)
SELECT * FROM EmployeeHierarchy;

manager_id IS NULL인 직원부터 시작 (최상위 관리자)
UNION ALL을 사용하여 부하 직원들을 재귀적으로 조회
level 컬럼을 활용하여 계층 구조 확인 가능


🔥 결론

인라인 뷰(Inline View)

  • FROM (서브쿼리) 형태로 사용되며, 임시 테이블처럼 동작
  • 단순한 서브쿼리 처리에 적합하지만, 가독성이 떨어질 수 있음

WITH 구문(CTE, Common Table Expression)

  • WITH 테이블명 AS (서브쿼리) 형태로 사용되며, 가독성이 좋고, 재사용 가능
  • 복잡한 SQL, 동일한 서브쿼리 반복 사용 시 유리

WITH RECURSIVE (재귀 CTE)

  • 계층 구조(조직도, 카테고리 트리) 데이터를 처리할 때 유용

📌 복잡한 SQL을 작성할 때는 가독성과 성능을 고려하여 적절한 방법을 선택하자! 🚀

0개의 댓글