본문 바로가기

DB/Oracle

Oracle DB #8 테이블 내용을 추가, 삭제, 수정하는 DML

1. 테이블 내용을 추가,  삭제, 수정하는 DML

1) 테이블에 새로운 행을 추가하는 INSERT문

- INSERT 문은 테이블에 새로운 데이터를 입력하기 위해 사용하는 데이터 조작어

INSERT INTO table_name

(column_name, …)

VALUES(column_value, …);

 

2) 테이블의 구조만 복사하기

- 새로운 데이터를 추가하기 위해서 사용할 명령어 INSERT INTO ~ VALUES ~는 칼럼 명에 기술된 목록의 수와 VALUES 다음에 나오는 괄호에 기술한 값의 개수가 같아야 함

INSERT INTO DEPT01

(DEPTNO, DNAME, LOC)

VALUES(10, 'ACCOUNTING', 'NEW YORK');

 

3) INSERT 구문에서 오류 발생의 예

- 칼럼 명에 기술된 목록의 수보다 VALUES 다음에 나오는 괄호 안에 기술한 값의 개수가 적으면 에러가 발생

INSERT INTO DEPT01

(DEPTNO, DNAME, LOC)

VALUES (10, 'ACCOUNTING'); <- 에러(기술한 값 갯수 부족)

 

- 칼럼 명에 기술된 목록의 수보다 VALUES 다음에 나오는 괄호에 기술한 값의 개수가 많으면 에러가 발생

INSERT INTO DEPT01

(DEPTNO, DNAME, LOC)

VALUES(10, 'ACCOUNTING', 'NEW YORK', 20); <- 에러(기술한 값 갯수 초과)

 

- 칼럼 명이 잘못 입력되었을 때에도 에러가 발생

INSERT INTO DEPT01

(NUM, DNAME, LOC)

VALUES(10, 'ACCOUNTING', 'NEW YORK'); <- 에러 (NUM x)

 

- 칼럼과 입력할 값의 데이터 타입이 서로 맞지 않을 경우에도 에러가 발생

INSERT INTO DEPT01

(DEPTNO, DNAME, LOC)

VALUES(‘50’, ‘ACCOUNTING’, SEOUL); <- 에러 (정수형은 '' 생략, 문자열은 '' 안에 사용) 

 

 

4) 칼럼 명을 생략한 INSERT 구문

- 테이블에 로우를 추가할 때 모든 칼럼에 모두 자료를 입력하는 경우에는 굳이 칼럼 목록을 기술하지 않아도 됨

- 칼럼 목록이 생략되면 VALUES 절 다음의 값들이 테이블의 기본 칼럼 순서대로 입력

- 테이블의 컬럼 순서는 CREATE TABLE로 테이블을 생성할 때의 순서를 따름

- 테이블의 기본 칼럼 순서는 DESC 문으로 조회했을 때 보여 지는 순서임

 

5) NULL 값 삽입하는 다양한 방법

- 데이터를 입력하는 시점에서 해당 컬럼 값을 모르거나 확정되지 않았을 경우에는 NULL 값을 입력해야 함

- 암시적 방법: 다른 칼럼은 값을 입력하지만 이렇게 생략한 칼럼에는 암시적으로 NULL 값이 할당되는 것

- 명시적 방법: VALUES 리스트에 명시적으로 NULL 값 입력

 

암시적으로 NULL 값의 삽입

- 지역명이 결정되지 않은 30번 부서에 부서명만 입력하려고 함

- 저장할 값을 명확하게 알고 있는 컬럼 명만 명시적으로 기술한 후에 그에 매칭되는 값을 VALUES 절 다음에 기술

INSERT INTO DEPT01

(DEPTNO, DNAME)

VALUES (30, 'SALES');

 

명시적으로 NULL 값의 삽입

- 컬럼명을 명시적으로 기술하지 않으면 테이블이 갖고 있는 모든 컬럼에 값을 지정해야 함

INSERT INTO DEPT01

VALUES (40, 'OPERATIONS', NULL);

- 지역명이 결정되어 지지 않았더라도 반드시 값을 3개 지정해야 하기 때문에 명시적으로 VALUES 리스트에서 지역명에 NULL을 입력해야 함

- NULL 값을 갖는 칼럼을 추가하기 위해서 NULL 대신 ''를 사용할 수 있음

INSERT INTO DEPT01

VALUES (50, '', 'CHICAGO');

 

