hyeonga_code
Database_62_DML 응용_다중 INSERT, 조건 ALL INSERT, 조건 FIRST INSERT 본문
Database_62_DML 응용_다중 INSERT, 조건 ALL INSERT, 조건 FIRST INSERT
hyeonga 2023. 8. 20. 05:59![](https://blog.kakaocdn.net/dn/By3dj/btsrxMtBALb/JJhnLURWesamKkjWtEP09K/img.jpg)
-- 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;
![](https://blog.kakaocdn.net/dn/cb9R0T/btsrqEXuUbD/IBEGZkSWPup8CsZCScuYu0/img.png)
-- 직원 정보를 조회합니다.
SELECT employee_id, last_name, hire_date FROM employees
WHERE employee_id=178;
![](https://blog.kakaocdn.net/dn/bJ40VK/btsrh1F4Gyc/R00GdaZnumpbQh9QsNv6l1/img.png)
-- 입사일을 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;
![](https://blog.kakaocdn.net/dn/k7ZYy/btsrgPsjtvY/HokqKN2mEUKFjbooKzCpv0/img.png)
-- 복구합니다.
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;
![](https://blog.kakaocdn.net/dn/bIfGOs/btsrkRiRJv4/bp0Egr8JJrsY9PRkrIkKBk/img.png)
-- 테이블에 데이터를 삽입합니다.
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;
![](https://blog.kakaocdn.net/dn/eklc1Z/btsrqywgNt8/sHibekuUMcGGYhyLOUF0PK/img.png)
-- EMP_SALES 테이블을 조회합니다.
SELECT * FROM emp_sales;
![](https://blog.kakaocdn.net/dn/moMfX/btsrqz21TTD/8KfTfhU3B9fDZkl8AZJUgk/img.png)
-- 복구합니다.
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;
![](https://blog.kakaocdn.net/dn/uHsSO/btsro9cuuzK/kPMK2FAEbB0WeKLaZqoul1/img.png)
-- EMP_SALES 테이블을 조회합니다.
SELECT * FROM emp_sales;
![](https://blog.kakaocdn.net/dn/pyfSX/btsrqGnujQH/ycEWHVx7roFC2gXIzD8VS1/img.png)
-- 복구합니다.
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;
![](https://blog.kakaocdn.net/dn/k81pC/btsrtfim0nr/1qUVjzVKC9W6ZjbWHB0Q4k/img.png)
-- EMP_SALES 테이블을 조회합니다.
SELECT * FROM emp_sales;
![](https://blog.kakaocdn.net/dn/Zy2Mw/btsrrSVmfGg/6uXdtM4DgKwafaQTkb0dFk/img.png)
-- EMP_DEFAULT 테이블을 조회합니다.
SELECT * FROM emp_default;
![](https://blog.kakaocdn.net/dn/cDQvwZ/btsrgu9N6MI/39VYdQ9P8vACeP597uqvGk/img.png)
--EMP_HISTORY 테이블을 조회합니다.
SELECT * FROM emp_history;
![](https://blog.kakaocdn.net/dn/xum8t/btsrgs5fJ4J/k0iF6QF0lWpd3b1zUdprD1/img.png)
-- 복구합니다.
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 |