DML(Date Manupluation Language)

INSERT UPDATE DELETE

데이터 조작 언어. 테이블에 값을 삽입 / 수정 / 삭제 하거나 조회 하는 언어

 

INSERT : 새로운 행을 추가하는 구문이다. 테이블의 행 개수가 증가한다.
  • 테이블의 일부 컬럼에 INSERT 할 때
  • INSERT INTO 테이블명 (컬럼명, 컬럼명, …) VALUES (데이터, 데이터…);
  • 테이블에 모든 컬럼에 INSERT 할 때→ 컬럼명을 기술하는 것이 의미 파악에는 더 좋다.
  • INSERT INTO 테이블명 VALUES (데이터, 데이터, …);
  • INSERT 시 VALUES 대신에 서브쿼리를 이용할 수 있다.

INSERT ALL : INSERT시에 사용하는 서브 쿼리가 같은 경우 두 개 이상의 테이블에 INSERT ALL을 이용하여 한 번에 데이터를 삽입할 수 있다.

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

INSERT ALL 할 테이블 만들 때,

CREATE TABLE EMP_DEPT_D1
AS
SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , HIRE_DATE
  FROM EMPLOYEE
 WHERE 1 = 0; 
    -> 무조건 FALSE. 구조만 복사하고 데이터 행들은 복사하지 않는다

CREATE TABLE EMP_MANAGER
AS
SELECT 
       EMP_ID
     , EMP_NAME
     , MANAGER_ID
  FROM EMPLOYEE
 WHERE 1 = 0;

부서코드가 D1인 직원을 조회해서 삽입

INSERT ALL
  INTO EMP_DEPT_D1
VALUES
(
  EMP_ID
, EMP_NAME
, DEPT_CODE
, HIRE_DATE
)
  INTO EMP_MANAGER
VALUES
(
  EMP_ID
, EMP_NAME
, MANAGER_ID
)
SELECT -> 서브쿼리
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , HIRE_DATE
     , MANAGER_ID
  FROM EMPLOYEE
 WHERE DEPT_CODE = 'D1';  -> 조건이 같으면 서브쿼리 공유 가능하다

 

WHEN ~ THEN 을 이용하여 데이터를 나눠서 한 번에 삽입한다.

INSERT ALL
  WHEN HIRE_DATE < '2000/01/01'
  THEN
  INTO EMP_OLD
VALUES
(
  EMP_ID
, EMP_NAME
, HIRE_DATE
, SALARY
)
  WHEN HIRE_DATE >= '2000/01/01'
  THEN
  INTO EMP_NEW
VALUES
(
  EMP_ID
, EMP_NAME
, HIRE_DATE
, SALARY
)  
SELECT
       EMP_ID
     , EMP_NAME
     , HIRE_DATE
     , SALARY
  FROM EMPLOYEE;

 

UPDATE : 테이블에 기록된 컬럼의 값을 수정하는 구문이다.

테이블의 전체 행 개수는 변화가 없다

UPDATE 테이블명 SET 컬럼명 = 바꿀값, 컬럼명 = 바꿀값, …

[WHERE 컬럼명 / 비교연산자 / 비교값];

업테이트 할 테이블을 복사해온다.

CREATE TABLE DEPT_COPY
AS
SELECT D.*
  FROM DEPARTMENT D;

조건에 따른 업데이트

UPDATE
       DEPT_COPY
   SET DEPT_TITLE = '전략기획팀'
 WHERE DEPT_ID = 'D9';

UPDATE시에도 서브쿼리를 사용할 수 있다.

UPDATE 테이블명 SET 컬럼명 = (서브쿼리)

UPDATE
       EMP_SALARY
   SET (SALARY, BONUS) = (SELECT
                                 SALARY
                               , BONUS
                            FROM EMP_SALARY
                           WHERE EMP_NAME = '유재식'
                         )
 WHERE EMP_NAME = '방명수';

UPDATE시 변경 값은 해당 컬럼에 대한 제약 조건에 위배되지 않아야 한다.

 

DELETE : 테이블의 행을 삭제하는 구문이다. 테이블의 행의 개수가 줄어든다

DELETE FROM 테이블명 WHERE 조건

WHERE절의 조건을 설정하지 않으면 모든 행이 다 삭제된다.

FK 제약 조건이 설정되어 있는 경우 참조되고 있는 값에 대해서는 삭제가 불가능하다. 기본 삭제 룰이 삭제 제한으로 설정되어 있기 때문이다.

FK 제약 조건이 설정되어 있어도 참조되고 있지 않은 값에 대해서는 삭제가 가능하다.

 

TRUNCATE : 테이블의 전체 행을 삭제할 시 사용한다.

TRUNCATE TABLE 테이블명;

DELETE보다 수행 속도가 더 빠르며 ROLLBACK을 통해 복구할 수 없다.

 

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

테이블에서 지정하는 조건의 값이 존재하면 UPDATE, 조건의 값이 없으면 INSERT됨

MERGE
 INTO EMP_M01 M1 --> 이 쪽으로 병합하겠다.
USING EMP_M02 M2 --> 2번 테이블을 이용해서
   ON (M1.EMP_ID = M2.EMP_ID) --> 이 기준으로 
 WHEN MATCHED THEN --> 위 조건이 매치된다면
UPDATE --> 업데이트
   SET M1.EMP_NAME = M2.EMP_NAME
     , M1.EMP_NO = M2.EMP_NO
     , M1.EMAIL = M2.EMAIL
     , M1.PHONE = M2.PHONE
     , M1.DEPT_CODE = M2.DEPT_CODE
     , M1.JOB_CODE = M2.JOB_CODE
     , M1.SAL_LEVEL = M2.SAL_LEVEL
     , M1.SALARY = M2.SALARY
     , M1.BONUS = M2.BONUS
     , M1.MANAGER_ID = M2.MANAGER_ID
     , M1.HIRE_DATE = M2.HIRE_DATE
     , M1.ENT_DATE = M2.ENT_DATE
     , M1.ENT_YN = M2.ENT_YN
 WHEN NOT MATCHED THEN --> ON 기준이 매치되지 않는다면
INSERT --> 인서트
(
  M1.EMP_ID, M1.EMP_NAME, M1.EMP_NO, M1.EMAIL, M1.PHONE
, M1.DEPT_CODE, M1.JOB_CODE, M1.SAL_LEVEL, M1.SALARY, M1.BONUS
, M1.MANAGER_ID, M1.HIRE_DATE, M1.ENT_DATE, M1.ENT_YN
)
VALUES
(
  M2.EMP_ID, M2.EMP_NAME, M2.EMP_NO, M2.EMAIL, M2.PHONE
, M2.DEPT_CODE, M2.JOB_CODE, M2.SAL_LEVEL, M2.SALARY, M2.BONUS
, M2.MANAGER_ID, M2.HIRE_DATE, M2.ENT_DATE, M2.ENT_YN
);

'LECTURE > Oracle' 카테고리의 다른 글

10_VIEW  (0) 2023.01.18
08_TCL & 09_DDL  (0) 2023.01.18
06_테이블 생성 및 제약조건  (0) 2023.01.17
05_SUBQUERY  (0) 2023.01.16
04_ JOIN  (0) 2023.01.16

+ Recent posts