지엉
Oracle SQL - INSERT, UPDATE, DELETE, ROLLBACK, COMMIT 본문
INSERT
- INSERT문으로 테이블에 새로운 행을 추가할 수 있다.
INSERT문을 사용하기 전에
테이블 구조를 빠르게 확인하는 방법
1 | DESC DEPARTMENTS; | cs |
INSERT의 2가지 문법
1.
1 2 | -- 1(컬럼을 정확하게 일치시키는 경우는 컬럼명 생략이 가능) INSERT INTO DEPARTMENTS VALUES(280, '개발자', NULL, 1700); | cs |
2.
1 2 | -- 2(컬럼을 지칭해서 넣는 경우) INSERT INTO DEPARTMENTS(DEPARTMENT_ID, DEPARTMENT_NAME, LOCATION_ID) VALUES(280, '개발자', 1700); | cs |
명령으로 삽입했던 행의 저장을 취소하고 싶을 때는
- ROLLBACK; 명령어를 사용하면 된다.
데이터를 실제로 반영하고 싶을 때는
COMMIT 을 사용하면 된다.
주의: 이 시점 이전으로는 ROLLBACK이 불가능하다, 값이 실제로 입력된다.
이번엔 가짜테이블을 만들어보자(데이터는 없고, EMPLOYEES 테이블의 구조와 똑같은 테이블)
- 값도 같이 넣어주려면 WHERE 1 = 1로 고치면 된다
1 | CREATE TABLE EMPS AS (SELECT * FROM EMPLOYEES WHERE 1 = 2); -- 구조만 복사하는 테이블 생성(데이터 X) | cs |
INSERT문에도 서브쿼리가 가능하다!
- 모든 컬럼을 서브쿼리 절로 넣을 때
1 | INSERT INTO EMPS(SELECT * FROM EMPLOYEES WHERE JOB_ID LIKE '%MAN%'); | cs |
- 특정 칼럼을 서브쿼리 절로 넣을 때
1 2 | INSERT INTO EMPS(LAST_NAME, EMAIL, HIRE_DATE, JOB_ID) (SELECT LAST_NAME, EMAIL, HIRE_DATE, JOB_ID FROM EMPLOYEES WHERE JOB_ID LIKE '%MAN'); | cs |
이렇게 응용도 가능하다
1 2 3 4 5 | INSERT INTO EMPS(LAST_NAME, EMAIL, HIRE_DATE, JOB_ID) VALUES( (SELECT LAST_NAME FROM EMPLOYEES WHERE MANAGER_ID IS NULL), 'TEST01', SYSDATE, 'TEST03'); | cs |
UPDATE
- UPDATE 문장으로 기존의 행을 갱신한다.
1 | UPDATE EMPS SET SALARY = SALARY * 1.1 WHERE EMPLOYEE_ID = 114; | cs |
기존 SALARY
적용 SALARY
여기서 중요한 점!!
- WHERE절 없이 구문을 실행시키면, 전체 테이블에 적용되기 때문에 항상 WHERE절을 붙여야 함
- 그래서 항상, SELECT문으로 업데이트할 값을 확인하고, 적용하는 습관을 갖는 것이 좋다.
여러행 업데이트도 가능하다.
1 2 3 4 5 6 7 | -- 여러행 업데이트 SELECT * FROM EMPS; UPDATE EMPS SET SALARY = SALARY * 1.1 ,COMMISSION_PCT = 0.5 ,MANAGER_ID = 110 WHERE EMPLOYEE_ID = 114; | cs |
(결과 생략)
UPDATE문의 서브쿼리절
1 2 3 4 | UPDATE EMPS SET(MANAGER_ID, JOB_ID, DEPARTMENT_ID) = (SELECT MANAGER_ID, JOB_ID, DEPARTMENT_ID FROM EMPLOYEES WHERE EMPLOYEE_ID = 201) WHERE EMPLOYEE_ID = 114; | cs |
기존
변경 후
각 컬럼을 서브쿼리로 업데이트하는 구문
1 2 3 4 | UPDATE EMPS SET MENEGER_ID = (SELECT MANAGER_ID FROM EMPLOYEES WHERE EMPLOYEE_ID = 201), JOB_ID = (SELECT JOB_ID FROM EMPLOYEES WHERE EMPLOYEE_ID = 201) WHERE EMPLOYEE_ID = 114; | cs |
(결과 생략)
WHERE절에도 적용이 가능하다
1 2 3 | UPDATE EMPS SET SALARY = 0 WHERE EMPLOYEE_ID IN (SELECT EMPLOYEE_ID FROM EMPLOYEES WHERE JOB_ID = 'IT_PROG'); | cs |
(결과 생략)
DELETE문의 특징
-DELETE문은 반드시 전부 지워지는 것은 아니다.
-테이블이 연관관계를 갖고 있으면, 참조무결성제약에 위배되는 경우, 지워지지 않는다.
DELETE
- DELETE 문장을 사용하여 테이블로부터 기존의 행을 제거할 수 있다.
1 2 | DELETE FROM EMPS WHERE EMPLOYEE_ID = 114; | cs |
기존
삭제 후
DELETE 서브쿼리절
1 | DELETE FROM EMPS WHERE DEPARTMENT_ID = (SELECT DEPARTMENT_ID FROM EMPLOYEES WHERE EMPLOYEE_ID = 145); | cs |
기존 EMPS 전체 테이블
삭제 후 EMPS 전체 테이블
끝!
'DB > Oracle' 카테고리의 다른 글
Oracle SQL - Transaction(트랜잭션) (0) | 2023.12.11 |
---|---|
Oracle SQL - MERGE, CTAS (0) | 2023.12.11 |
Oracle SQL - 조인, 서브쿼리 한 번에 쓰기 (2) | 2023.12.08 |
Oracle SQL - 서브쿼리, 스칼라, 인라인 뷰, 스콸라 쿼리 (0) | 2023.12.07 |
Oracle SQL - ANSI JOIN (1) | 2023.12.06 |