프로그래밍/Oracle

[Oracle] 서브 쿼리를 사용하여 데이터 활용

eunki 2022. 6. 3. 17:59
728x90

회사에서 차세대 프로젝트라고 해서 전산 쪽에 관련한 큰 프로젝트를 한다고 하면 내용이 무엇인가?

- 데이터를 저장하는 컴퓨터(서버)를 더 좋은 것으로 교체한다.

- 옛날 컴퓨터(서버)에 있었던 데이터를 새로운 컴퓨터(서버)로 옮긴다.

- 새로운 컴퓨터에 있는 데이터를 select 해서 새로운 홈페이지나 UI(사용자 화면)를 개발한다.

 

 

 

 

예제 1. emp_new 라는 테이블을 생성

create table emp_new
as
select *
    from emp
    where 1 = 2;

1 = 2 가 거짓 조건이므로 emp 테이블을 가지고 emp_new 를 만들 때,

데이터는 못 가져오고 구조만 가져와서 생성한다.

insert into emp_new
select *
    from emp;

 

 

 

update 문에서 서브 쿼리를 사용할 수 있는 절

update     --> 서브쿼리 사용가능  --> SQL 튜닝시에 주로 사용
    set    --> 서브쿼리 사용가능
    where  --> 서브쿼리 사용가능

 

 

 

예제 2. SCOTT 의 월급을 KING 월급으로 변경

update emp
    set sal = ( select sal
                from emp
                where ename = 'KING' )
    where ename = 'SCOTT';

 

 

 

예제 3. ALLEN 과 같은 부서 번호에서 근무하는 사원들의 월급을 KING 의 월급으로 변경

update emp
    set sal = ( select sal
                    from emp
                    where ename = 'KING' )
    where deptno = ( select deptno
                        from emp
                        where ename = 'ALLEN' );

 

 

 

예제 4. SCOTT 의 월급과 커미션을 ALLEN 의 월급과 커미션으로 변경

update emp
    set (sal, comm) = ( select sal, comm
                         from emp
                         where ename = 'ALLEN' );

set 절에 컬럼 여러 개를 괄호 안에 써주면 한 번에 여러 개의 컬럼 값을 변경할 수 있다.

 

 

 

예제 5. 사원 테이블에 loc 컬럼을 추가하고, 부서 테이블의 부서 위치 데이터를 사원 테이블의 부서 위치 데이터로 갱신

alter table emp
    add loc varchar2(10);
update ( select e.ename, e.loc as emp_loc, d.loc as dept_loc
            from emp e, dept d
            where e.deptno = d.deptno )
    set emp_loc = dept_loc;

 

 

 

예제6. SMITH 의 월급보다 더 많은 월급을 받는 사원들을 삭제

delete from emp
    where sal > ( select sal
                    from emp
                    where ename = 'SMITH' );

 

 

 

예제 7. 부서 테이블에 sumsal 이라는 컬럼을 추가하고 해당 부서 번호의 토탈 월급으로 갱신

alter table dept
    add sumsal number(10);
merge into dept d
using ( select deptno, sum(sal) as sumsal
            from emp
            group by deptno ) v
on (d.deptno = v.deptno)
when matched then
update set d.sumsal = v.sumsal;
728x90