프로그래밍/SQL_Oracle

07_OracleDB SQL : DML (INSERT, DELETE, UPDATE, SELECT)

pupu91 2022. 7. 20. 11:52
반응형

DML (Data Manipulation Language)

 

데이터 조작 언어

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

INSERT, UPDATE, DELETE, SELECT

 

 


 

1 . 다양한 INSERT 방법

  • 서브쿼리 이용, INSERT ALL 이용, 조건이 있을 경우
1. VALUES 대신 서브 쿼리를 이용

CREATE TABLE EMP_01(
   EMP_ID NUMBER,
   EMP_NAME VARCHAR2(30)
 , DEPT_TITLE VARCHAR2(20)
 );
 
 INSERT
   INTO EMP_01
 (
    EMP_ID
  , EMP_NAME
  , DEPT_TITLE
 )
 (
    SELECT
           EMP_ID
         , EMP_NAME
         , DEPT_TITLE
     FROM EMPLOYEE
     LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
  );   


2. INSERT ALL : INSER시에 사용하는 서브쿼리가 같은 경우 두 개 이상의 테이블에
                INSERT ALL을 이용하여 한 번에 데이터를 삽입할 수 있음
                단, 서브쿼리의 조건절이 같아야 함.

테이블 1
CREATE TABLE EMP_DEPT_D1
AS
SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , HIRE_DATE
  FROM EMPLOYEE
 WHERE 1 = 0; --컬럼이름과 데이터 타입은 가져오고 행은 가져오지 않기 위해서 
 
 테이블2
 CREATE TABLE EMP_MANAGER
 AS
 SELECT
        EMP_ID
      , EMP_NAME
      , MANAGER_ID
  FROM EMPLOYEE
 WHERE 1 = 0; 
 
EMP_DEPT_D1 테이블에 EMPLOYEE 테이블에 있는 부서 코드가 D1인 직원을 조회해서
사번, 이름, 소속부서, 입사일을 삽입하고
EMP_MANAGER 테이블에 EMPLOYEE 테이블에 있는 부서 코드가 D1인 직원을 조회해서
사번, 이름, 관리자 사번을 삽입해보자.

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'; 
 
3. 조건이 있을 경우 
 INSERT ALL 
   WHEN 조건
   THEN
   INTO
 VALUES 로 작성

 

 

 

 

2 . UPDATE 

 

  • 테이블에 기록 된 컬럼의 값을 수정하는 구문, 테이블의 전체 행 갯수는 변화 없음 / UPDATE 또한 제약 조건에 위배되 지 않아야 함.

UPDATE 테이블명
   SET 컬럼명 = 바꿀값
     , 컬럼명 = 바꿀값
WHERE 컬럼명 비교연산자 비교값;    

(1) 업데이트 할 테이블
 CREATE TABLE DEPT_COPY
 AS
 SELECT D.*
   FROM DEPARTMENT D;

(2) 업데이트
 UPDATE
        DEPT_COPY
    SET DEPT_TITLE = '전략기획팀' 
  WHERE DEPT_ID = 'D9';

 

 

 

 

  • UPDATE시에도 서브쿼리를 사용할 수 있음
UPDATE 테이블명
   SET 컬러명 = (서브쿼리)
   
 
 CREATE TABLE EMP_SALARY
 AS
 SELECT
        EMP_ID
      , EMP_NAME
      , DEPT_CODE
      , SALARY
      , BONUS
  FROM EMPLOYEE;   
  
 유재식 사원과 방명수 사원의 급여와 보너스율을 동일하게 변경하여 업데이트 하기.  
   UPDATE
         EMP_SALARY
     SET SALARY = (SELECT
                          SALARY
                      FROM EMP_SALARY
                     WHERE EMP_NAME = '유재식'
                     )
     , BONUS =  (SELECT
                          BONUS
                      FROM EMP_SALARY
                     WHERE EMP_NAME = '유재식'
 WHERE EMP_NAME = '방명수';
 

다중열 서버쿼리로도 가능함.
 UPDATE
         EMP_SALARY
     SET (SALARY, BONUS) = (SELECT
                                   SALARY
                                  , BONUS
                               FROM EMP_SALARY
                               WHERE EMP_NAME = '유재식'
                               )
     
 WHERE EMP_NAME = '방명수';
 
 
 
 예제) EMP_SALARY 테이블에서 아시아 근무 지역에 근무하는 직원의 보너스를 0.5로 변경하는
      UPDATE 구문을 작성하세요.WHERE에서 다중행 서브쿼리를 사용하며 조건을 알아올 때는
      EMPLOYEE, DEPARTMENT, LOCATION 테이블을 그대로 사용합니다.
      
UPDATE
         EMP_SALARY ES
     SET ES.BONUS = 0.5
  WHERE ES.EMP_ID IN (SELECT E1.EMP_ID
       (↑PRIMARY KEY)   FROM EMPLOYEE E1
                        JOIN DEPARTMENT D1 ON (E1.DEPT_CODE = D1.DEPT_ID) LOCATTION_ID와 LOCAL_CODE를 연결하기 위해서 DEPARTMENT사용
                        JOIN LOCATION L1 ON (D1.LOCATION_ID = L1.LOCAL_CODE)
                       WHERE L1.LOCAL_NAME LIKE 'ASIA%'
                       );

 

 

 

 

3 . DELETE

  • 테이블의 행을 삭제하는 구문. 테이블의 행의 갯수가 줄어듬.
  • 기본 삭제룰이 삭제 제한으로 설정되어 있기 때문에 FOREIGN KEY 제약조건이 설정 되어 있는 경우 참조 되고 있는 값에 대해서는 삭제할 수 없음.
  • FK 제약 조건이 설정되어 있어도 참조되고 있지 않은 값에 대해서는 삭제할 수 있음
DELETE 
FROM 테이블명
WHERE 조건설정
=> WHERE 조건을 설정하지 않으면 모든 행이 다 삭제됨.

 

참고 )

TRUNCATE : 테이블의 전체 행을 삭제할 시 사용함.

DELETE보다 수행 속도가 더 빠르지만 DDL이기 때문에 ROLLBACK을 통해 복구할 수 없음

 

 

 

4. MERGE

  • 구조가 같은 두 개의 테이블을 하나로 합치는 기능
  • 테이블에서 지정하는 조건의 값이 존재하면 UPDATE
  • 조건의 값이 없으면 INSERT됨
반응형