[Oracle] DML (Data Manipulation Language)

Dawon Ruby Choi·2023년 9월 22일

DML 정의

DML : 데이터 조작어,
테이블에 값을 삽입(INSERT)하거나 수정(UPDATE)하거나 삭제(DELETE)하는 구문

💡명령어 간단히 보기

SELECT
INSERT
UPDATE
DELETE

INSERT

: 데이터 삽입 > 테이블 행 개수 증가

INSERT 공식

INSERT INTO 테이블명 (컬럼명1, 컬럼명2, 컬럼명3, ...)
VALUES (값1, 값2, 값3, ....)

INSERT 사용법

1-1) 테이블 컬럼 구성/순서를 모두 아는 경우

INSERT INTO EMPLOYEE
VALUES(00, '강건강', '990311-1451201', 'kang_kk@kh.or.kr', '01011112222', 'D1', 'J7', 'S3', 4200000, 0.2, 200, SYSDATE, NULL, 'N');

1-2) 원하는 컬럼 구성만 데이터를 넣고 싶을 때

INSERT INTO EMPLOYEE (EMP_ID, EMP_NAME, EMP_NO, EMAIL, DEPT_CODE, JOB_CODE, SAL_LEVEL, SALARY)
VALUES (901, '남나눔' , '990312-1039842' , 'nam_nn@kh.or.kr', 'D2' , 'J6', 'S3' , 43000000);

1-3) 모든 데이터를 INSERT 하고 싶을 때 (SUBQUERY 사용)

INSERT INTO CONS_NAME (
    SELECT EMP_ID, EMP_NAME, EMP_NO
    FROM EMPLOYEE

INSERT ALL

: 여러개의 테이블에 동시에 데이터를 INSERT하기 위해 사용하는 구문

INSERT ALL 사용법

2-1) 테이블에 있는 컬럼과 데이터를 가져오고 싶을 때

INSERT INTO EMP_DEPT_D1 (
SELECT EMP_ID, EMP_NAME, DEPT_CODE, HIRE_DATE
FROM EMPLOYEE
WHERE DEPT_CODE = 'D1');

2-2) 컬럼 구성만 가져오고 싶을 때

CREATE TABLE EMP_DEPT_D1
AS SELECT EMP_ID, EMP_NAME, DEPT_CODE, HIRE_DATE
    FROM EMPLOYEE
    WHERE 1 = 0;
    -- 💡1=0;은 무조건 FALSE인 것을 이용

2-3) 조건절이 같은 경우

INSERT ALL
INTO EMP_DEPT_D1 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';
-- 💡두 테이블에 있는 부서코드가 D1인 직원을 조회하고 싶을 때 

2-4) 조건절이 다른 경우

INSERT ALL
WHEN HIRE_DATE < '2000/01/01'
    THEN INTO EMP_OLD VALUES (EMP_ID, EMP_NAME, HIRE_DATE, SALARY)
ELSE 
    INTO EMP_NEW VALUES (EMP_ID, EMP_NAME, HIRE_DATE, SALARY)
SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
FROM EMPLOYEE;
💡 WHEN ~ THEN~ ELSE~

UPDATE

: 데이터 수정 , 테이블 행 개수 변화 없음

UPDATE 공식

UPDATE 테이블명
SET 컬럼명 = 바꿀 값;
[WHERE 컬럼명 비교 연산자 비교값]

UPDATE 사용 예시

3-1) 특정 값 변경

UPDATE EMPLOYEE
SET HIRE_DATE = SYSDATE
WHERE EMP_NAME = '남나눔';

3-2) 특정 데이터를 다른 데이터와 동일하게 변경

EMPLOYEE_COPY 테이블의 노옹철, 전형돈, 정중하, 하동운 사원의 급여와 보너스를 유재식 사원과 같게 변경

UPDATE EMPLOYEE_COPY
SET (SALARY, BONUS) = (SELECT SALARY, BONUS
                        FROM EMPLOYEE_COPY
                        WHERE EMP_NAME = '유재식')
WHERE EMP_NAME IN ('노옹철', '전형돈', '정중하', '하동운');
SELECT EMP_NAME, SALARY, BONUS
FROM EMPLOYEE_COPY
WHERE EMP_NAME IN ('노옹철', '전형돈', '정중하', '하동운', '유재식');
COMMIT;
UPDATE EMPLOYEE_COPY
SET BONUS = 0.3
WHERE EMP_ID IN (SELECT EMP_ID
                    FROM EMPLOYEE_COPY
                    LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
                    JOIN LOCATION ON(LOCATION_ID = LOCAL_CODE)
                    WHERE LOCAL_NAME LIKE 'ASIA%');

SELECT EMP_ID, EMP_NAME, BONUS, LOCAL_NAME
FROM EMPLOYEE_COPY
    LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
    JOIN LOCATION ON(LOCATION_ID = LOCAL_CODE)
    WHERE LOCAL_NAME LIKE 'ASIA%';

3-3) 제약조건으로 오류 나는 경우

NOT NULL 제약조건

UPDATE EMPLOYEE
SET EMP_NAME = NULL
WHERE EMP_ID = 200;
💡EMP_NAME 은 NOT NULL임

UNIQUE 제약조건

UPDATE CONS_NAME
SET TEST_DATA2 = '강건강'
WHERE TEST_DATA1 = '207';
💡TEST_DATA1과 TEST_DATA2 둘 다 UNIQUE제약조건이 있음

DELETE

: 데이터 삭제 , 테이블 행 개수 감소

DELETE 공식

DELETE FROM (테이블/뷰/서브쿼리)
[WHERE 조건]
💡행을 지우는 것 이기 때문에 컬럼을 뽑을 필요X

-- EMPLOYEE 테이블에서 사원명이 강건강인 사람의 행 삭제
DELETE FROM EMPLOYEE
WHERE EMP_NAME = '강건강';

DELETE 사용 예시

3-1) 제약조건 비활성화

FOREIGN KEY 제약조건으로 삭제가 불가능 할 경우 사용

ALTER TABLE USER_FOREINGKEY
DISABLE CONSTRAINT SYS_C007456; -- USER_FOREINGKEY테이블 제약조건에 잇음
DELETE FROM USER_GRADE WHERE GRADE_CODE = 10;

3-2) 테이블 전체 행 삭제

⭐ROLLBACK 불가

DELETE FROM EMP_DEPT_D1;
SELECT * FROM EMP_dEPT_D1;
ROLLBACK;
profile
나의 코딩 다이어리🖥️👾✨

0개의 댓글