6) 서브 쿼리로 데이터 삽입하기

- NSERT INTO 다음에 VALUES 절을 사용하는 대신에 서브 쿼리를 사용할 수 있음

- 이렇게 하면 기존의 테이블에 있던 여러 행을 복사해서 다른 테이블에 삽입할 수 있음

- 이 때 주의할 점은 INSERT 명령문에서 지정한 컬럼의 개수나 데이터 타입이 서브 쿼리를 수행한 결과와 동일해야 한다는 점임

 

7) 다중 테이블에 다중 행 입력하기

- NSERT ALL 명령문은 서브 쿼리의 결과 집합을 조건 없이 여러 테이블에 동시에 입력하기 위한 명령문

- 이때 주의할 점은 서브 쿼리의 컬럼명과 데이터가 입력되는 테이블의 컬럼명이 동일해야 한다는 점

INSERT ALL

INTO EMP_HIR VALUES(EMPNO, ENAME, HIREDATE)

INTO EMP_MGR VALUES(EMPNO, ENAME, MGR)

SELECT EMPNO, ENAME, HIREDATE, MGR

FROM EMP

WHERE DEPTNO=20;

 

8) 테이블 내용을 수정하기 위한 UPDATE 문

- 테이블에 저장된 데이터를 수정하기 위해 사용

UPDATE table_name

SET column_name1 = value1, column_name2 = value2, …

WHERE conditions;

 

- UPDATE 문은 기존의 행을 수정하는 것입니다. 따라서 어떤 행의 데이터를 수정하는지 WHERE 절을 이용하여 조건을 지정

- WHERE 절을 사용하지 않을 경우는 테이블에 있는 모든 행이 수정, WHERE절을 추가하면 특정 행만 변경

- 정말 테이블의 전체 행을 수정하려고 했던 것이 아니라면 큰 문제가 발생하므로 WHERE 절의 사용 유무를 신중히 판단하여야 함

- 테이블에서 2개 이상의 칼럼 값을 변경하려면 기존 SET 절에 콤마를 추가하고 칼럼=값을 추가 기술하면 됨

 

SCOTT 사원의 부서번호는 20번으로, 직급은 MANAGER로 한꺼번에 수정해보자

UPDATE EMP01

SET DEPTNO=20, JOB='MANAGER'

WHERE ENAME='SCOTT';

 

9) 서브 쿼리를 이용한 데이터 수정하기

- UPDATE 문의 SET 절에서 서브 쿼리를 기술하면 서브 쿼리를 수행한 결과로 내용이 변경

 

10번 부서의 지역명을 40번 부서의 지역명으로 변경하기 위해서 서브 쿼리문을 사용해보자

UPDATE DEPT01

SET LOC=(SELECT LOC

         FROM DEPT01

         WHERE DEPTNO=10)

         WHERE DEPTNO=40;

 

10) 서브 쿼리를 이용한 두 개 이상의 칼럼에 대한 값 변경

UPDATE table_name

SET (column_name1, column_name2, …) = (sub_query)

WHERE 조건

 

 

11) 테이블에 불필요한 행을 삭제하기 위한 DELETE 문

- DELETE문 테이블에 저장되어 있는 데이터 삭제

 

DELETE FROM table_name

WHERE conditions;

 

- DELETE 문은 테이블의 기존 행을 삭제하며 특정한 로우(행)을 삭제하기 위해서 WHERE 절을 이용하여 조건을 지정

- 만약 DELETE 문에 WHERE 절을 사용하지 않을 경우 테이블에 있는 모든 행이 삭제되므로 매우 신중하게 명령문을 사용

 

12) 서브 쿼리를 이용한 데이터 삭제

DELETE 문을 사용하기에 앞서 사원 테이블을 복사하고, 사원 테이블에서 부서명이 SALES인 사원을 모두 삭제해보도록 해보자

 

DELETE FROM EMP01

WHERE DEPTNO=(SELECT DEPTNO

              FROM DEPT

              WHERE DNAME='SALES');

 

13) 테이블 합병하는 MERGE

- MERGE는 합병이란 의미이므로 구조가 같은 두개의 테이블을 하나의 테이블로 합치는 기능

- MERGE 명령을 수행하기 위해서 수행하는 테이블에 기존에 존재하는 행이 있다면 새로운 값으로 갱신(UPDATE)되고, 존재하지 않으면 새로운 행으로 추가(INSERT)