13일차에 배운 내용을 정리하였다.
목차는 다음과 같다. :
1. DML
- 01 MERGE
2. DCL
-01 GRANT
-02 REVOKE
3. TCL
1. DML
- 01 MERGE
데이터를 병합하는 명령어이다.
참조테이블과 완전히 내용이 동일하게 수정하는 개념 -> INSERT, UPDATE, DELETE가 동시에 발생한다.
보통 현업에서는 잘 사용하지 않으나 SQLD에서는 종종 시험에 출제된다.
* 문법
MERGE INTO 수정테이블 T1
USING 참조테이블 T2
ON (연결조건)
WHEN MATCHED THEN -- 연결조건을 만족하는 데이터에 한한 수정 명령어
UPDATE
SET T1.컬럼 = T2.컬럼
[DELETE 조건] -- 단독사용 불가, UPDATE 후 DELETE 처리
WHEN NOT MATCHED THEN -- 연결조건을 만족하지 않는 데이터에 한한 수정 명령어
INSERT INTO 수정테이블(T1.컬럼1, T1.컬럼2)
VALUES (T2.컬럼1, T2.컬럼2, ... )
** DELETE 문 사용
UPDATE 후 DELETE 처리 (UPDATE한 대상에'만' 대해서 DELETE 조건 성립 시 삭제됨)
연결조건은 어느 조건에 대해 값이 같을 것이냐를 지정해준다.
수정테이블이 OLD VER, 참조테이블이 NEW VER 정도라고 생각하면 된다.
+ 예제) 아래와 같은 테이블 생성 후 MERGE를 사용하여 테이블 수정
<수정테이블 - OLD_MENU> <참조테이블 - NEW_MENU>
NO PRICE NO PRICE
1 1000 1 1500
2 1500 2 1500
3 2000 3 2500
4 3000 4 3000
5 4000
CREATE TABLE OLD_MENU(NO NUMBER, PRICE NUMBER);
INSERT INTO OLD_MENU VALUES(1,1000);
INSERT INTO OLD_MENU VALUES(2,1500);
INSERT INTO OLD_MENU VALUES(3,2000);
INSERT INTO OLD_MENU VALUES(4,3000);
SELECT * FROM OLD_MENU;
COMMIT;
CREATE TABLE NEW_MENU(NO NUMBER, PRICE NUMBER);
INSERT INTO NEW_MENU VALUES(1,1500);
INSERT INTO NEW_MENU VALUES(2,1500);
INSERT INTO NEW_MENU VALUES(3,2500);
INSERT INTO NEW_MENU VALUES(4,3000);
INSERT INTO NEW_MENU VALUES(5,4000);
SELECT * FROM NEW_MENU;
COMMIT;
MERGE INTO OLD_MENU T1
USING NEW_MENU T2
ON (T1.NO = T2.NO)
WHEN MATCHED THEN
UPDATE
SET T1.PRICE = T2.PRICE
WHEN NOT MATCHED THEN
INSERT VALUES(T2.NO, T2.PRICE);

5 ROW UPSERTED.
UPDATE + INSERT 인데, 몇 개가 UPDATE, 몇 개가 INSERT 되었는지 파악하기가 어렵고 데이터의 검증이 힘들어진다.
같은 상품번호에 대해 가격이 다르면 가격을 참조테이블 기준으로 UPDATE 한다.
새로운 테이블만 가지고 있는 열의 경우 INSERT 한다.

** 추가 아래 문장 결과 확인
MERGE INTO OLD_MENU T1
USING NEW_MENU T2
ON (T1.NO = T2.NO)
WHEN MATCHED THEN
UPDATE
SET T1.PRICE = T2.PRICE
DELETE WHERE T1.PRICE >=2500
WHEN NOT MATCHED THEN
INSERT VALUES(T2.NO, T2.PRICE);


