본문 바로가기
DataBase/Oracle

SUB-QUERY) 스칼라 서브쿼리, inline-view

by 박채니 2022. 4. 22.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


스칼라 서브쿼리

- scala 값 (단일 값)

- select절에 사용된 1행 1열 상관서브쿼리

 

사원명, 부서명, 관리자명 조회

select
    emp_name,
    (select dept_title from department where dept_id = e.dept_code) dept_title,
    (select emp_name from employee where emp_id = e.manager_id) manager_name
from
    employee e;

 


INLINE-VIEW

- from절에 사용된 서브쿼리

- inline view에 정의되지 않은 컬럼은 메인 쿼리에서 사용할 수 없음

- inline view에 별칭을 사용했다면, 메인 쿼리에서는 별칭으로 접근

※ view란 : 실제 테이블에 근거해서 작성된 논리적 가상 테이블

 

view를 통해 실제 테이블의 데이터에 접근

① inline view 1회용

② stored view 객체로 저장 후 재사용

 

여사원의 사번, 사원명, 성별 조회

[inline view 사용 전]

select
    emp_id,
    emp_name,
    decode(substr(emp_no, 8, 1), '2', '여', '4', '여', '남') gender
from
    employee
where
    substr(emp_no, 8, 1) in ('2', '4');

inline view를 사용하지 않는다면, SQL은 어떠한 변수에 담아서 재사용할 수 없기 때문에 중복되는 코드를 다시 사용하는 경우가 빈번합니다.

gender = '여' 라고 where절에서 쓸 수 있으면 편할 텐데요,

inline view를 사용하면 비슷한 효과를 낼 수 있습니다.

 

여사원의 사번, 사원명, 성별 조회

[inline view 사용 후]

select
    emp_id, emp_name, gender
from
    (
        select
            emp_id,
            emp_name,
            decode(substr(emp_no, 8, 1), '2', '여', '4', '여', '남') as gender
        from
            employee
    )
where
    gender = '여';

코드가 훨씬 직관적이고 간결해진 것을 확인할 수 있습니다.

다만 inline view에서 별칭을 사용했다면 메인 쿼리에서도 별칭으로 접근해야 합니다.

또한 inline view에서 사용하지 않은 컬럼을 불러올 수도 없습니다.

 

1990년대 입사자 조회 (사번, 사원명, 입사년도)

select
    *
from
    (
        select
            emp_id,
            emp_name,
            extract(year from hire_date) as hire_date
        from
            employee
    )
where
    hire_date between 1990 and 1999
order by
    hire_date;

 

30~49세의 여사원 조회 (사번, 사원명, 부서명, 성별, 나이)

select
    *
from
    (
        select
            emp_id,
            emp_name,
            (select dept_title from department where dept_id = e.dept_code) dept_title,
            decode(substr(emp_no, 8, 1), '2', '여', '4', '여', '남') gender,
            extract(year from sysdate) - (decode(substr(emp_no, 8, 1), '1', 1900, '2', 1900, 2000) + substr(emp_no, 1, 2)+1) age
        from
            employee e
    )
where
    gender = '여'
    and
    age between 30 and 49;