데이터베이스 수업 기록

22-11-14 서브쿼리 중에 "인라인 뷰(Inline View)"

JadeStone 2022. 11. 14. 19:46

<인라인 뷰>

-사용하는 이유: 새로운 칼럼을 만든 것을 밖에서 다시 사용해서 추가 작업을 이어나가야 할 때 사용.
-처음에는 헷갈리니까 내가 필요한 select 구문을 찾고 그대로 그걸 
 from 절에 넣어주고 그대로 이어서 작업해주면 됨.

--인라인뷰
select *
from (select *
      from employees);

--order를 거치면서 순서가 섞임
select rownum, first_name,job_id, salary
from employees
order by salary;

--인라인뷰
select  rownum,
        a.*
from (select first_name, job_id, salary
        from employees
        order by salary) a
where rownum <= 10;

--rownum이 중간 카운트 불가
select  rownum,
        a.*
from (select first_name, job_id, salary
        from employees
        order by salary) a
where rownum > 10 and rownum <=20; --값이 안 나오는 이유는 rownum은 값이 첫 번째 행부터 있어야 조회할 수 있다.

--3중 인라인 뷰
select  *
from (select  rownum as rn,
              a.*
     from(select *
          from employees
          order by salary desc) a)
where rn > 10 and rn <= 20;
----------------------------------------------------------------------------------------
--인라인 뷰 응용 (JOIN테이블의 위치로 인라인뷰 삽입가능 or 스칼라 쿼리와 혼합해서 사용가능)
--DEPARTMENTS 테이블에서 MANAGER_ID가 NULL이 아닌 데이터를, EMPLOYEES에 조인
SELECT *
FROM employees E
LEFT OUTER JOIN (SELECT * 
                 FROM DEPARTMENTS 
                 WHERE MANAGER_ID IS NOT NULL) D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;

--salary가 10000이상인 직원의 정보 전부, 부서명, 부서의 주소, job_title을 출력. salary기준으로 내림차순
select  e.*,
        d.department_name,
        l.street_address,
        j.job_title
from employees e
left outer join departments d on e.department_id = d.department_id
left outer join locations l on d.location_id = l.location_id
left outer join jobs j on e.job_id = j.job_id
where salary >= 10000;

--인라인뷰에 들어갈 구문(위에랑 똑같은 구문임)
SELECT  A.*,
        (SELECT STREET_ADDRESS FROM LOCATIONS L WHERE L.LOCATION_ID = A.LOCATION_ID),
        (SELECT JOB_TITLE FROM JOBS J WHERE J.JOB_ID = A.JOB_ID) AS JOB_TITLE
FROM (select *
        from employees e
        left outer join departments d
        on e.department_id = d.department_id
        where salary >= 10000) A;

  
 
< DML(Data Manipulation Language) >
 
#DML 문장은 다음의 경우에 실행됩니다.
-테이블에 새로운 행을 추가할 때
-테이블에 있는 기존의 행을 변경할 때
-테이블로부터 기존의 행을 제거할 때
 
<기억할거>
*where -> 서브쿼리 : 조건을 걸어줌.
*select ->서브쿼리 : join의 역할을 함
*from   ->서브쿼리 :인라인뷰 라고 함
*rownum 을 조회할 땐 rownum이 무조건 1행부터 나와야함. 
 만약 rownum 20이상 40미만 이렇게 제한을 주고싶으면 인라인 뷰를 사용해주어야함.
*select 구문에 관한 내용이 제일 중요함. 공부 잘 해두기.