hyeonga_code

Database_45_데이터 조작과 트랜잭션_DML 데이터 조작어 본문

Oracle Database

Database_45_데이터 조작과 트랜잭션_DML 데이터 조작어

hyeonga 2023. 8. 3. 06:59
반응형

-- DML_Data Management Language 데이터 조작어
    -- INSERT
        /*
        INSERT INTO table [ (column, ... )]
        VALUES (value, ...);
        */
        -- 테이블에 데이터를 추가합니다.
        -- 한 번에 한 행만 추가할 수 있습니다.
        -- 각 열에 대한 값을 포함하는 새 행을 삽입합니다.
        -- 테이블 열의 기본 순서대로 값을 작성해야 합니다.
        -- INSERT 절에 열을 직접 나열할 수 있습니다.
        -- 테이블 생성시 선언한 순서대로 데이터를 삽입하는 경우 컬럼 이름을 생략할 수 있습니다.
        -- 문자 및 날짜 값은 작은 따옴표로 묶어 작성합니다.
        
-- 1)
INSERT INTO departments(department_id, department_name, 
manager_id, location_id)
VALUES (70, 'Public Relations', 100, 1700);

-- 2) 테이블 생성시 선언한 순서대로 데이터를 삽입하는 경우 컬럼 이름을 생략할 수 있습니다.
INSERT INTO departments
VALUES (70, 'Public Relations', 100, 1700);
    /*
    1 행 이(가) 삽입되었습니다.
    */

SELECT * FROM departments;
    /*
    DP_ID   DEPARTMENT_NAME     M_ID     LO_ID        
    ---------------------------------------------------------------------
       10         Administration                200           1700
       20         Marketing                      201           1800
       50         Shipping                       124            1500
       60         IT                                  103            1400
       80         Sales                            149             2500
       90         Executive                     100             1700
     110        Accounting                    205             1700
     190        Contracting                  ( null )          1700
       70         Public Relations           100             1700
        -- 데이터가 삽입되는 순서는 무작위입니다.
        -- 트랜잭션이 끝난 상태는 아닙니다.
        -- 새 sqldeveloper를 실행하여 조회하면 70번 데이터는 출력되지 않습니다.
            -- 진행 중인 트랜잭션은 공유되지 않습니다.
            -- 동시성을 제어합니다.
    */


    
        -- 널 값을 가지는 행 삽입
            -- 암시적_Implicit : 열 목록에서 해당 열을 생략합니다.
            -- 명시적_Explicit : VALUES 절에서 NULL 키워드를 지정합니다.

        -- 암시적
INSERT INTO departments (department_id, department_name)
VALUES (30, 'Purchasing'); 
INSERT INTO departments (department_id, department_name, location_id)
VALUES (40, 'Human Resource', 2500);
SELECT * FROM departments;
 

    /*
    DP_ID    DP_NAME                 M_ID         LO_ID        
    --------------------------------------------------------------------
    30         Purchasing                   ( null )          ( null )   
    40         Human Resource         ( null )           2500
    */    

        -- 명시적
INSERT INTO departments
VALUES (100, 'Finance', NULL, NULL);     
SELECT * FROM departments;
  
    /*
    DP_ID    DP_NAME                M_ID         LO_ID        
    --------------------------------------------------------------------

    100     Finance                   ( null )             ( null )      
    */    

-- 특정 값 삽입
    -- SYSDATE 함수
        -- 현재 날짜 및 시간을 기록합니다.
INSERT INTO employees 
VALUES(113, '수현', '김', 'KSH', '02.1234.5678', SYSDATE, 'AC_ACCOUNT', 6900, NULL, 205, 100);
    /*
    1 행 이(가) 삽입되었습니다.
    */
    
