[Oracle]DML(INSERT, DELETE, UPDATE)

주재완·2024년 2월 29일
0

[Old] Oracle

목록 보기
8/10
post-thumbnail

우선 명령어의 종류는 아래와 같습니다.

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

여기서 DML에 대해 알아보는 파트입니다.

DML

데이터 조작 언어로 테이블 값을 삽입(INSERT)하거나, 수정(UPDATE)하거나, 삭제(DELETE)하는 구문입니다.

INSERT

테이블에 새로운 행을 추가하는 구문으로 여러가지 방식을 사용합니다.

첫번째 방식

INSERT INTO 테이블명 VALUES(,,....)

이 때, 테이블의 모든 컬럼에 대한 값을 직접 제시해서 한 행을 INSERT하고자 할 때 컬럼의 순번을 지켜서 VALUE에 값을 나열해야합니다.

또한 부족하게 값을 제시할 경우 not enough values 오류가 발생하고,
값을 더 많이 제시한 경우 too many values 오류가 발생합니다.

SELECT * FROM EMPLOYEE;
INSERT INTO EMPLOYEE VALUES(900, '이소근', '880914-1456789', 'SG8809@naver.com', '01075966990', 'D7', 'J5', 4000000, 0.2, 200, SYSDATE, NULL, 'N');

두번째 방식

INSERT INTO 테이블명(컬럼, 컬럼, 컬럼) VALUES(,,)

테이블에 내가 선택한 컬럼에 대한 값만 INSERT할 때 사용합니다.
당연히 NOT NULL 제약조건 칼럼은 반드시 작성해줘야 하며 DEFAULT 값이 있는 경우는 DEFAULT가 들어갑니다. 그리고 나머지 안적어준 컬럼은 NULL이 들어갑니다.

INSERT INTO EMPLOYEE(EMP_ID, EMP_NAME, EMP_NO, JOB_CODE, HIRE_DATE)
VALUES(901, '최지원', '440701-1234567', 'J7', SYSDATE);

세번째 방식

INSERT INTO 테이블명 (서브쿼리);

VALUES로 값을 직접 명시하는 것 대신 서브쿼리로 조회된 결과값을 INSERT 가능합니다.

--테이블 새로 만들기
CREATE TABLE EMP_01(
    EMP_ID NUMBER,
    EMP_NAME VARCHAR2(20),
    DEPT_TITLE VARCHAR2(20)
);

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

INSERT ALL

두개 이상의 테이블에 각각 INSERT할 때 사용되는 서브쿼리가 동일한 경우 사용합니다.

INSERT ALL
    INTO 테이블명1 VALUE(컬럼, 컬럼, 컬럼...)
    INTO 테이블명2 VALUE(컬럼, 컬럼...)
    서브쿼리;

우선 테스트를 위해 테이블을 만들어 주는데, 데이터를 넣지 않고 컬럼만 만들어주고 싶으면 WHERE 조건절에 말도 안되는 조건을 하나 넣어주면 됩니다.

CREATE TABLE EMP_DEPT
AS (SELECT EMP_ID, EMP_NAME, DEPT_CODE, HIRE_DATE
    FROM EMPLOYEE
    WHERE 1 = 0); -- 말도 안되는 조건 넣어주기 -> 데이터가 없는 테이블이 생성됨

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

부서코드가 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');

UPDATE

테이블에 기록되어있는 기존의 데이터를 수정하는 구문입니다.

UPDATE 테이블명
SET 컬럼 =,
    컬럼 =,
    ... -- AND로 연결하는 것이 아니라 그냥 ','로 연결합니다.
    [WHERE 조건]

예시 1

우선 테이블을 하나 만들어 준 다음 진행합니다.

CREATE TABLE DEPT_TABLE
AS (SELECT * FROM DEPARTMENT);

D9부서의 부서명을 '전략기획팀'으로 변경

UPDATE DEPT_TABLE
SET DEPT_TITLE = '전략기획팀'
WHERE DEPT_ID = 'D9';

예시 2

우선 테이블을 하나 만들어 준 다음 진행합니다.

CREATE TABLE EMP_SALARY
AS (SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY, BONUS 
    FROM EMPLOYEE);

EMP_SALARY 테이블에서
노옹철 사원의 급여를 100만원으로 변경

UPDATE EMP_SALARY
SET SALARY = 1000000
WHERE EMP_NAME = '노옹철';

선동일 사원의 급여를 700만원, 보너스를 0.2로 변경

UPDATE EMP_SALARY
SET SALARY = 7000000,
    BONUS = 0.2
WHERE EMP_NAME = '선동일';

전체사원의 급여를 기존 급여에 10프로 인상된 금액으로 변경(기존급여 * 1.1)

UPDATE EMP_SALARY
SET SALARY = SALARY * 1.1;

예시 3

UPDATE시 서브쿼리 사용하기

UPDATE 테이블명
SET 컬럼명 = (서브쿼리)
WHERE 조건

방명수 사원의 급여와 보너스값을 유재식 사원의 급여와 보너스 값으로 변경

UPDATE EMP_SALARY
SET SALARY = (SELECT SALARY
                FROM EMP_SALARY
                WHERE EMP_NAME = '유재식'),
    BONUS = (SELECT BONUS
                FROM EMP_SALARY
                WHERE EMP_NAME = '유재식')
WHERE EMP_NAME = '방명수';

다중열로 변경해서 작성도 가능합니다.

UPDATE EMP_SALARY
SET (SALARY, BONUS) = (SELECT SALARY, BONUS
                        FROM EMP_SALARY
                        WHERE EMP_NAME = '유재식')
WHERE EMP_NAME = '방명수';

ASIA 지역에서 근무하는 사원들의 보너스값을 0.3으로 변경

UPDATE EMP_SALARY
SET BONUS = 0.3
WHERE EMP_ID IN (SELECT EMP_ID
                FROM EMP_SALARY
                JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
                JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE)
                WHERE SUBSTR(LOCAL_NAME, 1, 4) = 'ASIA');

그리고 이런 DML들을 실제 데이터베이스 저장공간에 실제로 반영하기 위해서는 트랜잭션 처리를 반드시 해줘야합니다. 트랜잭션 데이터를 실제로 저장공간에 저장하는데 사용하는 명령어는 바로 COMMIT, 오류 등으로 인해 원상태로 복구하려면 ROLLBACK을 사용합니다.

COMMIT;

DELETE

테이블에 기록된 데이터를 한 행 단위로 삭제하는 구문입니다.

DELETE FROM 테이블명
[WHERE 조건]
DELETE FROM EMPLOYEE; -- 데이터 전체 삭제
ROLLBACK; -- 되돌리기
DELETE FROM EMPLOYEE
WHERE EMP_NAME = '이소근';

DELETE FROM EMPLOYEE
WHERE EMP_ID = 901;

COMMIT; -- 데이터베이스 저장공간에 실제로 반영
DELETE FROM DEPARTMENT
WHERE DEPT_ID = 'D1';
--D1의 값을 가져다 쓰는 자식 데이터가 있으면 삭제되지 않습니다.
profile
안녕하세요! 언제나 탐구하고 공부하는 개발자, 주재완입니다.

0개의 댓글