hyeonga_code

Database_62_DML 응용_다중 INSERT, 조건 ALL INSERT, 조건 FIRST INSERT 본문

Oracle Database

Database_62_DML 응용_다중 INSERT, 조건 ALL INSERT, 조건 FIRST INSERT

hyeonga 2023. 8. 20. 05:59
반응형

-- Advanced DML

    -- 명시적 기본 기능 개요
        -- 열 기본값이 필요한 경우 DEFAULT 키워드를 열 값으로 사용할 수 있습니다.
        -- ANSI 표준을 준수합니다.
        -- 데이터에 기본값이 적용될 위치 및 시기를 제어할 수 있습니다.
        -- 명시적 기본값은 INSERT, UPDATE에 사용할 수 있습니다.
        -- 기본값이 존재하지 않는 경우 NULL 값이 사용됩니다.


-----< 인사 관리 >-----
    -- 실습 준비
-- 직원 테이블의 입사 날짜의 기본값을 현재 날짜로 지정합니다.
ALTER TABLE employees
MODIFY hire_date DEFAULT sysdate;
    /*
    Table EMPLOYEES이(가) 변경되었습니다.
    */
    
-- 부서 테이블의 매니저 아이디의 기본값을 101로 지정합니다.
ALTER TABLE departments
MODIFY manager_id DEFAULT 101;
    /*
    Table DEPARTMENTS이(가) 변경되었습니다.
    */
    
-- 부서 테이블의 정보를 조회합니다.
DESC departments;
    /*
    이름                        널?                유형           
    ---------------         --------            ------------------
    DEPARTMENT_ID       NOT NULL       NUMBER(4)    
    DEPARTMENT_NAME  NOT NULL       VARCHAR2(30) 
    MANAGER_ID                                NUMBER(6)    
    LOCATION_ID                                NUMBER(4)  
    */

-- DEFAULT 값을 지정한 컬럼과 지정하지 않은 컬럼에 DEFAULT 값으로 데이터를 삽입합니다.
INSERT INTO departments
VALUES (300, 'Engineering', DEFAULT, DEFAULT);
    /*
    1 행 이(가) 삽입되었습니다.
    */

-- 부서 테이블을 조회합니다.
SELECT * FROM departments;



-- 직원 정보를 조회합니다.
SELECT employee_id, last_name, hire_date FROM employees
WHERE employee_id=178;



-- 입사일을 DEFAULT 값으로 수정합니다.
UPDATE employees
SET hire_date=DEFAULT
WHERE employee_id=178;
    /*
    1 행 이(가) 업데이트되었습니다.
    */

-- 직원 정보를 조회합니다.
SELECT employee_id, last_name, hire_date FROM employees
WHERE employee_id=178;



-- 복구합니다.
ROLLBACK;
    /*
    롤백 완료.
    */

    -- 다중 테이블 INSERT
        -- INSERT - SELECT 문을 사용하여 여러 테이블에 행을 삽입할 수 있습니다.
        -- 데이터웨어하우징 시스템에 사용하면 운용 중인 하나 이상의 소스에서 대상 테이블 집합으로 데이터를 전송할 수 있습니다.
        /*
        INSERT { ALL | FIRST } 
                    -- ALL : 조건에 맞는 모든 행에 삽입합니다.
                    -- FIRST : 첫 번째 행에 무조건 삽입합니다.
                [ WHEN condition 1 THEN ] : ALL인 경우 생략하는 경우가 있습니다.
                into_clause values_clause
                [ WHEN condition 2 THEN ]
                [ into_clause values_clause ]
                ...
                [ ELSE into_clause values_clause ] : WHEN 절의 조건에 맞지 않을 경우 실행합니다.
        subquery : SELECT 문을 작성합니다.
            -- INTO 구문이 여러 번 나올 수 있습니다.
        */
        -- 조건 ALL INSERT
            -- 조건이 TRUE로 평가된 WHEN 절에 대해 INTO 절 리스트를 실행합니다.
                -- 서브 쿼리에서 선택된 행은 INTO 절의 여러 테이블로 삽입됩니다.
        -- 조건 FIRST INSERT
            --  INSERT 절에 FIRST를 지정하면 WHEN 절을 명령문에 나타난 순서대로 평가합니다.
            -- 첫번째 WHEN 절부터 차례대로 WHEN 절이 True로 평가되면 INTO 절을 실행하고 주어진 행에 대해 다음 WHEN 절들은 건너뜁니다.
            -- WHEN 절의 순서대로 평가되어 INSERT가 실행되므로 WHEN절의 순서가 중요할 수 있습니다.
            -- 동일한 행이 중복되지 않도록 삽입됩니다.            
            
            
-----< 인사 관리 >-----
-- 실습 준비
    -- 'cre_multitab.sql'
DROP TABLE emp_history PURGE;
DROP TABLE emp_sales PURGE;
DROP TABLE emp_90 PURGE;
DROP TABLE emp_default PURGE;
DROP TABLE sales_source_data PURGE;
DROP TABLE sales_info PURGE;
DROP SEQUENCE sales_info_seq;

--테이블 생성 
CREATE TABLE emp_history
AS
SELECT employee_id, hire_date, salary 
FROM employees
WHERE 1=2;
    /*
    Table EMP_HISTORY이(가) 생성되었습니다.
    */
    
CREATE TABLE emp_sales
AS
SELECT employee_id, commission_pct , salary 
FROM employees
WHERE 1=2;
    /*
    Table EMP_SALES이(가) 생성되었습니다.
    */
    