SELECT first_name, last_name, hire_date FROM employees;
        /*
        FIRST_NAME   LAST_NAME  HIRE_DATE        
        ----------------------------------------------------------
        수현                 김                 23/07/06
        ...
        */   



    -- TO_DATE 함수
        -- 날짜를 기본 형식이 아닌 다른 형식으로 입력하고 싶은 경우 사용합니다.
INSERT  INTO employees
VALUES (114, 'Den', 'Raphealy', 'DRAPHEAL', '515.127.4561', TO_DATE('02 03 1999', 'MM DD YYYY'), 'AC_ACCOUNT', 11000, NULL, 100, 10);

        -- 고려사항
            -- 연도를 YY 형식 사용 시, 세기의 기본값으로 현재 세기를 사용합니다.
INSERT INTO employees
VALUES(214, 'Mark', 'Kim', 'MKIM', '234.3456.6789', TO_DATE('05-11-99', 'DD-MM-YY'), 'AC_ACCOUNT', 11000, NULL, 100, 10);

            -- 이전 세기를 다루고자 하는 경우 RR형식을 사용합니다.
INSERT INTO employees
VALUES (215, 'Jason', 'Lee', 'JLEE', '513.723.4590', TO_DATE('05-11-99', 'DD-MM-RR'), 'AC_ACCOUNT', 11000, NULL, 100, 80);

SELECT *
FROM employees
where employee_id IN (114, 214, 215);
    /*
    EM_ID      L_N            HIRE_DATE 
    -----------------------------------------------------
    114        Raphealy       99/02/03     

    214        Kim               99/11/05  
    215        Lee               99/11/05    
    */




    -- 트랜잭션을 적용하고 완료합니다.
        -- 본인은 확인하기 어렵습니다.
        -- 다른 창에서 확인하면 보이지 않던 70 번 데이터를 확인할 수 있습니다.
COMMIT;

    -- 트랜잭션을 취소하고 종료합니다.
       -- 세 개의 데이터를 삽입했던 다른 창에서 취소하고 종료합니다.
       -- 본인도 작업했던 데이터를 확인할 수 없습니다.
       -- 가장 최근의 COMMIT 상태로 데이터를 복구합니다.
ROLLBACK;



/*
SELECT employee_id, last_name, salary, commission_pct, job_id, department_id
FROM employees
WHERE 1=2;
    -- 데이터가 없는 빈 테이블이 출력됩니다.
*/



-- 다른 테이블에서 행 복사
CREATE TABLE sales_reps(id, name, salary, comm, job_id, department_id)
AS
SELECT employee_id, last_name, salary, commission_pct, job_id, department_id
FROM employees
WHERE 1=2;
    /*
    Table SALES_REPS이(가) 생성되었습니다.
        -- 다른 창에서 실행하는 경우, 따로 COMMIT하지 않았으나 삽입한 데이터를 확인할 수 있습니다.
        -- 동일한 트랜잭션에서 DML 작성 중에 DDL 구문을 실행하는 경우 자동으로 COMMIT하는 기능이 있습니다.
        -- 순서대로 커밋이 되기 때문에 이전에 실행한 DML 구문들도 모두 COMMIT됩니다.
    */

    -- 두 번째 창에서 데이터 추가
        -- INSERT 절의 열 수와 서브쿼리 열 수를 일치시킵니다.
        -- SELECT 를 사용하여 서브쿼리를 INSERT 문에 사용하여 기존 테이블에서 파생되는 값을 포함하는 행을 추가할 수 있습니다.
SELECT employee_id, last_name, salary, commission_pct, job_id, department_id
FROM employees
WHERE job_id LIKE '%REP%';
    /*
    EM_ID       LAST_NAME  SALARY  COM_PCT     JOB_ID     DP_ID       
    -----------------------------------------------------------------------------------------------
    174            Abel                11000            0.3           SA_REP         80
    176           Taylor                8600            0.2           SA_REP         80
    178           Grant                7000             0.15         SA_REP        ( null )
    202           Fay                   6000            ( null )       MK_REP         20
    */



    

반응형