본문 바로가기
데이터베이스/오라클

오라클정리 3-서브쿼리 다양한용도

by ㅇ혜성ㅇ 2018. 6. 4.

1 서브 쿼리 
   
=>인라인 뷰 sql구문에서 from 뒤에 서브퀴리가 나오는 형태 


  sql구문을 효율적으로 작성하지 못할경우는 검색속도가 느려진다,
  튜닝
 1) 테이블명을 별칭부여
 2)테이블의 필드의 수가 많고 데이터가 많을경우 
  
  from 서브쿼리 예)
  ===============================
 select e.ename ,e.job,d.dname ,d.loc
from ( select ename,job, deptno
       from emp
       where job='MANAGER'
)e ,dept d
where e.deptno=d.deptno


==============================
=> MANaGER 에 해당하는 내용만 불려온다 그다음 조인 


 서브쿼리 select ~from 사이에도 서브쿼리가 올수 있다,
출력순서


select deptno,dname,(
 case when deptno in(select deptno from dept
                     where loc='NEW YORK')
      then '중심부'
      else '변두리'
 end
) "부서 위치"
from dept


테이블 생성하는 방법 =>기존의 테이블을 백업 시커서 새로운
                                테이블을 생성 ->백업데이터 


full backup =>기존테이블을 통째로 복사 ()
 create table 백업tb명 as select * from 기존tb명 
ex) create table b_emp as select * from emp;
=>테이블의 구조와 데이터를 복사해온다.
주의할점)=>제약조건은 복사가 안되기 때문에 따로 설정해야한다.


2)부분백업 =>특정조건에 만족하는 데이터만 따로검색=>테이블에 저장
 예)emp)job이 MANAGER 만 사원들만 따로 테이블로 저장


SQL> create table b_manager as select * from emp where job=upper('manager');
테이블이 생성되었습니다.(부분 백업 )


SQL> select count(*) from b_manager;


  COUNT(*)
----------
         3


SQL> select * from b_manager;


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7566 JONES      MANAGER         7839 81/04/02       2975
        20


      7698 BLAKE      MANAGER         7839 81/05/01       2850
        30


      7782 CLARK      MANAGER         7839 81/06/09       2450

        10


SQL> ed
file afiedt.buf(이)가 기록되었습니다


  1  create table emp_deptno as
  2  select deptno,count(*), avg(sal), sum(sal),min(sal),max(sal)
  3  from emp
  4* GROUP by deptno
SQL> /
select deptno,count(*), avg(sal), sum(sal),min(sal),max(sal)
              *
2행에 오류:

ORA-00998: 이 식은 열의 별명과 함께 지정해야 합니다


+.>실제 백업테이블을 생성할때 실제로 검색된 필드가 존재해야 백업을 만들수 있는대 
     그룹함수통해서 만들어진 필드 =가상필드이기 때문에 에러발생 

  수정
  실제존재하는 필드처럼 가상필드명 


수정 에)
create table emp_deptno(d_deptno,e_count, e_avg, E_sum,e_min,e_max 
) as 
select deptno,count(*), avg(sal), sum(sal),min(sal),max(sal) 
from emp

GROUP by deptno


백업테이블=>필드가 복사 =>데이터 까지 복사 
                  =>폴더만 복사 (테이블은 생성이 되는데 데이터x)
 
ex) create backup테이블명 as select * from 원본테이블명 where 거짓인조건 


++++++++++++++++++++++++++++++++++++++++++++++++++++++
 서브쿼리 (insert ,update , delete, select )에도 사용가능 


형식) 1 insert 시
insert into 테이블명 values(필드명1,필드명2) ()서브쿼리


===>insert 시서브쿼리 안쓰는게 편하다 .




2 update
update를 서브쿼리를 이용하여 적용 


에시)


update b_emp
set (job,sal)=( select job,sal from b_emp
              where ename='SCOTT')

where ename='JONES'
     
      


 EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
------ ---------- --------- ---------- -------- ---------- ----------
DEPTNO
------
  7566 JONES      MANAGER         7839 81/04/02       2975       20
         


delete도 가능 
예시)


SQL> ed
file afiedt.buf(이)가 기록되었습니다


  1  delete
  2  from b_emp
  3  where deptno =(
  4  select deptno
  5  from dept
  6  where dname='SALES'
  7* )
SQL> /






오라클의 구성요소 ->***테이블 **뷰, **시퀀스 **인댁스 ......














'데이터베이스 > 오라클' 카테고리의 다른 글

오라클 페이징처리  (0) 2018.06.05
오라클5-뷰에 대해서(2)  (0) 2018.06.05
오라클4-뷰에 대해서..  (0) 2018.06.04
오라클 정리2  (0) 2018.06.03
오라클 정리1  (0) 2018.06.02