insert into 문에 value 가 아닌 select 절을 이용하여 한번에 데이터를 입력하는 방법이다.
(1) emp_backup 이라는 테이블을 생성하고 그안에 데이터를 emp 테이블 데이터로 한번에 추가하고 싶을때
insert 문에 서브 쿼리문을 이용하여 한번에 입력 할 수 있다.
예제 : emp table 을 그대로 복제한 emp2 테이블 부서에 deptno 가 10 번인 사원들의 empno, ename, sal, deptno 를 한번에 갱신 해보자.
insert into emp2 (empno, ename, sal, deptno)
select ename, ename, sal, deptno
from emp
where deptno =10;
-> 이런식으로 일반적으로 insert 문장을 쓸때 쓰던 value 대신에 select 절을 그대로 입력하여 insert 시켜주면 데이터가 그대로 입력되게 된다.
이런 방법을 쓰는 이유는 기존에 쓰던 insert into 테이블 명 (컬럼들) value (데이터들) 은 한번에 하나의 행만 추가할 수 있기때문에 여러개의 행을 갱신할때 힘들 수 있다.
그렇기 때문에 서브쿼리로 insert 문을 수행하여 여러개의 행을 한번에 입력되도록 하는것이다.
만약 !
(2) 데이터가 아닌 테이블의 구조만 가지고 오고싶다면
create table emp2
as
select *
from emp
where 1 =2 ;
-> 이런식으로 새로만들 emp2테이블을 생성해주고 가져오려고 하는 emp 테이블의 전체 * 를 가져오는데
where 절에 거짓조건문을 써주게 된다면 데이터는 가져오지 못하고 그 테이블의 구조만 가져올 수 있다.
거짓조건 1 = 2 / 1은 2이다?
-> 꼭 이 조건이 아니여도 조건이 거짓이면 된다.
(3) 또 insert 문을 백업 파일 갱신에도 사용할 수 있다.
일단 dept 테이블의 백업파일을 만들어보겠다.
create table dept_backup
as
select *
from dept;
-> dept 의 모든 구조와 데이터들이 그대로 dept_backup 테이블이라는 이름에 저장되었다.
근데 일을 하다보면 dept 파일들이 수정되고 갱신 되는데 그럴때 dept_backup 테이블과의 데이터 차이가 나게 된다.
데이터의 차이를 출력 하고 싶다면 집합연산자인 minus를 이용하여 출력 하면 된다.
select *
from detp
minus
select *
from dept_backup;
-> 이 출력물은 dept 에서 dept_backup 을 뺐으므로 dept _backup 에는 없는 데이터들이 출력되었다.
따라서 이 식을 그대로 insert문의 서브 쿼리로 사용하게 되면 dept_backup 테이블에 새로운 데이터를 갱신 할 수 있다.
insert into deptno_backup
select *
from detp
minus
select *
from dept_backup;
이런식으로 상황에 맞게 집합연산자 minus 를 사용하여 insert 문의 서브쿼리로 새로운 데이터를 갱신 할 수 있다.
'Oracle > SQL' 카테고리의 다른 글
SQL 서브쿼리를 이용한 DATA 삭제 Delete (0) | 2021.11.30 |
---|---|
SQL 서브쿼리를 이용한 DATA 수정 Update (update 절에 튜닝시 merge 만큼빠름) (0) | 2021.11.30 |
SQL Select 절에 LOCK 을 거는 For Update (0) | 2021.11.30 |
SQL 쿼리에 LOCK이 걸리는 경우 (0) | 2021.11.30 |
SQL [TCL] COMMIT / ROLLBACK (0) | 2021.11.30 |