본문 바로가기

개발/SQL

[SQL] Oracle - (DML) INSERT / UPDATE / DELETE

 

< DML (Data Manipulation Language) >

 

- 데이터 조작어

- 테이블에 새로운 데이터를 삽입(INSERT)하거나, 기존의 데이터를 수정(UPDATE)하거나,

  삭제(DELETE)하는 구문

 

 

< INSERT >

 

- 테이블에 행을 추가하는 구문

 

> 해당 테이블의 모든 컬럼에 값을 추가하고자 할 때

❗❗ 컬럼 순서대로 값을 입력해야 함!!

[ 표현법 ] INSERT INTO 테이블명 VALUES(값, 값, 값, ...);

 

> 해당 테이블 특정 컬럼만 선택해서 추가할 값만 제시하고자 할 때

- 선택하지 않은 컬럼은 NULL값이 기본으로 들어감

- 선택하지 않은 컬럼에 기본값(DEFAULT)이 지정되어 있으면 기본값이 들어감

❗❗ NOT NULL 제약조건이 걸려있는 컬럼은 반드시 값을 제시해야 함

[ 표현법 ] INSERT INTO 테이블명(컬럼명1, 컬럼명2, 컬럼명3, ...)

                VALUES (값1, 값2, 값3, ...);

 

> 서브쿼리로 조회한 결과값을 추가하고자 할 때

[ 표현법 ] INSERT INTO 테이블명 (서브쿼리);

 

 

< INSERT ALL >

 

- 두 개 이상의 테이블에 동일한 서브쿼리를 이용하여 각각 값을 넣을 때 사용

[ 표현법 ]

INSERT ALL

INTO 테이블명1 VALUES(컬럼명, 컬럼명, 컬럼명, ...)

INTO 테이블명2 VALUES(컬럼명, 컬럼명, 컬럼명, ...)

서브쿼리;

-- 새로운 테이블을 먼저 만들기
-- 테이블1
CREATE TABLE EMP_JOB(
    EMP_ID NUMBER,
    EMP_NAME VARCHAR2(30),
    JOB_NAME VARCHAR2(20)
);
-- 테이블2
CREATE TABLE EMP_DEPT(
    EMP_ID NUMBER,
    EMP_NAME VARCHAR2(30),
    DEPT_TITLE VARCHAR2(20)
);
-- 서브쿼리
-- 급여가 300만원 이상인 사원들의 사번, 이름, 부서명, 직급명 조회
SELECT EMP_ID, EMP_NAME, DEPT_TITLE, JOB_NAME
  FROM EMPLOYEE
  JOIN JOB USING(JOB_CODE)
  LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
 WHERE SALARY >= 3000000;
 
--> INSERT ALL
-- EMP_JOB테이블에는 급여가 300만원 이상인 사원들의 EMP_ID, EMP_NAME, JOB_NAME을 삽입
-- EMP_DEPT테이블에는 급여가 300만원 이상인 사원들의 EMP_ID, EMP_NAME, DEPT_TITLE을 삽입
INSERT ALL
  INTO EMP_JOB VALUES(EMP_ID, EMP_NAME, JOB_NAME)  -- 9개의 행을 추가
  INTO EMP_DEPT VALUES(EMP_ID, EMP_NAME, DEPT_TITLE) -- 9개의 행을 추가
SELECT EMP_ID, EMP_NAME, DEPT_TITLE, JOB_NAME
  FROM EMPLOYEE
  JOIN JOB USING(JOB_CODE)
  LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
 WHERE SALARY >= 3000000;

[ 표현법 ]

INSERT ALL

WHEN 조건1 THEN

            INTO 테이블명1 VALUES(컬럼명, 컬럼명, ...)

WHEN 조건2 THEN

            INTO 테이블명2 VALUES(컬렴명, 컬럼명, ...)

서브쿼리;

-- 사번, 사원명, 입사일, 급여 // EMP_OLD, EMP_NEW
-- 테이블1
CREATE TABLE EMP_OLD
    AS SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
         FROM EMPLOYEE
        WHERE 1 = 0; -- EMPLOYEE테이블에서 구조만 복사
-- 테이블2
CREATE TABLE EMP_NEW
    AS SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
         FROM EMPLOYEE
        WHERE 1 = 0; -- EMPLOYEE테이블에서 구조만 복사

-- 서브쿼리
SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
  FROM EMPLOYEE
-- WHERE HIRE_DATE < '2010/01/01';
WHERE HIRE_DATE >= '2010/01/01';
-- 두 개의 조건을 만족하는 쿼리로 각각 나누려면?

INSERT ALL
  WHEN HIRE_DATE < '2010/01/01' THEN -- 조건1 
  INTO EMP_OLD VALUES(EMP_ID, EMP_NAME, HIRE_DATE, SALARY) -- 테이블1
  WHEN HIRE_DATE >= '2010/01/01' THEN -- 조건2
  INTO EMP_NEW VALUES(EMP_ID, EMP_NAME, HIRE_DATE, SALARY) -- 테이블2
SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY -- 서브쿼리
  FROM EMPLOYEE; --25개의 행 추가

SELECT * FROM EMP_OLD; -- 9개의 행 추가
SELECT * FROM EMP_NEW; -- 16개의 행 추가

 

 

< UPDATE >

 

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

- WHERE 조건절 생략 가능. 생략 시 전체 모든 행의 데이터가 변경됨

❗❗ 값 수정 시에도 제약조건에 영향을 받음

 

[ 표현법 ]

UPDATE 테이블명

       SET 컬럼명 = 바꿀값

                , 컬럼명 = 바꿀값

                , 컬럼명 = 바꿀값

                , 컬럼명 = 바꿀값

 WEHER 조건;

 

> 서브쿼리로 조회한 결과값으로 수정하고자 할 때

[ 표현법 ]

UPDATE 테이블명

       SET 컬럼명 = (서브쿼리)

 WHERE 조건;

 

 

< DELETE >

 

- 테이블에 기록된 데이터를 삭제하는 구문

- WHERE 조건절 생략 가능. 생략 시 전체 행이 삭제됨

 

[ 표현법 ]

DELETE FROM 테이블명

WHERE 조건;

 

 

< TRUNCATE >

 

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

- DELETE 보다 수행속도가 더 빠름

- 별도의 조건 제시 불가. ROLLBACK 불가능.

 

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

TRUNCATE DELETE
 별도의 조건 제시 불가 특정 조건 제시 가능
(DELETE 보다) 수행속도 빠름 (TRUNCATE 보다) 수행속도 느림
ROLLBACK 불가 ROLLBACK 가능