안녕하세요.
https://blog.naver.com/sysysy0302 여니입니다 :)
인라인뷰 소개
서브쿼리가 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;
두 방식 모두 같은 결과를 출력하지만, 실행 계획을 확인하면 오라클 옵티마이저가 다른 실행 계획을 세우는것을 알 수 있다.
조인 방식의 실행 계획
인라인뷰 방식의 실행 계획
+ 위 내용은 인라인뷰의 개념이 헷갈려서 추가 공부를 하면서 아래의 포스팅을 참고하여 작성하게 되었습니다.
https://loghada.tistory.com/18