Sub Query ( 서브 쿼리 )

양혜정·2024년 2월 25일

Oracle

목록 보기
15/49

Sub Query ( 서브 쿼리 )

  • select 문 속에 또 다른 select 문이 포함되어 있는 것
select ...
, (select ... from .... ) ==> Sub Query (서브쿼리 == 내부쿼리)
from .... ==> Main Query(메인쿼리 == 외부쿼리) 

응용

  • tbl_authorbook 테이블에서 공저(도서명은 동일하지만 작가명이 다른 도서) 로 지어진 도서정보
select *
from tbl_authorbook
where bookname in(select bookname
                  from tbl_authorbook 
                  group by bookname
                  having count(*) > 1);

Pairwise (쌍) Sub Query

  • 서브쿼리가 2개 이상

응용

  • 부서번호별로 salary 가 최대최소인 사원의 정보를 부서번호, 사원번호, 사원명, 기본급여, 부서내등수, 전체등수
WITH
V AS
(
  select department_id
        , employee_id 
        , first_name || ' ' || last_name as fullname
        , salary
        , rank() over(partition by department_id
        						order by salary desc) 
                        		as dept_rank -- 부서내등수
        , rank() over(order by salary desc) 
        						as total_rank   -- 전체등수
  from employees
)
SELECT department_id as 부서번호
      , employee_id as 사원번호
      , fullname as 사원명
      , to_char(salary,'99,999') as 기본급여
      , dept_rank as 부서내등수
      , total_rank as 전체등수
FROM V
WHERE (nvl(department_id,-9999), salary) 
	in(select nvl(department_id,-9999), max(V.salary)   
       from V               
       group by department_id)             
   or (nvl(department_id,-9999), salary) 
    in(select nvl(department_id,-9999), min(V.salary)   
       from V
       group by department_id)
-- ORDER BY 6,1;    -- 전체등수별로 보기 쉬움
ORDER BY 1,4;    
-- 각 부서별로 최대,최소 기본급여의 등수를 보기 쉬움

상관서브쿼리 ( == 서브상관쿼리 )

  • 서브쿼리가 where 절이나 having 그룹함수절에 있을 경우
select ...
from .....  ==> Main Query(메인쿼리 == 외부쿼리)
where ... in (select ... 
              from .....) ==> Sub Query (서브쿼리 == 내부쿼리)

Sub Query 를 사용하여 테이블 생성

create table tbl_테이블명
as
select ...
from ...
where ...;

백업본 만들기

create table tbl_테이블명_backup~~
as
select *
from 테이블명

상관서브쿼리 ( == 서브상관쿼리 ) 를 사용한 테이블 UPDATE (백업한 파일로 되돌리기)

update 테이블명 "별칭" set 컬럼명 = (select 컬럼명
-- set 컬럼명 은 되돌리고 싶은 컬럼명을 뜻 한다.
							from 백업한테이블명
                            where 백업본컬럼명 
                            		= 별칭.테이블컬럼명);
                       -- 백업할 조건 (변경하지 않은 컬럼 선택)
-- Ex) 
update employees E set first_name = (select first_name
						from tbl_employees_backup_20240225
						where employee_id = E.employee_id

참고

만나이, 정년퇴직일 서브쿼리 : https://velog.io/@jjoung-2j/%EB%8B%A8%EC%9D%BC%ED%96%89-%ED%95%A8%EC%88%98-%EA%B8%B0%ED%83%80-%ED%95%A8%EC%88%98


정리

-> local_hr에서작업한것

0개의 댓글