본문 바로가기

Oracle

7. DML(INSERT, UPDATE, DELETE)

----

/*
    DQL (QUERY 데이터 질의 언어) : SELECT

    DML (MANIPULATION 데이터 조작 언어) : (SELECT), INSERT, UPDATE, DELETE
    DDL (DEFINITION 데이터 정의 언어) : CREATE, ALTER, DROP
    DCL (CONTROL 데이터 제어 언어) : GRANT, REVOKE (COMMIT, ROLLBACK)
    
    TCL (TRANSACTION 트랜젝션 제어 언어) : COMMIT, ROLLBACK


    DML
    : DATA MANIPULATOIN LANGUAGE
    : 데이터 조작 언어
    : 테이블에 값을 삽입(INSERT)
                    수정(UPDATE)
                    삭제(DELETE) 하는 구문
*/

/*
    1. INSERT
        테이블에 새로운 행을 추가하는 구문
        
        [표현식]
        1. INSERT INTO 테이블명 VALUES(값1, 값2..)
            테이블에 모든 컬럼에 대한 값을 직접 제시해서 한 행 INSERT 하고자 할 때 사용
            컬럼 순번을 지켜서 VALUES에 값을 나열해야됨
            
        부족하게 값을 제시했을 경우 => not enough values 오류!
        값을 더 많이 제시했을 경우 => too many values 오류
*/

INSERT INTO EMPLOYEE
VALUES(900, '차은우', '900101-1234567', 'cha_00@kh.or.kr', '01011112222',
        'D1', 'J7', 'S3', 4000000, 0.2, 200, SYSDATE, NULL, DEFAULT);

/*
    2. INSERT INTO 테이블명(컬럼명1, 컬럼명2..) VALUES(값1, 값2..)
        테이블에 내가 선택한 컬럼에 대한 값만 INSERT 할 때 사용
        선택이 안된 컬럼은 기본적으로는 NULL이 들어감
        => NOT NULL 제약조건이 걸려있는 컬럼은 반드시 선택해서 직접 값을 제시해야됨!!
        단, DEFAULT 값이 있는 경우는 NULL이 아닌 DEFAULT값 들어간다
*/

INSERT INTO EMPLOYEE(EMP_ID, EMP_NAME, EMP_NO, JOB_CODE, SAL_LEVEL, HIRE_DATE)
VALUES(901, '주지훈', '880202-1111111', 'J2', 'S2', SYSDATE);
-- ENT_YN은 디폴트 값으로 들어가 있음!!
-- 가독성 안 좋은 예시


INSERT 
    INTO EMPLOYEE
        (
              EMP_ID
            , EMP_NAME
            , EMP_NO
            , JOB_CODE
            , SAL_LEVEL
            , HIRE_DATE
        )
    VALUES
        (
               901
            , '주지훈'
            , '880202-1111111'
            , 'J2'
            , 'S2'
            , SYSDATE
        );

SELECT * FROM EMPLOYEE;

/*
    3. INSERT INTO 테이블명 (서브쿼리)
        VALUES로 값, 직접 명시하는 것 대신에
        서브쿼리로 조회된 결과 값을 통째로 INSERT 가능
        = (여러 행 INSERT 가능)
*/

CREATE TABLE EMP_01(
    EMP_ID NUMBER,
    EMP_NAME VARCHAR2(20),
    DEPT_TITLE VARCHAR2(20)    
);

SELECT * FROM EMP_01;
-- 전체 사원들의 사번, 이름, 부서명 조회
SELECT EMP_ID, EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
LEFT JOIN DEPARTMENT ON(DEPT_ID = DEPT_CODE);

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

SELECT * FROM EMP_01;

INSERT 
INTO EMP_01
    (
      EMP_ID
    , EMP_NAME
    , DEPT_TITLE
    ) 
VALUES
    (
    888,'피카츄','호박부서'
    );
    
CREATE TABLE EMP_02(
    EMP_ID NUMBER,
    EMP_NAME VARCHAR2(20),
    EMP_NO VARCHAR2(20),
    DEPT_CODE VARCHAR2(20),
    JOB_CODE VARCHAR2(20),
    LOCAL_NAME VARCHAR2(20)
);

DROP TABLE EMP_02;

INSERT INTO EMP_02(
SELECT EMP_ID, EMP_NAME, EMP_NO, DEPT_CODE, JOB_CODE, LOCAL_NAME
FROM EMPLOYEE
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
LEFT JOIN LOCATION ON (LOCAL_CODE = LOCATION_ID)
);

SELECT * FROM EMP_02;

/*
    [표현식]
    INSERT ALL
    INTO 테이블명1 VALUES(컬럼명, 컬럼명..)
    INTO 테이블명2 VALUES(컬럼명, 컬럼명..)
    서브쿼리;
*/

-- 테스트할 테이블 만들기
-- 구조만 베끼기
CREATE TABLE EMP_DEPT
AS SELECT EMP_ID, EMP_NAME, DEPT_CODE, HIRE_DATE
    FROM EMPLOYEE
    WHERE 1=0;
    
SELECT * FROM EMP_DEPT;

CREATE TABLE EMP_MANAGER
AS SELECT EMP_ID, EMP_NAME, MANAGER_ID
    FROM EMPLOYEE
    WHERE 1=0;
    
SELECT * FROM EMP_DEPT;
SELECT * FROM EMP_MANAGER;

-- 부서코드가 'D1'인 사원들의 사번, 이름, 부서코드 , 입사일, 사수사번 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE, HIRE_DATE, MANAGER_ID
FROM EMPLOYEE
WHERE DEPT_CODE = 'D1';

INSERT ALL
INTO EMP_DEPT VALUES(EMP_ID, EMP_NAME, DEPT_CODE, HIRE_DATE)
INTO EMP_MANAGER VALUES(EMP_ID, EMP_NAME, MANAGER_ID)
SELECT EMP_ID, EMP_NAME, DEPT_CODE, HIRE_DATE, MANAGER_ID
FROM EMPLOYEE
WHERE DEPT_CODE = 'D1';


'Oracle' 카테고리의 다른 글

9. DCL / TCL  (0) 2022.12.12
8. DDL(ALTER, DROP)  (0) 2022.12.09
6. DDL  (1) 2022.12.07
5. SUBQUERY  (0) 2022.12.06
4. Join  (1) 2022.12.01