반응형
250x250
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

Yeonee's Story

Oracle SQL - DML(DATA MANIPULATION LANGUAGE), INSERT INTO + VALUES/서브쿼리, INSERT ALL, INSERT ALL WHEN THEN 본문

Oracle SQL/Oracle SQL

Oracle SQL - DML(DATA MANIPULATION LANGUAGE), INSERT INTO + VALUES/서브쿼리, INSERT ALL, INSERT ALL WHEN THEN

yeonee 여니 2023. 6. 6. 02:03
728x90
반응형
SMALL

안녕하세요.

https://blog.naver.com/sysysy0302 여니입니다 :)

 

 

/*
    * DML (DATA MANIPULATION LANGUAGE)
    데이터 조작 언어
    
    테이블에 새로운 데이터를 삽입(INSERT)하거나
    기존의 데이터를 수정(UPDATE)하거나
    삭제(DELETE)하는 구문
*/
/*
    1. INSERT : 테이블에 새로운 "행"을 추가하는 구문
    
    [표현법]
    
    * INSERT INTO 계열
    
    1) INSERT INTO 테이블명 VALUES(값1,값2,값3,...);
    -> 해당 테이블에 존재하는 "모든" 컬럼에 대해 추가하고자하는 값을 내가 직접
    제시해서 "한 행"을 INSERT하고자할때 쓰는 표현법
    ** 주의사항 **
    1) 칼럼의 순서, 2)자료형, 3)갯수를 맞춰서 VALUES괄호 안에 값을 나열해야함
    - 부족하게 제시하면 : NOT ENOUGH VALUE 오류
    - 더 많이 제시하면 : TOO MANY VALUE 오류가 발생한다.
    
*/

INSERT INTO EMPLOYEE
VALUES(900, '김소연', '880218-1234567', 'THDUS@NAVER.COM', 0101234567888, 'D1', 'J7', 'S6', 1800000,
0.9, 200, SYSDATE,NULL,DEFAUL);

--VALUES(900, '김소연', '880218-1234567', 'THDUS@NAVER.COM', 01012345678, 'D1', 'J7', 'S6', 1800000,
--0.9, 200, SYSDATE,NULL);
--"not enough values"

--VALUES(900, '김소연', '880218-1234567', 'THDUS@NAVER.COM', 01012345678, 'D1', 'J7', 'S6', 1800000,
--0.9, 200, SYSDATE,NULL,DEFAULT,DEFAULT);
--"too many values"

SELECT * FROM EMPLOYEE;
----------------------------------------------------------------------------------------
/*
    2) INSERT INTO 테이블명(컬럼명1, 컬럼명2, 컬럼명3, ....)
    VALUES(값1,값2,값3,...)
    => 해당 테이블에 "특정" 컬럼만 선택해서 그 컬럼에 추가할 값만 제시하고자 할 때 사용
    
    - 그래도 한행단위로 추가되기 때문에 선택 안된칼럼은 NULL값이 들어감(단, DEFAULT설정이 되어있을 경우 그 값이 들어감)
    
    주의사항 : NOT NULL 제약조건이 걸려있는 컬럼은 반드시 선택해서 직접 값을 제시해야한다.
            단, DEFAULT설정이 되어 있다면 선택 안해도 된다.
*/

INSERT INTO EMPLOYEE(EMP_ID, EMP_NAME, EMP_NO, DEPT_CODE, JOB_CODE, SAL_LEVEL)
VALUES (901,'김소연2','123456-1234567','D1','J6','S5');

SELECT * FROM EMPLOYEE WHERE EMP_ID = 901;

/*
 3) INSERT INTO 테이블명 (서브쿼리);
 => VALUES()로 값을 직접 기입하는 것이 아니라
    서브쿼리로 조회한 결과값을 통째로 INSERT 하는 구문
    즉, 여러행을 한번에 INSERT 할수있다. ★의외로 많이사용됨
*/

-- 새로운 테이블 생성
CREATE TABLE EMP_01(
    EMP_ID NUMBER,
    EMP_NAME VARCHAR2(30),
    DEPT_TITLE VARCHAR2(20)
);

-- 전체 사원들의 사번, 이름, 부서명을 조회한 결과를 EMP_01 테이블에 통째로 추가
SELECT EMP_ID, EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
LEFT JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID;

-- 2) INSERT
INSERT INTO EMP_01(SELECT EMP_ID, EMP_NAME, DEPT_TITLE
                    FROM EMPLOYEE
                    LEFT JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID);

