본문 바로가기

SQL

21. 테이블의 내용 추가, 수정, 삭제 : DML(1)

[ DML ]
- 데이터 수정 언어(구조 변경)
- TCL(COMMIT, ROLLBACK)로 트랜잭션을 종료해야 함

1. INSERT
- 행 단위 삽입
- ORACLE에서는 일반적으로 INSERT로 다중행 입력 불가(단, 서브쿼리 사용 시 동시에 입력 가능)

 


** 문법
INSERT INTO 테이블명 VALUES(값1, 값2, ....);                   -- 테이블의 모든 컬럼의 값을 입력 시 
INSERT INTO 테이블명(컬럼1, 컬럼2, ...) VALUES(값1, 값2, ....);   -- 테이블의 일부 컬럼의 값을 입력 시 
                                                           -- NOT NULL 선언된 컬럼은 반드시 입력

 


예제) STUDENT_TEST1 테이블을 STUDENT 구조는 동일, 데이터 없이 생성한 후 
    두 건의 학생 데이터 입력(첫번째 입력은 모든컬럼 값 정의, 두번째 입력은 필수컬럼만 정의)

 


DESC STUDENT;


CREATE TABLE STUDENT_TEST1
AS
SELECT *
  FROM STUDENT
 WHERE 1=2;
  
SELECT *
  FROM STUDENT_TEST1;
  
TRUNCATE TABLE STUDENT_TEST1;



INSERT INTO STUDENT_TEST1 VALUES
(4321,'돌아이','DOLI',3,'9230191029304',TO_DATE('2000/11/22','YYYY/MM/DD'),'02)932-4321',190,80,102,202,4220);
INSERT INTO STUDENT_TEST1(STUDNO,NAME,ID,JUMIN) VALUES (4320,'돌아이2','DOLI2','9293102938102');
COMMIT;

 

 


예제) EMP와 구조는 동일하지만 데이터가 없는 EMP_INSERT1, EMP_INSERT2 생성 후 각각 10번, 20번 부서원 정보를 입력

 



CREATE TABLE EMP_INSERT1
AS
SELECT *
  FROM EMP 
 WHERE 1=2;

 


CREATE TABLE EMP_INSERT2
AS
SELECT *
  FROM EMP 
 WHERE 1=2;
 
방법1) 각각 

INSERT INTO EMP_INSERT1 
SELECT *
  FROM EMP 
 WHERE DEPTNO = 10;
 

INSERT INTO EMP_INSERT2 
SELECT *
  FROM EMP 
 WHERE DEPTNO = 20;
 
ROLLBACK;

 

 


--방법2) 하나의 INSERT문으로 동시에(INSERT ALL)
INSERT ALL
  INTO 테이블1 VALUES(...)
  INTO 테이블2 VALUES(...)
SELECT ....;

 

INSERT ALL
  WHEN 조건1 THEN INTO 테이블1 VALUES(...)
  WHEN 조건2 THEN INTO 테이블2 VALUES(...)
SELECT ....;



INSERT ALL
  WHEN DEPTNO = 10 THEN INTO EMP_INSERT1
  WHEN DEPTNO = 20 THEN INTO EMP_INSERT2
SELECT * FROM EMP;



SELECT * FROM EMP_INSERT1;
SELECT * FROM EMP_INSERT2;



2. UPDATE
- 셀 단위 수정(여러 셀 수정 가능)
- 일부 컬럼의 일부 행을 수정


** 문법
UPDATE 테이블명
   SET 컬럼 = 수정할값         -- 서브쿼리 전달 가능
 WHERE 조건;                -- 서브쿼리 전달 가능

select * from emp;


예제) emp_test1(emp에서 10번 또는 20번 직원들의 정보를 갖는 테이블)에서
    KING의 급여를 5500으로 수정

sol)


drop table emp_test1 purge;
create table emp_test1 as select * from emp where deptno != 30;
SELECT * FROM EMP_TEST1;


update emp_test1
   set sal = 5500
 where ename = 'KING';
 
select * from emp_test1;
commit;


예제) emp_test1 에서 comm이 없는 직원의 comm을 급여의 10%로 수정

 

sol)

update emp_test1
   set comm = sal*0.1
 where comm is null;
 

예제) emp_test1 에서 10번 부서원들의 sal을 전체 직원의 평균급여로 수정

 

sol)

update emp_test1
   set sal = (select round(avg(sal))
                from emp_test1)
 where deptno = 10;
commit;


예제) emp_test2 테이블을 emp와 동일하게 생성한 뒤 각 직원의 급여를 소속 부서의 평균급여로 수정

 

sol)

create table emp_test2
as
select * from emp;

select * from emp_test2;




update emp_test2 e1
   set sal = (select avg(sal)
                from emp_test2 e2
               where e1.deptno = e2.deptno);
 
commit;