Chapter 10. DML (INSERT, UPDATE, DELETE)

DML(Data Manipulation Language)


  • Data의 삽입, 수정, 삭제, 조회 등의 동작을 제어/조작하기 위해 사용하는 언어
  • Data를 이용하려는 사용자와 시스템간의 인터페이스를 직접적으로 제공하는 언어
  • INSERT(데이터 생성), UPDATE(데이터 수정), DELETE(데이터 삭제), SELECT(데이터 조회)



INSERT


  • 새로운 행을 테이블에 추가하는 구문

  • 사용 구문

    • INSERT INTO 테이블명 VALUES (입력데이터1, 입력데이터2, ... );

    • INSERT INTO 테이블명 (컬럼명1,컬럼명2,...) VALUES (입력데이터1, 입력데이터2, ... );


  • EX)
INSERT INTO PRACTICE VALUES (1,'user11','1234','동대문','남');
  
INSERT INTO PRACTICE(USER_NO, USER_ID, USER_PW, USER_NICKNAME, USER_GENDER) VALUES (2,'user22','1234','남대문','여');
  

  • INSERT 시에 VALUES 대신 서브쿼리를 이용하여 데이터를 넣을 수 있다.
INSERT INTO PRACTICE(
    SELECT USER_NO, USER_ID, USER_PASSWORD, USER_NICKNAME, GENDER
    FROM MEMBER
);



INSERT ALL


  • 특정 대상이 되는 테이블의 데이터를 서브쿼리로 조회하여 두개 이상의 테이블에 데이터를 삽입할 수 있는 방식

  • EX)

-- 사번, 사원명, 매니저ID 저장하는 테이블
CREATE TABLE EMP_MANAGER AS
    SELECT EMP_ID, EMP_NAME, MANAGER_ID
    FROM EMPLOYEE
    WHERE 1=0;  -- 거짓으로 만들어서 테이블 구조만 가져오기

-- 사번, 이름, 부서코드, 부서명을 저장하는 테이블
CREATE TABLE EMP_DEPT_D2 AS
    SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
    FROM EMPLOYEE
    LEFT JOIN DEPARTMENT ON (DEPT_CODE=DEPT_ID)
    WHERE 1=0; -- 거짓으로 만들어서 테이블 구조만 가져오기

-- 부서코드가 D2 사원의 정보 추출하여 각 테이블에 정보 삽입
INSERT ALL
INTO EMP_MANAGER VALUES(EMP_ID, EMP_NAME, MANAGER_ID)
INTO EMP__DEPT_D2 VALUES(EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE)
(SELECT EMP_ID, EMP_NAME, MANAGER_ID, DEPT_CODE, DEPT_TITLE
 FROM EMPLOYEE
 LEFT JOIN DEPARTMENT ON (DEPT_CODE=DEPT_ID)
 WHERE DEPT_CODE='D2');

SELECT * FROM EMP_MANAGER;
SELECT *FROM EMP_DEPT_D2;



UPDATE


  • 테이블에 기록된 컬럼의 값을 수정하는 구문(테이블의 전체 행 개수에는 변화 X)
  • 사용 구문
    • UPDATE 테이블명 SET 컬럼 = '데이터' , 컬럼 = '데이터', ....
      [WHERE 조건]
  • 조건문을 작성하지 않게 되면, 모든 데이터의 수정이 이루어지게 되므로 조심해야 한다.

  • EX)
UPDATE PRACTICE SET USER_ID='user77' WHERE USER_NO =3;

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

  • EX)

UPDATE EMP_COPY SET
SALARY = (SELECT SALARY FROM EMPLOYEE WHERE EMP_ID=200),
BONUS = (SELECT BONUS FROM EMPLOYEE WHERE EMP_ID=200)
WHERE EMP_NAME ='유재식';



MERGE


  • 구조가 같은 두 개의 테이블을 하나의 테이블로 합치는 기능

  • 기준이될 테이블을 정하여 다른 테이블을 합치는 기능

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

  • EX)

-- ID 와 NAME을 가지고 있는 TABLE_A, TABLE_A 병합
MERGE INTO TABLE_A USING TABLE_B ON(TABLE_A.ID=TABLE_B.ID)
WHEN MATCHED THEN   			  -- ID가 같으면
UPDATE SET TABLE_A.NAME = TABLE_B.NAME    -- NAME을 UPDATE(수정)
WHEN NOT MATCHED THEN  			  -- 그렇지 않으면
INSERT VALUES(TABLE_B.ID, TABLE_B.NAME);  -- TABLE_B의 ID, NAME을 INSERT(추가)



DELETE


  • 테이블의 행을 삭제하는 구문(테이블의 행 개수 감소)

  • DELETE 시에 조건문을 사용하지 않게 되면 Table의 모든 데이터가 삭제된다.

  • 외래키 제약 조건이 설정 되어 있는 경우 참조되고 있는 값은 삭제 할 수 없다.

  • 사용 구문

    • DELETE FROM 테이블명
      [WHERE 조건]
  • EX)

DELETE FROM PRACTICE WHERE USER_NO=1;

  • 외래키(FOREIGN KEY) 제약 조건으로 컬럼 삭제가 불가능한 경우에 제약조건을 비활성화한 후 삭제 가능

  1. CONSTRAINT_NAME 확인하기
SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE,STATUS FROM USER_CONSTRAINTS
WHERE TABLE_NAME='테이블명';
  1. CONSTRAINT_NAME을 찾아서 제약조건을 비활성화
ALTER TABLE 테이블명 DISABLE CONSTRAINT [CONSTRAINT_NAME];
  1. 행 삭제
  2. 활성화 된 제약조건을 다시 활성화
    - 참조되는 테이블의 값과 참조하는 테이블의 값이 매칭되어 있어야한다.
ALTER TABLE 테이블명 ENABLE CONSTRAINT [CONSTRAINT_NAME];



TRUNCATE


  • 테이블을 초기화 (전체 행을 삭제)
  • DELETE 문보다 수행속도가 빠르지만, ROLLBACK을 통해 데이터 복구가 불가능
  • DELETE와 마찬가지로 FOREIGN KEY 제약조건일때 적용이 불가능
  • 사용 구문
    • TRUNCATE TABLE 테이블명;
  • 비교
구분정리
DELETETable의 데이터 삭제
Rollback을 통해서 Commit 전 시전까지 되돌릴 수 있다.
TRUNCATETable의 데이터 삭제(데이터 자체를 초기화)
Rollback을 하더라도 되돌릴 수 없다.
DROPTable 자체를 삭제
객체 삭제는 기본적으로 Rollback이 안된다.
(Rollback은 데이터에 대한 복구만 가능)



구분적용 시점
CREATE즉시 적용
DROP즉시 적용
INSERT즉시 적용 안됨
(COMMIT : 적용, ROLLBACK: 되돌리기)
UPDATE즉시 적용 안됨
(COMMIT : 적용, ROLLBACK: 되돌리기)
DELETE즉시 적용 안됨
(COMMIT : 적용, ROLLBACK: 되돌리기)

좋은 웹페이지 즐겨찾기