JAVA 웹 개발/2. Oracle

07.DML(INSERT, UPDATE, DELETE)

코딩 펭귄 2022. 8. 13. 15:06
📅 2021.09.16 ~ 2021.09.17

DML(Data Manipulation Language)

  • 데이터 조작 언어로 테이블에 값을 삽입(INSERT), 수정(UPDATE), 삭제(DELETE)하는 구문을 말한다.
  • INSERT: 테이블에 새로운 행을 추가하여 테이블의 행 개수를 증가시키는 구문이다.
  • UPDATE: 테이블에 기록된 컬럼 값을 수정하는 구문으로 테이블 전체 행 개수는 변하지 않는다.
  • DELETE: 테이블의 행을 삭제하는 구문으로 테이블의 행 개수가 줄어든다.

 

INSERT

  • INSERT INTO 테이블명(컬럼명1, 컬럼명2, ...) VALUES(값1, 값2, ...) 형태로 사용한다.
  • 정석 INSERT: 해당 테이블에 존재하는 컬럼 명을 작성하는 INSERT문으로 내가 나열한 컬럼 순서대로 값을 넣을 수 있다. 따라서 본 테이블의 컬럼 순서를 기억하지 않아도 되며, 내가 원하는 컬럼만 뽑아서 값을 넣을 수 있다. 하지만 써야 하는 내용이 방대하다.
    INSERT INTO EMPLOYEE(EMP_ID, EMP_NAME, EMP_NO, JOB_CODE, SAL_LEVEL)
    VALUES(500, '김개발', '001122-1223344', 'J7', 'S3');
  • 생략 INSERT: 모든 컬럼에 값을 다 넣는 경우에는 컬럼명을 생략하여 작성이 가능하다. 써야 할 내용이 비교적 적으나, 모든 컬럼에 값을 넣어야 하며 일부만 넣는 경우 오류가 발생한다. 또한 본 테이블의 컬럼 순서대로 값을 넣어야 하기 때문에 본 테이블의 컬럼 순서를 알고 있어야 한다.
    INSERT INTO EMPLOYEE
    VALUES(500, '김개발', '001122-1223344', 'gae@naver.com', '01023456789', 'D1', 'J7', 'S3',
           3000000, 0.2, 200, SYSDATE, NULL, DEFAULT);
  • 아래와 같은 방법으로 여러 개의 행을 한 번에 INSERT하는 것도 가능하다.
    INSERT INTO EMP_01(
        SELECT EMP_ID, EMP_NAME, DEPT_TITLE
        FROM EMPLOYEE
             LEFT JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
    );

 

INSERT ALL

  • 여러 개의 테이블을 한 번에 삽입할 경우 사용한다.
  • 서브쿼리의 조건절이 같을 경우에는 아래와 같이 조건을 넣어 한 번에 삽입할 수 있으며, 이때 가져올 컬럼이 서로 달라도 가져올 컬럼들을 모두 SELECT하면 된다.
    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';
  • 서브쿼리의 조건절이 다를 경우에도 INSERT ALL을 사용하여 한 번에 삽입할 수 있으며, 해당 경우에는 WHEN을 이용해 각각 조건을 삽입해 준다.
    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

  • 테이블에 기록된 값을 수정하는 명령어로 행 개수가 변하지 않는다.
  • WHERE를 사용하여 조건을 설정하지 않는 경우 모든 행에 대한 UPDATE가 진행된다.
    UPDATE EMP_SALARY
    SET (SALARY, BONUS) = (SELECT SALARY, BONUS 
                           FROM EMP_SALARY
                           WHERE EMP_NAME = '김개발')
    WHERE EMP_NAME IN('박개발', '최개발', '정개발', '이개발');
  • UPDATE시 내가 지정한 데이터 크기보다 큰 값을 입력하거나, 제약 조건에 위배되는 값을 입력하면 수정되지 않는다. 따라서 제약 조건에 위배되는 값을 입력하지 않도록 주의해야 한다.

 

DELETE

  • 테이블에 있는 행을 삭제하는 명령어로 행의 개수가 줄어든다.
  • WHERE를 사용하여 조건을 설정하지 않는 경우 모든 행이 삭제된다.
    DELETE FROM EMPLOYEE
    WHERE EMP_NAME = '김개발';
  • FOREIGN KEY를 이용하여 참조되고 있는 값은 삭제가 불가능하지만 부득이하게 삭제해야 하는 경우 제약 조건을 활성화/비활성화 할 수 있다.
    -- SYS_C007699 제약조건 비활성화
    ALTER TABLE EMPLOYEE
    DISABLE CONSTRAINT SYS_C007699 CASCADE;
    
    -- SYS_C007699 제약조건 활성화
    ALTER TABLE EMPLOYEE
    ENABLE CONSTRAINT SYS_C007699;
  • TRANCATE: DELETE와 비슷하며, 테이블의 전체 행을 삭제한다. DELETE보다 수행 속도가 빠르지만 ROLLBACK을 통한 복구가 불가능하다. ROLLBACK할 데이터를 가지고 있지 않기 때문에 속도가 빠르다.
    TRUNCATE TABLE EMP_SALARY;