SQL에서 서브쿼리를 작성해 임시테이블을 활용방법 중 대표적인 것이 인라인 뷰(Inline View)와 WITH 구문(CTE, Common Table Expression)이야.
인라인 뷰(Inline View)는 FROM 절에서 서브쿼리를 사용하여 생성하는 임시 테이블이야.
즉, SQL 문 내에서 즉석에서 생성된 테이블처럼 동작하는 서브쿼리라고 생각하면 돼.
SELECT 컬럼명
FROM (서브쿼리) AS 별칭;
FROM 절에서 서브쿼리를 사용하면, 해당 결과가 임시 테이블처럼 동작함. AS 키워드를 생략 가능하지만, 명확성을 위해 별칭(Alias)은 필수! 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; 실행
💡 즉, 서브쿼리는 마치 테이블처럼 동작하며, 원하는 조건을 추가로 적용할 수 있음!
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명의 직원만 선택
💡 인라인 뷰를 사용하면, 복잡한 쿼리를 간결하게 만들 수 있음!
WITH 구문(CTE, Common Table Expression)은 쿼리 실행 중 일시적으로 사용할 수 있는 가상의 테이블을 정의하는 방식이야.
인라인 뷰와 비슷하지만, 가독성과 성능 면에서 더 유리한 경우가 많아.
WITH 임시테이블명 AS (
서브쿼리
)
SELECT 컬럼명 FROM 임시테이블명;
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️⃣ DeptAvg를 employees 테이블과 조인
3️⃣ 각 직원의 급여가 부서 평균보다 높은 직원만 필터링
💡 CTE는 동일한 서브쿼리를 여러 번 사용해야 할 때 더 효과적임!
| 비교 항목 | 인라인 뷰 (Inline View) | WITH 구문 (CTE) |
|---|---|---|
| 가독성 | 복잡한 쿼리가 되면 가독성이 떨어질 수 있음 | 쿼리를 분리하여 가독성이 뛰어남 |
| 재사용성 | 동일한 서브쿼리를 여러 번 사용할 경우, 중복 코드 발생 | WITH에서 정의한 테이블을 여러 번 재사용 가능 |
| 성능 최적화 | 실행할 때마다 서브쿼리를 다시 계산 | 최적화 엔진이 CTE를 한 번만 계산할 수도 있음 (SQL 엔진에 따라 다름) |
| 사용 예시 | 단순한 서브쿼리, 임시 테이블처럼 활용할 때 | 복잡한 쿼리, 동일한 서브쿼리를 여러 번 사용할 때 |
💡 즉, 인라인 뷰는 간단한 서브쿼리에 적합하고, WITH 구문(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 (서브쿼리) 형태로 사용되며, 가독성이 좋고, 재사용 가능 ✅ WITH RECURSIVE (재귀 CTE)
📌 복잡한 SQL을 작성할 때는 가독성과 성능을 고려하여 적절한 방법을 선택하자! 🚀