DML(INSERT, UPDATE, DELETE)

MINIMI·2023년 1월 16일
0

ORACLE

목록 보기
6/11
post-thumbnail

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

7-1.INSERT

  • 새로운 행을 추가하는 구문
  • 테이블의 행 개수 증가

1) 표현식

  • 일부 컬럼에 INSERT 하는 경우
    • INSERT INTO 테이블명 (컬럼명, 컬럼명,..) VALUES(데이터, 데이터,...)
  • 테이블의 모든 컬럼에 INSERT 하는 경우
    • INSERT INTO 테이블명 VALUES(데이터, 데이터...)
    • 모든 컬럼에 INSERT 하는 경우에도 컬럼명을 기술 하는 것이 의미 파악에는 더 좋다.
INSERT
  INTO EMPLOYEE
 (
   EMP_ID, EMP_NAME, DEPT_CODE
 )
 VALUES
 (
   '900', '장채현', 'D1'
 );
-- INSERT시 서브쿼리 이용
INSERT
  INTO EMP_01
(
  EMP_ID,
  EMP_NAME,
  DEPT_TITLE
)
(
  SELECT
         EMP_ID
       , EMP_NAME
       , DEPT_TITLE
   FROM EMPLOYEE
   LEFT JOIN DEPARTMENT(DEPT_CODE = DEPT_ID)
);
  • INSERT ALL

    • INSERT시에 사용하는 서브 쿼리가 같은 경우 두 개 이상의 테이블에 INSERT ALL을 이용하여 한번에 데이터를 삽입 할 수 있다.
    • 단, 서브쿼리의 조건절이 같아야 한다.
    -- WHERE절에서 구조만 복사하고 데이터는 복사하고 싶지 않을 경우 FALSE인 경우를 만들어 쓴다.
    
    -- EMP_DEPT_01 테이블에서 부서 코드 D1인 직원 조회 후
    -- 사번, 이름, 소속 부서, 입사일을 삽입하고
    -- EMP_MANAGER 테이블에서 부서코드가 D1인 직원을 조회해서
    -- 사번, 이름, 관리자 사번을 삽입한다.
    CREATE TABLE EMP_DEPT_D1
    AS
    SELECT
           EMP_ID
         , EMP_NAME
         , DEPT_CODE
         , HIRE_DATE
     FROM EMPLOYEE
    WHERE 1 = 0;
    
    INSERT ALL
      INTO EMP_DEPT_D2
    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';
  • 조건 삽입
-- 입사일 기준으로 2000/01/01 전에 입사한 사원의 
-- 사번, 이름, 입사일, 급여를 조회하여 EMP_OLD 테이블에 삽입하고
-- 그 후에 입사한 사원은 EMP_NEW 테이블에 삽입
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;

7-2. UPDATE

  • 테이블에 기록 된 컬럼의 값을 수정하는 구문
  • 테이블 전체 행의 개수는 변함 없다

1) 표현식

  • UPDATE 테이블명 SET 컬럼명 = 바꿀값, 컬럼명 = 바꿀값...
    [WHERE 컬럼명 비교연산자 비교값]
  • 서브쿼리를 이용 할 수 있다
    • UPDATE 테이블명 SET 서브쿼리
    -- 방명수 사원의 월급과 보너스를
    -- 유재석 사원과 동일하게 수정
    UPDATE
           EMPLOYEE
       SET (SALARY, BONUS) = (SELECT
                                     SALARY
                                   , BONUS
                                FROM EMPLOYEE
                               WHERE EMP_NAME = '유재석'
                              )
    WHERE EMP_NAME = '방명수';
  • 변경 값은 해당 컬럼에 대한 제약 조건에 위배되지 않아야 함
    • DEPARTMENT 테이블의 DEPT_ID로 존재하지 않는 값으로 DEPT_CODE를 UPDATE 할 수 없다.

7-2. DELETE

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

1) 표현식

  • DELETE FROM 테이블명 WHERE 조건
    • 만약 WHERE절의 조건을 설정하지 않으면 모든 행이 삭제된다.

2)

  • FOREIGN KEY 제약 조건이 설정 되어 있는 경우 참조 되고 있는 값에 대해서는 삭제 불가
  • 기본 삭제 룰이 삭제 제한으로 설정 되어 있기 때문

3) TRUNCATE

  • 테이블의 전체 행 삭제
  • DELETE보다 수행 속도가 더 빠르고 ROLLBACK을 통해 복구 불가
  • TRUNCATE 테이블명;

4) MERGE

  • 구조가 같은 두 개의 테이블을 하나로 합치는 기능
  • 테이블에서 지정하는 조건의 값이 존재하면 UPDATE
  • 조건의 값이 없으면 INSERT를 수행
MERGE
 INTO EMP_M01 M1
USING EMP_M02 M2
   ON (M1.EMP_ID = M2.EMP_ID)
 WHEN MATCHED THEN
UPDATE
   SET M1.EMP_NAME = M2.EMP_NAME
     , M1.EMP_ID = M2.EMP_ID
  WHEN NOT MATCHED THEN
INSERT
(
  M1.EMP_NAME, M1.EMP_ID
)
VALUES
(
  M2.EMP_NAME, M2.EMP_ID
);
  • USERS_TABLES : 계정이 가지고 있는 테이블들 / DATA DICTIONARY

  • USER_CONSTRAINTS 데이터 타입에 따른 제약 조건

  • USER_CONS_COLUMNS 컬럼별 제약 조건 확인

profile
DREAM STARTER

0개의 댓글