DB

DB (7) DML(INSERT, UPDATE, DELETE)

동동이임 2023. 6. 10. 21:13

▶ INSERT

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

■ INSERT INTO 계열

1)

INSERT INTO 테이블명 VALUES(값1, 값2, 값3, ...);

- 해당 테이블에 존재하는 "모든" 컬럼에 대해 추가하고자하는 값을 내가 직접 제시해서 "한 행"을 INSERT하고자할 때 쓰는 표현법

 

주의사항

  • 컬럼의 순서, 자료형, 개수를 맞춰서 VALUES 괄호 안에 값을 나열해야 한다.
  • 부족하게 제시하면 NOT ENOUGH VALUE 오류가 발생한다.
  • 더 많이 제시하면 TOO MANY VALUE 오류가 발생한다.

ex)

INSERT INTO EMPLOYEE 
VALUES (900, '홍길동', '123456-1234567', 'AABBCC@naver.com', 01012345678, 'D1', 'J7', 'S6', 1800000, 0.9, 200, SYSDATE, NULL, DEFAULT);

 

2)

INSERT INTO 테이블명(컬럼명1, 컬럼명2, 컬럼명3, ...)
VALUES(값1, 값2, 값3, ...);

- 해당 테이블에 "특정"컬럼만 선택해서 그 컬럼에 추가할 값만 제시하고자할 때 사용한다.

- 한 행 단위로 추가되기 때문에 선택안된 컬럼은 NULL값이 들어간다.(단, DEFAULT설정이 되어있을 경우 그 값이 들어간다.)

 

주의사항

  • NOT NULL 제약조건이 걸려있는 컬럼은 반드시 선택해서 직접 값을 제시해야한다.
  • 단, DEFAULT설정이 되어있다면 선택은 안해도 된다.

ex)

INSERT INTO EMPLOYEE(EMP_ID, EMP_NAME, EMP_NO, DEPT_CODE, JOB_CODE, SAL_LEVEL)
VALUES (901, '이순신', '123456-1234567', 'D1', 'J6', 'S5');

 

3)

INSERT INTO 테이블명 (서브쿼리);

- VALUES()로 값을 직접 기입하는 것이 아니라 서브쿼리로 조회한 결과값을 통째로 INSERT하는 구문
- 즉, 여러행을 한번에 INSERT 할 수 있다.

ex)

-- 전체 사원들의 사번, 이름, 부서명을 조회한 결과를 EMP_01 테이블에 통째로 추가
INSERT INTO EMP_01(
    SELECT EMP_ID, EMP_NAME, DEPT_TITLE
    FROM EMPLOYEE
    LEFT JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID
);

 

■ INSERT INTO 계열

- 두 개 이상의 테이블에 각각 INSERT 할 때 사용한다.
- 조건 : 그 때 사용되는 서브쿼리가 동일해야 한다.

1)

INSERT ALL
INTO 테이블명1 VALUES(컬럼명, 컬럼명, ...)
INTO 테이블명2 VALUES(컬럼명, 컬럼명, ...)
서브쿼리;

 

2)

INSERT ALL
WHEN 조건1 THEN
    INTO 테이블명1 VALUES(컬럼명, 컬럼명, ...)
WHEN 조건2 THEN
    INTO 테이블명2 VALUES(컬럼명, 컬럼명, ...)
서브쿼리;

- 조건에 맞는 값들만 넣을 때 사용한다.

 

▶ UPDATE

- 테이블에 기록된 기존의 데이터를 수정하는 구문이다.

[표현법]
UPDATE 테이블명
SET 컬럼명 = 바꿀값,
        컬럼명 = 바꿀값,
        ...            
WHERE 조건; -- WHERE절은 생략이 가능한데 생략시 모든 테이블의 모든 행이 바뀌게 된다.

- 여러개의 컬럼값을 동시변경 가능하고 이때 AND가 아니라 , 로 나열한다.

- WHERE절은 생략이 가능한데 생략시 모든 테이블의 모든 행이 바뀌게 된다.

 

■ ROLLBACK

- 변경사항에 대해서 되돌리는 명령어

- 롤백시 마지막 커밋시점으로 돌아간다.

 

▶ UPDATE시 서브쿼리 사용

- 서브쿼리를 수행한 결과값으로 기존의 값으로부터 변경할 때 사용한다.

- CREATE시에 서브쿼리 사용시 : 서브쿼리 수행한 결과로 테이블을 만들겠다.
- INSERT시에 서브쿼리 사용시 : 서브쿼리 수행한 결과를 해당 테이블에 새롭게 삽입하겠다.

[표현법]
UPDATE 테이블명
SET 컬럼명 = (서브쿼리)
WHERE 조건;

 

▶ DELETE

- 테이블에 기록된 데이터를 "행"단위로 삭제하는 구문

[표현법]
DELETE FROM 테이블명
WHERE 조건;

- WHERE절 생략 가능하다. 단, 생략시 해당 테이블의 모든 행이 삭제된다.

ex)

-- DEPARTMENT테이블로부터 DEPT_ID가 D1인 부서를 삭제
DELETE FROM DEPARTMENT
WHERE DEPT_ID = 'D1';

 

TRUNCATE

- 테이블의 전체 행을 다 삭제할 때 사용하는 구문

- DELETE 구문보다 수행속도가 훨씬 빠르다.
- 별도의 조건을 제시할 수 없다.
- ROLLBACK이 불가능하다.(신중하게 삭제해야 한다.)

[표현법]
TRUNCATE TABLE 테이블명;

● DELETE 구문과 비교

TRUNCATE TABLE 테이블명;    DELETE FROM 테이블명;
별도의 조건제시 불가(WHERE 안됨) 특정조건 제시 가능(WHERE 가능)
수행속도가 빠르다. 수행속도가 느리다.
ROLLBACK 불가능 ROLLBACK 가능