[Oracle] Inline View 인라인뷰란
Oracle

[Oracle] Inline View 인라인뷰란

인라인뷰 소개

서브쿼리가 FROM 절에서 안에서 사용되는 경우, 해당 서브쿼리를 '인라인뷰'라고 한다. FROM 절에서 사용된 서브쿼리의 결과가 하나의 테이블에 대한 뷰(View)처럼 사용된다. 

SELECT *
FROM (SELECT * 
	  FROM table 
      ORDER BY id DESC)
WHERE ROWNUM <= 5;

서브쿼리?
서브쿼리란 SELECT 문 안에 다시 SELECT 문이 기술된 형태의 쿼리(QUERY)입니다.  

뷰?
뷰는 저장장치에 내에 물리적으로 존재하진 않지만 사용자에게 있는 것처럼 보여지는 가상의 테이블이다. 

 

인라인뷰 기본 문법
SELECT column_list
FROM (SELECT * FROM table_name) [alias]
WHERE 조건식;

 

인라인뷰는 왜 사용할까?

1) 서브쿼리와 데이블 조인이 이루어질 경우 검색하는 데이터명(필드명)은 [테이블.필드명]과 같이 길어지된다. 이때 서브쿼리를 통애 메인쿼리로 올라갈수록 쿼리의 길이가 점점 더 길어질 뿐 아니라 쿼리의 가독성이 떨어진다. 이때, FROM절에서 사용하는 인라인뷰에 별칭(Alias)를 줘서 간단하게 만들 수 있다. 

 

2) 전체 테이블을 비교하는 것 보다 테이블의 일부 데이터만을 불러와 그 중에서 조건을 따지는것이 비교하는 횟수가 적다. 예를들어, 전체 데이터에서 비교하는 것보다 ROWNUM을 이용해서 10번째 튜플 정보만 가져와 그 중에서 조건을 따져 데이터를 가져온다면 비교하는 횟수가 줄어들게 할 수도 있다. (ROWNUM은 데이터를 가져오는 갯수를 제한하는 방식으로 N-TOP 질의라고 한다.)

 

인라인뷰 예제_오라클 HR 계정의 EMPLOYEES 테이블을 사용했습니다.

 

쿼리 목표: 사원테이블과 부서테이블에서 '부서별' 월급 총합, 평균, 부서별 인원수를 출력하세요. 

 

-- JOIN 방식

SELECT e.department_id, SUM(salary), AVG(salary), COUNT(*)
FROM employees e, departments d
WHERE e.department_id = d.department_id
GROUP BY e.department_id
ORDER BY e.department_id;
 
-- INLINE VIEW 방식 
 
SELECT e.department_id, 합계, 평균, 인원수
FROM ( SELECT department_id, SUM(salary) 합계, AVG(salary) 평균, COUNT(*) 인원수
       FROM employees
       GROUP BY department_id ) e, departments d
WHERE e.department_id = d.department_id
ORDER BY e.department_id;

두 방식 모두 같은 결과를 출력하지만, 실행 계획을 확인하면 오라클 옵티마이저가 다른 실행 계획을 세우는것을 알 수 있다.

 

조인 방식의 실행 계획
인라인뷰 방식의 실행 계획