5 ROWS UPSERETED.
UPDATE + INSERT + DELETE.
2. DCL
** 권한의 종류 "
1. 오브젝트 권한 : 특정 테이블 조회 및 수정 권한
테이블 하나하나씩 지정하는 느낌
관리자 권한을 갖는 계정(SYS, SYSTEM)으로 부여 및 회수 가능
테이블 소유자 계정으로 부여 및 회수 가능
2. 시스템 권한 : 작업 명령어 권한(테이블 생성, 삭제 등)
관리자 권한을 갖는 계정(SYS, SYSTEM)으로 부여 및 회수 가능
CREATE TABLE / CREATE ANY TABLE / DROP TABLE / ...
▲ TABLE 대신 INDEX, VIEW 등 지정 가능
-01 GRANT
권한을 부여한다.
GRANT 권한 TO 사용자;
[ GRANT ]
예제) SCOTT 계정 소유의 EMP 테이블 조회 권한 HR 부여
SCOTT 계정으로 수행
GRANT SELECT ON EMP TO HR;
본인 (SCOTT) 테이블이므로 본인 테이블은 타인에게 권한을 줄 수 있음
따라서 HR 계정 기준
SELECT * FROM EMP; -- 오류
SELECT * FROM SCOTT.EMP; -- 가능
+예제) SCOTT 계정 소유의 DEPT 테이블 조회, 수정 권한 HR 부여
권한은 여러개를 동시에 부여 가능
테이블은 하나만 지정 가능
GRANT SELECT, INSERT, UPDATE ON DEPT TO HR;
[ 사용자 관리 ]
1. 사용자 생성
CREATE USER 사용자명
IDENTIFIED BY 패스워드;
[QUOTA 할당량 ON 테이블스페이스]; (생략가능)
패스워드는 대소문자를 구분한다
+예제) ITWILL 유저 생성 후 EMP 테이블에 대한 조회 권한 부여
system 계정으로 수행
CREATE USER ITWILL
IDENTIFIED BY oracle
quota unlimited on users;
해당 유저에 대해서는 할당량 제한을 두지 않는다.
유저를 만든 직후 접속할 수는 없다. (create session 권한 없음)
GRANT CREATE SESSION TO ITWILL;
ITWILL 계정으로 테이블 생성 시도 시 '권한이 불충분합니다' 에러 발생
CREATE TABLE ITWILL_TEST1(NO NUMBER); -- 에러 발생
SYSTEM 계정으로 ITWILL 계정에게 테이블 생성 권한을 아래와 같이 주어야 함
GRANT CREATE TABLE TO ITWILL; -- 권한 부여
CREATE TABLE ITWILL_TEST1(NO NUMBER); -- 성공
EMP 테이블에 대해서 SELECT, INSERT, UPDATE, DELETE 권한을 ITWILL에 부여
GRANT SELECT, INSERT, UPDATE, DELETE ON SCOTT.EMP TO ITWILL;
ITWILL 계정으로 수행
ITWILL_TEST2 테이블을 만들되, HR의 소유로 만들기
CREATE TABLE ITWILL_TEST1(NO NUMBER); -- 에러 발생 ('권한이 불충분합니다.')
CREATE TABLE (개인의 테이블만 가능)
CREATE ANY TABLE (다른 사용자의 테이블도 가능)/ DROP TABLE / DROP ANY TABLE ...
GRANT CREATE ANY TABLE TO ITWILL; -- 권한부여
CREATE TABLE HR.ITWILL_TEST2(NO NUMBER); -- 성공
-02 REVOKE
SYSTEM 계정으로 수행)
REVOKE CREATE ANY TABLE FROM ITWILL;
REVOKE SELECT, INSERT, UPDATE, DELETE ON SCOTT.EMP FROM ITWILL;
ITWILL 계정으로 수행)
CREATE TABLE HR.ITWILL_TEST3(NO NUMBER); -- 에러 (권한이 불충분합니다)
** 권한 부여 및 회수는 즉시 반영(재접속하지 않아도 됨)
[ ROLE ]
권한의 묶음
권한 관리를 보다 편리하게 하기 위해 생성
즉시 부여 X
1. ROLE 생성 및 권한 부여
CREATE ROLE 롤이름;
GRANT 권한 TO 롤이름;
REVOKE 권한 FROM 롤이름;
GRANT 롤이름 TO 사용자;
SYSTEM 계정으로 수행)
CREATE ROLE R1;
GRANT SELECT ON SCOTT.EMP TO R1;
GRANT SELECT ON SCOTT.DEPT TO R1;
GRANT SELECT ON SCOTT.BONUS TO R1;
GRANT R1 TO ITWILL;
ITWILL 계정으로 수행)
SELECT * FROM SCOTT.EMP; -- 오류
ITWILL 계정으로 재접속)
SELECT * FROM SCOTT.EMP; -- 정상
** ROLE을 통해서 권한 부여 시 재접속 이후에 효력이 발생하며,
회수 시 즉시 효력이 발생한다.
SYSTEM 계정으로 수행)
EMP 테이블에 대한 조회권한을 사용자로부터 직접 회수)
REVOKE SELECT ON SCOTT.EMP FROM ITWILL; -- 에러 : 허가하지 않은 권한을 REVOKE 할 수 없습니다.
REVOKE SELECT ON SCOTT.DEPT FROM R1; -- 가능
SCOTT.DEPT 조회권한 ROLE에서 회수)
REVOKE SELECT ON SCOTT.DEPT FROM R1; -- 즉시 효력 발생
[ 권한 부여 옵션 ]
1. WITH ADMIN
오브젝트 권한에 대해 중간관리자에게 권한 부여(일임받은 권한을 중간관리자 부여/회수 가능)
중간관리자를 통해 부여한 권한을 관리자가 직접 회수 불가능
중간관리자에게 부여한 권한 회수시 제3자에게 부여된 권한도 함께 회수 가능
2. WITH GRANT
시스템, 롤 권한에 대해 중간관리자에게 권한 부여(일임받은 권한을 중간관리자 부여/회수 가능)
중간관리자를 통해 부여한 권한을 관리자가 직접 회수 가능
중간관리자에게 부여한 권한 회수시 제3자에게 부여된 권한도 함께 회수 불가능
권한 부여 옵션 테스트)
1. SYSTEM 계정에서 HR 계정에게 권한 일임
1-1) SCOTT.MOVIE 조회 권한을 HR에게 부여(WITH GRANT OPTION)
GRANT SELECT ON SCOTT.MOVIE TO HR WITH GRANT OPTION; -- 정상
1-2) CREATE ANY TABLE, CREATE VIEW 권한 HR에게 부여(WITH ADMIN OPTION)
GRANT CREATE ANY TABLE, CREATE VIEW TO HR WITH ADMIN OPTION; -- 정상
2. HR 계정에서 ITWILL 계정에게 권한 부여
2-1) SCOTT.MOVIE 조회 권한을 ITWILL에게 부여
GRANT SELECT ON SCOTT.MOVIE TO ITWILL; -- 정상
2-2) CREATE ANY TABLE, CREATE VIEW 권한 ITWILL에게 부여
GRANT CREATE ANY TABLE, CREATE VIEW TO ITWILL;
3. SYSTEM 계정에서 직접 회수 시도
3-1) SCOTT.MOVIE 조회 권한 직접 회수 시도 (ITWILL로부터)
REVOKE SELECT ON SCOTT.MOVIE FROM ITWILL; -- -- 허가하지 않은 권한을 REVOKE 할 수 없습니다
3-2) CREATE VIEW 권한 직접 회수 시도(ITWILL로부터)
REVOKE CREATE VIEW FROM ITWILL; -- 가능
4. SYSTEM 계정에서 중간관리자에게 권한 회수 시 제3자 권한 함께 회수 여부 확인
4-1) SCOTT.MOVIE 조회 권한 HR로부터 회수 / ITWILL에서 해당 권한 확인
REVOKE SELECT ON SCOTT.MOVIE FROM HR; -- 가능
4-2) CREATE ANY TABLE 권한 HR로부터 회수 / ITWILL에서 해당 권한 확인
REVOKE SELECT, INSERT, UPDATE, DELETE ON SCOTT.MOVIE FROM HR; -- 허가하지 않은 권한을 REVOKE 할 수 없습니다.
* 권한 현황 확인
SELECT *
FROM DBA_TAB_PRIVS
WHERE GRANTEE = 'HR';
SELECT *
FROM DBA_SYS_PRIVS
WHERE GRANTEE = 'HR';
3. TCL
트랙젝션 종료어
1) COMMIT : 변경 영구 저장
2) ROLLBACK : 변경 취소 (COMMIT 이전으로는 불가)
3) SAVEPOINT : 변경 지점 저장
+예제) 아래와 같이 명령어 순서대로 실행했을 때 최종 출력 결과 확인
SELECT *
FROM OLD_MENU;
INSERT INTO OLD_MENU VALUES(6, 5000);
INSERT INTO OLD_MENU VALUES(7, 6000);
COMMIT;
DELETE OLD_MENU WHERE NO = 1;
SAVEPOINT SP1;
UPDATE OLD_MENU SET PRICE = 3000;
ROLLBACK TO SP1;
COMMIT;
SELECT *
FROM OLD_MENU;
'아이티윌_데이터 분석 55기 > 강의내용 필기_SQL' 카테고리의 다른 글
| #15 15일차_정규 표현식, 그룹 함수 (0) | 2026.03.25 |
|---|---|
| #14 14일차_계층형 질의, 정규표현식 (0) | 2026.03.24 |
| #12 12일차_제약조건 | DML : UPDATE, DELETE, INSERT (0) | 2026.03.20 |
| #11 11일차_DDL : CREATE, DROP, TRUNCATE, ALTER | 제약조건 (0) | 2026.03.19 |
| #10 10일차_윈도우 함수 (0) | 2026.03.18 |