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

Yeonee's Story

Oracle SQL 요약정리 - DML(데이터 조작 언어), INSERT INTO + VALUES/서브쿼리, INSERT ALL, INSERT ALL WHEN THEN구문 본문

Oracle SQL/Oracle SQL 요약정리

Oracle SQL 요약정리 - DML(데이터 조작 언어), INSERT INTO + VALUES/서브쿼리, INSERT ALL, INSERT ALL WHEN THEN구문

yeonee 여니 2023. 6. 7. 21:51
728x90
반응형
SMALL

안녕하세요.
여니입니다 :)

 

* 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 오류가 발생한다.

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

- 괄호 안에 값이 하나라도 비면 "not enough values" 오류뜸
- 괄호 안에 값이 하나라도 많으면 "too many values" 오류뜸

 

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

ex)
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 할수있다. ★의외로 많이사용됨

ex)
-- 새로운 테이블 생성
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);
<조회가능>
SELECT * FROM EMP_01;

 

* INSERT ALL 계열
    두 개 이상의 테이블에 각각 INSERT 할 때 사용
    조건 : 그 때 사용되는 서브쿼리가 동일해야한다.
    
    1) INSERT ALL
        INTO 테이블명1 VALUES(컬럼명, 컬럼명, ...)
        INTO 테이블명2 VALUES(컬럼명, 컬럼명, ...)
             서브쿼리;

ex)
-- 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(칼럼명, 칼럼명, ....)
        서브쿼리;
        
        -조건에 맞는 값들만 넣겠다.

ex)
-- 조건을 사용해서 각 테이블에 값 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