코딩하는 문과생

[SQL] Oracle, 데이터 조작어(DML) 본문

프로그래밍/SQL

[SQL] Oracle, 데이터 조작어(DML)

코딩하는 문과생 2020. 3. 30. 17:13

데이터 조작어

:SELECT문으로 조회한 테이블에 데이터를 추가, 변경, 삭제할 때 사용하는 명령어

 

-사전 작업

--1: INSERT
--DEPT 테이블과 동일한 테이블 생성
CREATE TABLE DEPT_TEMP
    AS SELECT * FROM DEPT;
    
SELECT * FROM DEPT_TEMP;

--2: INSERT
CREATE TABLE EMP_TEMP
    AS SELECT *
        FROM EMP
        WHERE 1<>1;
-- 1<>1 조건을 이용해 데이터를 제외하고 열 구조만 가지는 테이블 생성이 가능하다.

--3: UPDATE
CREATE TABLE DEPT_TEMP2
    AS SELECT * FROM DEPT;
    
--4: DELETE
CREATE TABLE EMP_TEMP2
    AS SELECT * FROM EMP;
    
--IF, 테이블 잘못 생성시
DROP TABLE DEPT_TEMP;

 

-INSERT문

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

INSERT INTO DEPT_TEMP
VALUES (60, 'NETWORK', 'BUSAN');

INSERT INTO EMP_TEMP(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES(2111, '이순신', 'MANAGER', 9999, TO_DATE('07/01/2001', 'DD/MM/YYYY'), 4000, NULL, 20);

INSERT INTO EMP_TEMP(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
    SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM, E.DEPTNO
        FROM EMP E, SALGRADE S
        WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL
        AND S.GRADE = 1;
--서브쿼리 사용시 VALUES절은 사용하지 않는다. 자료형과 열 개수가 일치해야 한다.

SELECT * FROM EMP_TEMP;

 

-UPDATE문

--데이터 전체 수정
UPDATE DEPT_TEMP2
SET LOC='SEOUL';

--데이터 일부 수정
UPDATE DEPT_TEMP2
SET DNAME='DATABASE',
    LOC='SEOUL'
WHERE DEPTNO=40;

--여러열 동시에 수정
UPDATE DEPT_TEMP2
SET (DNAME, LOC) = (SELECT DNAME, LOC FROM DEPT WHERE DEPTNO = 40)
WHERE DEPTNO=40;

--참고
--ROLLBACK: 수정한 내용 되돌리기(DML 명령어 실행 취소하는 명령어)
ROLLBACK;

 

-DELETE

--데이터 일부 삭제
DELETE FROM EMP_TEMP2
WHERE JOB = 'MANAGER';

--데이터 전체 삭제
DELETE FROM EMP_TEMP2

 

-종합 예제

--1
INSERT INTO CHAP10HW_DEPT(DEPTNO, DNAME, LOC)
VALUES(50, 'ORACLE', 'BUSAN');

INSERT INTO CHAP10HW_DEPT(DEPTNO, DNAME, LOC)
VALUES(60, 'SQL', 'ILSAN');

INSERT INTO CHAP10HW_DEPT(DEPTNO, DNAME, LOC)
VALUES(70, 'SELECT', 'INCHEON');

INSERT INTO CHAP10HW_DEPT(DEPTNO, DNAME, LOC)
VALUES(80, 'DML', 'BUNDANG');

--2
INSERT INTO CHAP10HW_EMP
VALUES(7201, 'TEST_USER1', 'MANAGER', 7788, TO_DATE('2016-01-02', 'YYYY-MM-DD'), 4500, NULL, 50);
 
INSERT INTO CHAP10HW_EMP
VALUES(7202, 'TEST_USER2', 'CLERK', 7201, TO_DATE('2016-02-21', 'YYYY-MM-DD'), 1800, NULL, 50);
 
INSERT INTO CHAP10HW_EMP
VALUES(7203, 'TEST_USER3', 'ANALYST', 7201, TO_DATE('2016-04-11', 'YYYY-MM-DD'), 3400, NULL, 60);
 
INSERT INTO CHAP10HW_EMP
VALUES(7204, 'TEST_USER4', 'SALESMAN', 7201, TO_DATE('2016-05-31', 'YYYY-MM-DD'), 2700, 300, 60);
 
INSERT INTO CHAP10HW_EMP
VALUES(7205, 'TEST_USER5', 'CLERK', 7201, TO_DATE('2016-07-20', 'YYYY-MM-DD'), 2600, NULL, 70);
 
INSERT INTO CHAP10HW_EMP
VALUES(7206, 'TEST_USER6', 'CLERK', 7201, TO_DATE('2016-09-08', 'YYYY-MM-DD'), 2600, NULL, 70);
 
INSERT INTO CHAP10HW_EMP
VALUES(7207, 'TEST_USER7', 'LECTURER', 7201, TO_DATE('2016-10-28', 'YYYY-MM-DD'), 2300, NULL, 80);
 
INSERT INTO CHAP10HW_EMP
VALUES(7208, 'TEST_USER8', 'STUDENT', 7201, TO_DATE('2018-03-09', 'YYYY-MM-DD'), 1200, NULL, 80);

--3
UPDATE CHAP10HW_EMP
SET DEPTNO = 70
WHERE SAL>(SELECT AVG(SAL) FROM CHAP10HW_EMP WHERE DEPTNO=50);

--4
UPDATE CHAP10HW_EMP
SET DEPTNO = 80, SAL = SAL*1.1
WHERE HIREDATE > (SELECT MIN(HIREDATE) FROM CHAP10HW_EMP WHERE DEPTNO=60);

--5
DELETE FROM CHAP10HW_EMP
WHERE SAL BETWEEN (SELECT LOSAL FROM SALGRADE WHERE GRADE = 5) AND (SELECT HISAL FROM SALGRADE WHERE GRADE = 5);

DELETE FROM CHAP10HW_EMP
WHERE EMPNO IN (SELECT E.EMPNO FROM CHAP10HW_EMP E, CHAP10HW_SALGRADE S WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL AND S.GRADE=5);

'프로그래밍 > SQL' 카테고리의 다른 글

[SQL] Oracle, 데이터 정의어(DDL)  (0) 2020.03.31
[SQL] Oracle, 트랜잭션 제어와 세션  (0) 2020.03.31
[SQL] Oracle, 서브쿼리  (0) 2020.03.30
[SQL] Oracle, 조인  (0) 2020.03.30
[SQL] Oracle, 오라클 다중행 함수  (0) 2020.03.28