본문 바로가기

Oracle

Oracle - DML(데이터 조작: 추가·수정·삭제)

기존 테이블 복제

DEPT테이블 복사한 새 테이블 DEPT_TEMP을 만들려면 다음과 같다.

CREATE TABLE DEPT_TEMP
    AS SELECT * FROM DEPT;

 

테이블에 데이터 추가 시, INSERT문을 이용해 추가할 수 있다.

 

Ex) 50번 부서번호, 부서 이름 DATABASE, 위치 SEOUL 추가

INSERT INTO DEPT_TEMP (DEPTNO, DNAME, LOC)
                VALUES (50, 'DATABASE', 'SEOUL');

-- 열 지정 없이 추가. 순서대로 자동 지정해 추가함.
INSERT INTO DEPT_TEMP
                VALUES (60, 'NETWORK', 'BUSAN');
                
-- NULL 값 지정해 추가.
INSERT INTO DEPT_TEMP (DEPTNO, DNAME, LOC)
                VALUES (70, 'WEB', NULL);

-- 공백 문자열로 NULL값 입력
INSERT INTO DEPT_TEMP (DEPTNO, DNAME, LOC)
                VALUES (80, 'MOBILE', '');
                
-- 열 데이터 넣지 않는 방식으로 NULL값 입력
INSERT INTO DEPT_TEMP (DEPTNO, LOC)
                VALUES (90, 'INCHEON');

 

SubQuery를 이용해 WHERE에 조건을 넣어, 다른 테이블에서 해당 조건에 해당하는 데이터를

원하는 테이블로 추가할 수 있다.

-- DEPTNO가 40 이하인 데이터 DEPT에서 DEPT_TEMP로 복사해 추가
INSERT INTO DEPT_TEMP (DEPTNO, DNAME, LOC)
    SELECT DEPTNO, DNAME, LOC
    FROM DEPT
    WHERE DEPTNO <= 40;

-- DEPT의 별칭을 지정하면 가독성이 좋아진다.
-- 결과는 윗 QUERY와 똑같다.
INSERT INTO DEPT_TEMP (DEPTNO, DNAME, LOC)
    SELECT D.DEPTNO, D.DNAME, D.LOC
    FROM DEPT D
    WHERE DEPTNO <= 40;

 

UPDATE (실무에서는 기존 데이터를 건드리므로 위험함!!!)

데이터 일부분 수정 시 다음과 같이 쓴다.

-- DEPTNO가 40인 데이터를 아래와 같이 수정
UPDATE DEPT_TEMP
	SET DNAME = 'DATABASE',
    	LOC = 'SEOUL'
WHERE DEPTNO = 40;

 

SubQuery 이용해 수정할 수도 있다.

DNAME, LOC DEPT에서 불러와 DEPT_TEMP2에 덮어쓰기

UPDATE DEPT_TEMP2
    SET DNAME = (SELECT DNAME, LOC
                  FROM DEPT
                  WHERE DEPTNO = 40),
        LOC = (SELECT DNAME, LOC
                FROM DEPT
                WHERE DEPTNO = 40)
WHERE DEPTNO = 40;

 

 

WHERE절에 서브쿼리도 적용 가능하다.

DNAME이 'OPERATIONS' 인 FIELD에 LOC 'SEOUL'로 변경

UPDATE DEPT_TEMP2
    SET LOC = 'SEOUL'
WHERE DEPTNO = (SELECT DEPTNO
                FROM DEPT_TEMP2
                WHERE DNAME = 'OPERATIONS');

 

내가 원하는 데이터를 미리 확인한 뒤에 UPDATE를 변경해야

사고를 미연에 방지할 수 있다.

1. SELECT WHERE을 통해 미리 데이터 확인

SELECT *
FROM DEPT_TEMP2
WHERE DEPTNO = 40;

 

2. UPDATE 실행(1번과 따로 실행해야 함!)

UPDATE DEPT_TEMP2
SET DNAME = 'DATABASE',
	LOC = 'SEOUL'
WHERE DEPTNO = 40;

 

DELETE

WHERE절을 이용해 일부 데이터를 삭제할 수 있다.

잘못 삭제했다면 ROLLBACK;으로 되돌릴 수 있다.

-- JOB이 'MANAGER'인 부분 삭제
DELETE FROM EMP_TEMP2
WHERE JOB = 'MANAGER';

 

다음과 같이 Join과 SubQuery을 같이 이용할 수도 있다.

-- SALGRADE 테이블 속 GRADE 3의 LOSAL 1401과
-- HISAL 2000 사이에 있는 데이터 삭제
DELETE FROM EMP_TEMP2
    WHERE EMPNO IN (SELECT E.EMPNO
                    FROM EMP_TEMP2 E, SALGRADE S
                    WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL
                    AND S.GRADE = 3
                    AND DEPTNO = 30);

'Oracle' 카테고리의 다른 글

Oracle - 누적 합계를 해주는 SUM OVER  (0) 2020.06.04
Oracle - 중복된 데이터가 2개 이상일 경우  (0) 2020.06.04
Oracle - SubQuery  (0) 2020.06.03
Oracle - join  (0) 2020.06.02
Oracle EMP Table 예시  (0) 2020.06.01