DB(SQL)
ORACLE / INSERT, INSERT ALL
이나피스
2022. 3. 27. 19:24
반응형
INSERT
테이블에 새로운 행을 추가하는 구문
INSERT INTO 테이블명 VALUES (값1,값2,값3,...);
해당 테이블에 모든컬럼에 대하여 추가할 값을 직접 제시하여 한 행에 INSERT할 때 사용
(컬럼의 순서, 자료형 개수에 맞춰 VALUES 괄호 안에 값을 나열해야함)
- 부족하게 값을 제시할 경우 : NOT ENOUGH VALUE 오류
- 값을 더 많이 제시할 경우 : TOO MANY VALUES 오류
--EMPLOYEE 테이블에 사원 정보 추가
INSERT INTO EMPLOYEE VALUES(999,'김구구','990909-3123323','kimgugu@naver.com',
'01099999999','D1','J7','S6',1999999,0.9,200,SYSDATE,NULL,DEFAULT);
INSERT INTO 테이블명 (컬럼명1,컬럼명2,컬럼명3) VALUES (값1,값2,값3);
해당 테이블에 특정 컬럼만 선택하여 추가할 값을 제시하고자 할 때 사용
선택되지 않은 컬럼은 기본값인 NULL이 입력
DEFAULT 설정이 되어 있을경우 DEFAULT 설정값이 입력(기본값 설정)
(단, NOT NULL 제약조건이 걸려있는 컬럼은 반드시 선택해서 직접 값을 넣어야 하며
단, DEFAULT 설정이 되어있다면 NOT NULL이라고 해도 선택하지 않아도 됨(DEFAULT값이 기본값이니까))
INSERT INTO EMPLOYEE(EMP_ID,EMP_NAME,EMP_NO,DEPT_CODE,JOB_CODE,SAL_LEVEL,HIRE_DATE)
VALUES(777,'김칠칠','770707-1777777','D1','J6','S5',SYSDATE);
INSERT INTO 테이블명 (서브쿼리);
VALUES()로 값을 직접 기입하는 것이 아닌 서브쿼리로 조회한 결과값을 통쨰로 INSERT하는 구문
즉, 여러행을 한번에 INSERT 할수 있다
--전체 사원들의 사번,이름,부서명을 조회한 결과를 EMP_01 테이블에 통째로 추가
--1) 조회
SELECT EMP_ID,EMP_NAME,DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE=DEPT_ID(+); --LEFT조인하여 DEPT_TITLE NULL값도 불러오기
--2) 조회결과 INSERT
INSERT INTO EMP_01(
SELECT EMP_ID,EMP_NAME,DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE=DEPT_ID(+)
);
--EMP_011 테이블을 만들고 컬럼은 사원명,직급명,보너스를 넣고 EMPLOYEE테이블에 있는 정보 넣기
--1) 조회
CREATE TABLE EMP_011
AS SELECT EMP_NAME,JOB_NAME,BONUS
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE=J.JOB_CODE
AND 1=0;
--2) 조회결과 INSERT
INSERT INTO EMP_011(
SELECT EMP_NAME,JOB_NAME,BONUS
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE=J.JOB_CODE
);
INSERT ALL
두개 이상의 테이블에 각각 INSERT할때 사용(서브쿼리가 동일해야함)
INSERT ALL
INTO 테이블명1 VALUES(컬럼명,컬럼명,..)
INTO 테이블명2 VALUES(컬럼명,컬럼명,..)
서브쿼리;
--새로운 테이블 만들기
--1)급여가 300만원 이상인 사원들의 사번,사원명,직급명,보관할 테이블
CREATE TABLE EMP_SALARY300_1
AS SELECT EMP_ID,EMP_NAME,JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE=J.JOB_CODE
AND 1=0; --틀만 가져오려고
--2)급여가 300만원 이상인 사원들의 사번,사원명,부서명,보관할 테이블
CREATE TABLE EMP_SALARY300_2
AS SELECT EMP_ID,EMP_NAME,DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE=DEPT_ID
AND 1=0;
INSERT ALL
INTO EMP_SALARY300_1 VALUES(EMP_ID,EMP_NAME,JOB_NAME)
INTO EMP_SALARY300_2 VALUES(EMP_ID,EMP_NAME,DEPT_TITLE)
SELECT *
FROM EMPLOYEE E, JOB J, DEPARTMENT D
WHERE E.JOB_CODE=J.JOB_CODE
AND DEPT_CODE=DEPT_ID
AND SALARY>=3000000;
INSERT ALL
WHEN 조건1 THEN
INTO 테이블명 VALUES (컬럼명, 컬럼명, ...)
WHEN 조건2 THEN
INTO 테이블명 VALUES (컬럼명, 컬럼명, ...)
서브쿼리;
--2010년도 기준으로 이전에 입사한 사원의 사번,사원명,입사일,급여를 담는 테이블 생성
CREATE TABLE EMP_OLD
AS SELECT EMP_ID,EMP_NAME,HIRE_DATE,SALARY
FROM EMPLOYEE
WHERE 0=1;
--2010년도 기준으로 이후에 입사한 사원의 사번,사원명,입사일,급여를 담는 테이블 생성
CREATE TABLE EMP_NEW
AS SELECT EMP_ID,EMP_NAME,HIRE_DATE,SALARY
FROM EMPLOYEE
WHERE 0=1;
--서브쿼리로 입력할 부분 2010년 이후, 이전
SELECT EMP_ID,EMP_NAME,HIRE_DATE,SALARY
FROM EMPLOYEE
WHERE HIRE_DATE<'2010/01/01'; --2010년도 이전 입사자
--WHERE HIRE_DATE>='2010/01/01'; --2010년도 이후 입사자
INSERT ALL
WHEN HIRE_DATE<'2010/01/01' THEN
INTO EMP_OLD VALUES(EMP_ID,EMP_NAME,HIRE_DATE,SALARY)
WHEN HIRE_DATE>='2010/01/01' THEN
INTO EMP_NEW VALUES(EMP_ID,EMP_NAME,HIRE_DATE,SALARY)
SELECT *
FROM EMPLOYEE;
반응형