지엉

Oracle SQL - INSERT, UPDATE, DELETE, ROLLBACK, COMMIT 본문

DB/Oracle

Oracle SQL - INSERT, UPDATE, DELETE, ROLLBACK, COMMIT

지엉잉 2023. 12. 8. 16:10
INSERT
- INSERT문으로 테이블에 새로운 행을 추가할 수 있다.

 

INSERT문을 사용하기 전에

테이블 구조를 빠르게 확인하는 방법

1
DESC DEPARTMENTS;
cs

 

테이블의 구조를 확인할 수 있다.

 

INSERT의 2가지 문법

1.

1
2
-- 1(컬럼을 정확하게 일치시키는 경우는 컬럼명 생략이 가능)
INSERT INTO DEPARTMENTS VALUES(280'개발자'NULL1700);
cs

 

DEPARTMENTS 테이블에 값이 넣어졌다.

 

 

2. 

1
2
-- 2(컬럼을 지칭해서 넣는 경우)
INSERT INTO DEPARTMENTS(DEPARTMENT_ID, DEPARTMENT_NAME, LOCATION_ID) VALUES(280'개발자'1700);
cs

 

DEPARTMENTS 테이블에 값이 넣어졌다

 

명령으로 삽입했던 행의 저장을 취소하고 싶을 때는
- 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

JOB_ID에 MAN이 들어가는 사람의 값이 들어갔다

 

- 특정 칼럼을 서브쿼리 절로 넣을 때

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

SALARY가 12100으로 변한 것을 볼 수 있다.

 

 

여기서 중요한 점!!

- 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

 

기존

 

변경 후

JOB_ID, MANAGER_ID(100으로 동일), DEPARTMENT_ID가 변했다

 

각 컬럼을 서브쿼리로 업데이트하는 구문

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 전체 테이블

(SELECT DEPARTMENT_ID FROM EMPLOYEES WHERE EMPLOYEE_ID = 145); 의 DEPARTMENT_ID (80)인 사람들을 다 제거했다

 

 

끝!