CREATE TABLE emp_90
AS
SELECT  employee_id, hire_date, salary
FROM employees
WHERE 1=2; 
    /*
    Table EMP_90이(가) 생성되었습니다.
    */
    
CREATE TABLE emp_default
AS
SELECT employee_id, job_id, department_id
FROM employees
WHERE 1=2;
    /*
    Table EMP_DEFAULT이(가) 생성되었습니다.
    */
    
CREATE TABLE sales_source_data
(employee_id  NUMBER(6),
WEEK_ID NUMBER(2),
SALES_MON NUMBER(8,2),
SALES_TUE NUMBER(8,2),
SALES_WED NUMBER(8,2),
SALES_THUR NUMBER(8,2),
SALES_FRI NUMBER(8,2));
    /*
    Table SALES_SOURCE_DATA이(가) 생성되었습니다.
    */

INSERT INTO sales_source_data VALUES
(178, 6, 1750,2200,1500,1500,3000);
    /*
    1 행 이(가) 삽입되었습니다.
    */
    
INSERT INTO sales_source_data
VALUES(144, 6, 3750,3300,4500,2500,1000);
    /*
    1 행 이(가) 삽입되었습니다.
    */

INSERT INTO sales_source_data
VALUES (178, 7, 2760,2100,1070,2500,2000);
    /*
    1 행 이(가) 삽입되었습니다.
    */
    
INSERT INTO sales_source_data
VALUES(144, 7, 2970, 0,1500,2800,1700);
    /*
    1 행 이(가) 삽입되었습니다.
    */
    
COMMIT;
    /*
    커밋 완료.
    */
    
CREATE TABLE sales_info
(sales_id NUMBER(6),
employee_id NUMBER(6),
week_id NUMBER(2),
sales_day CHAR(3),
sales NUMBER(8,2)
);
    /*
    Table SALES_INFO이(가) 생성되었습니다.
    */

-- 시퀀스를 생성합니다.
CREATE SEQUENCE sales_info_seq
START WITH 1
INCREMENT BY 1
NOCACHE
NOCYCLE;
    /*
    Sequence SALES_INFO_SEQ이(가) 생성되었습니다.
    */

-- 실습 준비 완
-----------------------

-- 삽입할 데이터를 조회합니다.
SELECT employee_id , hire_date , commission_pct, salary
FROM employees
WHERE employee_id BETWEEN 170 AND 200;


-- 테이블에 데이터를 삽입합니다.
INSERT ALL
INTO emp_history VALUES(employee_id, hire_date, salary)
INTO emp_sales VALUES(employee_id, commission_pct, salary)
SELECT employee_id , hire_date , commission_pct, salary
FROM employees
WHERE employee_id BETWEEN 170 AND 200;
    /*
    8개 행 이(가) 삽입되었습니다.
    */

-- EMP_HISTORY 테이블을 조회합니다.
SELECT * FROM emp_history;


   
-- EMP_SALES 테이블을 조회합니다. 
SELECT * FROM emp_sales;



-- 복구합니다.
ROLLBACK;
    /*
    롤백 완료.
    */

    -- ALL
INSERT ALL
    WHEN salary > 10000 THEN
        INTO emp_history VALUES(employee_id, hire_date, salary)
    WHEN commission_pct IS NOT NULL THEN
        INTO emp_sales VALUES(employee_id, commission_pct, salary)
SELECT employee_id, hire_date, commission_pct, salary
FROM employees
WHERE employee_id BETWEEN 170 AND 200;
    /*
    4개 행 이(가) 삽입되었습니다.
    */
    
--EMP_HISTORY 테이블을 조회합니다.
SELECT * FROM emp_history;


   
-- EMP_SALES 테이블을 조회합니다. 
SELECT * FROM emp_sales;


-- 복구합니다.
ROLLBACK;
    /*
    롤백 완료.
    */    
    
    
    -- FIRST
INSERT FIRST
    WHEN department_id=90 THEN
        INTO emp_90 
        VALUES (employee_id, hire_date, salary)
    WHEN salary > 10000 THEN
        INTO emp_history 
        VALUES(employee_id, hire_date, salary)
    WHEN commission_pct IS NOT NULL THEN
        INTO emp_sales 
        VALUES(employee_id, commission_pct, salary)
    ELSE 
        INTO emp_default 
        VALUES(employee_id, job_id, department_id)
SELECT employee_id, hire_date, salary, job_id, commission_pct, department_id
FROM employees;
    /*
    23개 행 이(가) 삽입되었습니다.
    */

-- EMP_90 테이블을 조회합니다.
SELECT * FROM emp_90;



-- EMP_SALES 테이블을 조회합니다. 
SELECT * FROM emp_sales;


    
-- EMP_DEFAULT 테이블을 조회합니다.
SELECT * FROM emp_default;


   
--EMP_HISTORY 테이블을 조회합니다.
SELECT * FROM emp_history;


-- 복구합니다.
ROLLBACK;
    /*
    롤백 완료.
    */    

반응형

'Oracle Database' 카테고리의 다른 글

Database_64_DML 응용_MERGE UPSERT  (0) 2023.08.20
Database_63_DML 응용_PIVOTING INSERT  (0) 2023.08.20
Database_61_SQL 활용 실습 8  (0) 2023.08.19
Database_61_SQL 활용 실습 7  (0) 2023.08.19
Database_61_SQL 활용 실습 6  (0) 2023.08.19