/*
    * INSERT ALL 계열
    두 개 이상의 테이블에 각각 INSERT 할 때 사용
    조건 : 그 때 사용되는 서브쿼리가 동일해야한다.
    
    1) INSERT ALL
        INTO 테이블명1 VALUES(컬럼명, 컬럼명, ...)
        INTO 테이블명2 VALUES(컬럼명, 컬럼명, ...)
             서브쿼리;
*/
-- 새로운 테이블을 먼저 만들기 
-- 첫번째 테이블 : 급여가 300만원 이상인 사원들의 사번, 사원명, 직급명을 보관할 테이블
-- 테이블명 : EMP_JOB / EMP_ID(NUMBER), EMP_NAME(VARCHAR2(30), JOB_NAME(VARCHAR(20))
CREATE TABLE EMP_JOB(
    EMP_ID NUMBER,
    EMP_NAME VARCHAR2(30),
    JOB_NAME VARCHAR2(20)
); 

-- 첫번째 테이블 : 급여가 300만원 이상인 사원들의 사버느 사원명, 부서명을 보관할 테이블
-- 테이블명 : EMP_DEPT / EMP_ID(NUMBER), EMP_NAME(VARCHAR2(30), DEPT_TITLE(VARCHAR2(20))
CREATE TABLE EMP_DEPT(
    EMP_ID NUMBER,
    EMP_NAME VARCHAR2(30),
    DEPT_TITLE VARCHAR2(20)
); 

-- 급여가 300만원 이상인 사원들의 사번, 이름, 직급명, 부서명 조회
SELECT EMP_ID, EMP_NAME, JOB_NAME, DEPT_TITLE
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE)
LEFT JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID
WHERE SALARY >= 3000000;

-- EMP_JOB 테이블에는 급여가 300만냥 이상인 사원들의 EMP_ID,EMP_NAME,JOB_NAME 삽입
-- EMP_DEPT 테이블에는 급여가 300만냥 이상인 사원들의 EMP_ID, EMP_NAME, DEPT_TITLE 삽입
INSERT ALL
INTO EMP_JOB VALUES(EMP_IN,EMP_NAME,JOB_NAME)
INTO EMP_DEPT VALUES(EMP_ID,EMP_NAME,DEPT_TITLE)
    SELECT EMP_ID, EMP_NAME, JOB_NAME, DEPT_TITLE
    FROM EMPLOYEE
    JOIN JOB USING(JOB_CODE)
    LEFT JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID
    WHERE SALARY >= 3000000;
    
SELECT * FROM EMP_JOB;
SELECT * FROM EMP_DEPT;

-----------------------------------------------------------------------------------
/*
    2) INSERT ALL
        WHEN 조건1 THEN
            INTO 테이블명1 VALUES(컬럼명, 컬럼명, ...)
        WHEN 조건2 THEN
            INTO 테이블명2 VALUES(칼럼명, 칼럼명, ....)
        서브쿼리
        
        -조건에 맞는 값들만 넣겠다.
*/

-- 조건을 사용해서 각 테이블에 값 INSERT
-- 새로운 테스트용 테이블 생성
-- 2010년도 기준으로 이전에 입사한 사원들의 사번, 사원명, 입사일, 급여를 담는 테이블 (EMP_OLD)
CREATE TABLE EMP_OLD
AS SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
    FROM EMPLOYEE
    WHERE 1 = 0;
    
-- 2010년도 기준으로 이후에(2010년 포함) 입사한 사원들의 사번, 사원명, 입사일, 급여를 담는 테이블 (EMP_NEW)
CREATE TABLE EMP_NEW
AS SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
    FROM EMPLOYEE
    WHERE 1 = 0;
    
-- 1) 서브쿼리 부분
-- 2010년 이전, 이후
SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
FROM EMPLOYEE
WHERE HIRE_DATE < '2010/01/01'; -- 15

SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
FROM EMPLOYEE
WHERE HIRE_DATE >= '2010/01/01'; -- 9

INSERT ALL
WHEN HIRE_DATE < '2010/01/01' THEN
    INTO EMP_OLD VALUES(EMP_ID, EMP_NAME, HIRE_DATE, SALARY) -- 15행
WHEN HIRE_DATE >= '2010/01/01' THEN
    INTO EMP_NEW VALUES(EMP_ID, EMP_NAME, HIRE_DATE, SALARY) -- 9행
    SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY FROM EMPLOYEE;
    
SELECT * FROM EMP_OLD;
SELECT * FROM EMP_NEW;

728x90
반응형
LIST