JAVA 웹 개발/2. Oracle
07.DML(INSERT, UPDATE, DELETE)
코딩 펭귄
2022. 8. 13. 15:06
📅 2021.09.16 ~ 2021.09.17
DML(Data Manipulation Language)
- 데이터 조작 언어로 테이블에 값을 삽입(INSERT), 수정(UPDATE), 삭제(DELETE)하는 구문을 말한다.
- INSERT: 테이블에 새로운 행을 추가하여 테이블의 행 개수를 증가시키는 구문이다.
- UPDATE: 테이블에 기록된 컬럼 값을 수정하는 구문으로 테이블 전체 행 개수는 변하지 않는다.
- DELETE: 테이블의 행을 삭제하는 구문으로 테이블의 행 개수가 줄어든다.
INSERT
- INSERT INTO 테이블명(컬럼명1, 컬럼명2, ...) VALUES(값1, 값2, ...) 형태로 사용한다.
- 정석 INSERT: 해당 테이블에 존재하는 컬럼 명을 작성하는 INSERT문으로 내가 나열한 컬럼 순서대로 값을 넣을 수 있다. 따라서 본 테이블의 컬럼 순서를 기억하지 않아도 되며, 내가 원하는 컬럼만 뽑아서 값을 넣을 수 있다. 하지만 써야 하는 내용이 방대하다.
INSERT INTO EMPLOYEE(EMP_ID, EMP_NAME, EMP_NO, JOB_CODE, SAL_LEVEL) VALUES(500, '김개발', '001122-1223344', 'J7', 'S3');
- 생략 INSERT: 모든 컬럼에 값을 다 넣는 경우에는 컬럼명을 생략하여 작성이 가능하다. 써야 할 내용이 비교적 적으나, 모든 컬럼에 값을 넣어야 하며 일부만 넣는 경우 오류가 발생한다. 또한 본 테이블의 컬럼 순서대로 값을 넣어야 하기 때문에 본 테이블의 컬럼 순서를 알고 있어야 한다.
INSERT INTO EMPLOYEE VALUES(500, '김개발', '001122-1223344', 'gae@naver.com', '01023456789', 'D1', 'J7', 'S3', 3000000, 0.2, 200, SYSDATE, NULL, DEFAULT);
- 아래와 같은 방법으로 여러 개의 행을 한 번에 INSERT하는 것도 가능하다.
INSERT INTO EMP_01( SELECT EMP_ID, EMP_NAME, DEPT_TITLE FROM EMPLOYEE LEFT JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID) );
INSERT ALL
- 여러 개의 테이블을 한 번에 삽입할 경우 사용한다.
- 서브쿼리의 조건절이 같을 경우에는 아래와 같이 조건을 넣어 한 번에 삽입할 수 있으며, 이때 가져올 컬럼이 서로 달라도 가져올 컬럼들을 모두 SELECT하면 된다.
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';
- 서브쿼리의 조건절이 다를 경우에도 INSERT ALL을 사용하여 한 번에 삽입할 수 있으며, 해당 경우에는 WHEN을 이용해 각각 조건을 삽입해 준다.
INSERT ALL WHEN HIRE_DATE < '2000/01/01' THEN INTO EMP_OLD VALUES(EMP_ID, EMP_NAME, HIRE_DATE, SALARY) WHEN HIRE_DATE >= '2000/01/01' THEN INTO EMP_NEW VALUES(EMP_ID, EMP_NAME, HIRE_DATE, SALARY) SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY FROM EMPLOYEE;
UPDATE
- 테이블에 기록된 값을 수정하는 명령어로 행 개수가 변하지 않는다.
- WHERE를 사용하여 조건을 설정하지 않는 경우 모든 행에 대한 UPDATE가 진행된다.
UPDATE EMP_SALARY SET (SALARY, BONUS) = (SELECT SALARY, BONUS FROM EMP_SALARY WHERE EMP_NAME = '김개발') WHERE EMP_NAME IN('박개발', '최개발', '정개발', '이개발');
- UPDATE시 내가 지정한 데이터 크기보다 큰 값을 입력하거나, 제약 조건에 위배되는 값을 입력하면 수정되지 않는다. 따라서 제약 조건에 위배되는 값을 입력하지 않도록 주의해야 한다.
DELETE
- 테이블에 있는 행을 삭제하는 명령어로 행의 개수가 줄어든다.
- WHERE를 사용하여 조건을 설정하지 않는 경우 모든 행이 삭제된다.
DELETE FROM EMPLOYEE WHERE EMP_NAME = '김개발';
- FOREIGN KEY를 이용하여 참조되고 있는 값은 삭제가 불가능하지만 부득이하게 삭제해야 하는 경우 제약 조건을 활성화/비활성화 할 수 있다.
-- SYS_C007699 제약조건 비활성화 ALTER TABLE EMPLOYEE DISABLE CONSTRAINT SYS_C007699 CASCADE; -- SYS_C007699 제약조건 활성화 ALTER TABLE EMPLOYEE ENABLE CONSTRAINT SYS_C007699;
- TRANCATE: DELETE와 비슷하며, 테이블의 전체 행을 삭제한다. DELETE보다 수행 속도가 빠르지만 ROLLBACK을 통한 복구가 불가능하다. ROLLBACK할 데이터를 가지고 있지 않기 때문에 속도가 빠르다.
TRUNCATE TABLE EMP_SALARY;