본문 바로가기

Programming/SQL(Oracle)

DAY 56. [DataBase] 오라클 DML(INSERT, UPDATE, DELETE)

 

DML(Data Manipulation Language)

데이터 조작 언어로 테이블에 값을 **삽입(INSERT), 수정(UPDATE), 삭제(DELETE)**하는 구문을 말한다.

 

 

INSERT

테이블에 새로운 행을 추가하여 테이블의 행 개수를 증가시키는 구문

** INSERT하고자 하는 컬럼이 모든 컬럼인 경우는 컬럼명 생략이 가능하다. 단, 컬럼의 순서를 지켜서 VALUES 값을 기입해야 한다.

** INSERT 시 VALUES 대신 서브쿼리의 결과를 바로 INSERT 구문 안에 사용할 수 있다. 대신, 테이블의 컬럼 갯수와 데이터 타입이 서브쿼리로 정한 SELECT절의 결과와 동일해야 한다.

 

◾ INSERT ALL

서브쿼리가 사용하는 테이블이 같은 경우, 두 개 이상의 테이블에 INSERT ALL을 이용해서 한 번에 삽입이 가능하다.

단, 각 서브쿼리의 조건절이 같아야 한다.

 

 

📌테이블 구조만 복사하는 쿼리

-- EMPLOYEE 테이블의 구조를 복사하여 사번, 이름, 입사일, 급여를 기록할 수 있는 테이블 EMP_OLD와 EMP_NEW를 생성해보자.

CREATE TABLE EMP_OLD
AS SELECT EMP_ID,
		  EMP_NAME,
		  HIRE_DATE,
		  SALARY
	 FROM EMPLOYEE
	 WHERE 1 = 0;   -- -> WHERE 절의 값이 FALSE여서 데이터는 들어가지 않고, 테이블의 구조만 복사가 된다.

CREATE TABLE EMP_NEW
AS SELECT EMP_ID,
	      EMP_NAME,
		  HIRE_DATE,
		  SALARY
	 FROM EMPLOYEE
	 WHERE 1 = 0;

 

UPDATE

테이블에 기록된 컬럼의 값을 수정하는 구문으로 테이블의 전체 행 개수에는 변화가 없다.

UPDATE ~ SET

** WHERE 조건을 설정하지 않으면 모든 행의 컬럼 값이 변경된다.

** UPDATE 시에도 서브 쿼리 이용이 가능하다.

** 서브 쿼리에도 다중 행 다중 열 형태로 사용 가능하다.

 

 

MERGE

구조가 같은 두 개의 테이블을 하나의 테이블로 합치는 기능을 제공한다.

두 테이블에서 지정하는 조건의 값이 존재하면 UPDATE 되고 조건의 값이 없으면 INSERT 한다.

** 잘 사용하지는 않는다.

 

DELETE

테이블의 행을 삭제하는 구문으로 테이블의 행 개수가 줄어준다.

** WHERE 절에 조건을 설정하지 않으면 모든 행을 삭제한다.

** FOREIGN KEY 제약조건이 설정되어 있는 경우는 참조되고 있는 값에 대해서는 삭제가 불가능하다.

삭제시 FOREIGN KEY 제약조건으로 컬럼 삭제가 불가능한 경우는 제약조건을 비활성화 할 수 있다. (→ 잘 사용하지 않는다. 함부로 사용하지 말 것)

 

 

TRUNCATE

테이블 전체 행 삭제 시 사용하며 DELETE 보다 수행 속도가 빠르다.

ROLLBACK을 통해 컬럼의 복구가 불가능하다.

DELETE와 마찬가지로 FOREIGN KEY 제약조건 일 때는 적용이 불가능하기 때문에 제약 조건을 비활성화 해야 삭제할 수 있다.

** 모든 컬럼이 삭제되긴 하지만 테이블의 구조를 남아있다.

** DELETE는 행을 하나씩 삭제하고 TRUNCATE는 통째로 삭제하는 것이기 때문에 수행 속도가 빠르다.