현대오토에버 모빌리티 sw 스쿨 3기 [클라우드]/MariaDB

MariaDB 3일차 강의 / 현대오토에버 모빌리티 SW 스쿨 / 클라우드반

맹꽁이+ 2025. 12. 30. 01:02

1. DDL

1) Auto_Increment

  • MySQL와 MariaDB 에서 일련번호를 생성하는 기능
  • 테이블을 만들 때 초기값을 설정하는 것이 가능
  • 적용은 컬럼에 하는데 컬럼의 자료형 뒤에 Auto_Increment를 추가하면 되고 적용된 컬럼은 Unique나 Primary Key 제약조건이 설정되어야 한다.
  • 하나의 테이블에 하나만 적용이 가능하다.
  • ALTER TABLE 명령을 이용해서 초기값을 수정할 수 있다.

📍일련번호가 적용된 테이블 생성

  • 아래처럼 유일한 값을 가질 수 없는 얘들이면 일련번호나 TIMESTAMP를 활용해서 primary key를 만든다.
CREATE TABLE tSale(
	saleno INT AUTO_INCREMENT,
	customer VARCHAR(10),
    product VARCHAR(30),
    CONSTRAINT pk_tSale PRIMARY KEY(saleno)
);

 

📍데이터를 추가해서 확인 - 일련번호는 직접 입력해도 되고 자동으로 입력하도록 생략 가능

INSERT INTO tSale(customer, product) VALUES('쥬니', '탁상캘린더');
INSERT INTO tSale(saleno, customer, product) VALUES(2, '군계', '러닝화');

SELECT *
FROM tSale;

 

📍마지막에 삽입된 데이터를 삭제하고 다른 데이터를 다시 삽입한 경우의 일련번호

INSERT INTO tSale(customer, product) VALUES('쥬니', '두부');

SELECT *
FROM tSale;

-- 3번 삭제
DELETE FROM tSale WHERE product='두부';

SELECT *
FROM tSale;

INSERT INTO tSale(customer, product) VALUES('쥬니', '사과');
-- 3번이 아닌 4번으로 넘어감
SELECT *
FROM tSale;

 

📍일련번호의 시작 값을 수정해보자

  • 기본 형식
-- ALTER TABLE 테이블이름 AUTO_INCREMENT = 값;
ALTER TABLE tSale AUTO_INCREMENT = 100;

INSERT INTO tSale(customer, product) VALUES('헨리', '소주');

SELECT *
FROM tSale;

 

📍마지막에 삽입된 일련번호: LAST_INSERT_ID()

  • 안 쓴 일련번호여도, 최근 값보다 작은 값으로 변경 불가능
SELECT LAST_INSERT_ID();

 

 

2. SET OPERATOR

1) 개요

  • 2개 이상의 테이블에서 데이터를 추출하는 방법 중 하나
  • 여러 개의 SELECT 문장을 결합해서 결과를 얻어내는 연산
  • 기본형식
SELECT 구문
SET operation
SELECT 구문

 

 

2) Guide Line

  • 첫번째 SELECT 구문과 두번째 SELECT 구문의 열은 앞에서부터 순서대로 매칭이 되므로 열의 개수와 자료형이 일치해야 한다.
  • 테이블은 동일할 수도 있는데 대부분의 경우는 동일하지 않음
  • 출력되는 컬럼의 이름은 첫번째 SELECT 구문의 것이 출력됨
  • ORDER BY는 마지막에 한 번만 기술 가능
  • BLOB, CLOB, BRILE, LONG 형 컬럼에는 사용 불가

 

3) 연산자

  • UNION: 합집합 - 중복을 제거
  • UNION ALL: 합집합 - 중복을 제거하지 않음
  • INTERSECT: 교집합
  • EXCEPT: 어느 한 쪽 테이블에 존재하는 것만 조회

 

4) 실습

📍EMP 테이블과 DEPT 테이블의 DEPTNO 확인

SELECT DEPTNO
FROM EMP;

SELECT DEPTNO
FROM DEPT;
-- EMP 테이블에는 10, 20, 30이 존재하고 DEPT 테이블에는 10, 20, 30, 40이 존재

 

📍합집합

-- UNION: 중복 제거
SELECT DEPTNO
FROM EMP
UNION
SELECT DEPTNO
FROM DEPT;

-- UNION ALL: 중복 제거X
SELECT DEPTNO
FROM EMP
UNION ALL
SELECT DEPTNO
FROM DEPT;

 

📍교집합

-- INTERSECT
SELECT DEPTNO
FROM EMP
INTERSECT
SELECT DEPTNO
FROM DEPT;

 

📍차집합

-- EXCEPT
SELECT DEPTNO
FROM EMP
EXCEPT
SELECT DEPTNO
FROM DEPT;

 

3. SUB QUERY

1) 개요

  • 하나의 query 안에 존재하는 query
  • 포함하고 있는 쿼리를 Main Query
  • 포함된 쿼리를 Sub Query
  • INSERT, UPDATE, DELETE 구문에 사용할 수 있고, SELECT 구문에서도 사용 가능한데 WHERE, HAVING, FROM절에서 사용
  • 서브 쿼리는 연산자의 오른쪽에 기술해야 하고 괄호로 감싸야 함
  • 메인 쿼리가 수행되기 전에 한 번만 실행됨
  • 분류
    • FROM절에 사용되면 INLINE VIEW
    • 그 외의 경우는 단일행 서브 쿼리와 다중행 서브쿼리로 분류

 

2) 단일행 서브쿼리

  • 결과가 하나의 값인 서브쿼리
  • SELECT 구문의 WHERE 절에 사용

📍tCity 테이블에서 popu가 최대인 name을 조회

-- MariaDB나 MySQL에서 동일한 popu가 없다면 가능

-- 표준 sql에서는 에러이고, MariaDB에서는 첫번째 값을 리턴
-- 최대값이 동일한 데이터가 있으면 하나의 값만 조회가 된다.
SELECT MAX(popu), name 
FROM tCity;

-- 서브쿼리를 이용해서 해결
SELECT name 
FROM tCity
WHERE popu = (SELECT MAX(popu) FROM tCity);

 

📍EMP 테이블에서 SAL이 평균 이상인 데이터의 ENAME과 SAL을 조회

SELECT ENAME, SAL
FROM EMP
WHERE SAL >= (SELECT avg(SAL) FROM EMP);

 

 

3) 다중열 서브쿼리

  • 서브쿼리의 결과가 2개 이상의 열인 경우

📍tStaff 테이블에서 name이 안중근인 데이터와 동일한 DEPART 와 GENDER를 갖는 데이터의 모든 열을 조회

-- 따로 구해서 and 하기
SELECT *
FROM tStaff
WHERE DEPART = (SELECT DEPART FROM tStaff WHERE name = '안중근')
AND GENDER = (SELECT GENDER FROM tStaff WHERE name = '안중근');

-- 같은 결과를 보임
-- '=' 일 때는 함께 써도 상관 없음
SELECT *
FROM tStaff
WHERE (DEPART, GENDER) = (SELECT DEPART, GENDER FROM tStaff WHERE name = '안중근');

 

 

4) 다중행 서브쿼리

  • 개요
    • 서브쿼리의 결과 행이 2개 이상인 경우
    • 단일행 연산자 대신에 다중행 연산자를 사용
    • >, >=, <, <=, =, != 연산자만 단독으로 사용할 수 없음
  • 다중행 연산자
    • IN: 포함된 목록 중 하나와 일치
    • ANY, SOME: 목록 하나만 조건을 만족해도 리턴
    • ALL: 목록 모두가 조건을 만족해야만 리턴
    • EXIST: 메인 쿼리의 비교 조건이 Sub Query의 결과 중에서 만족하는 값이 하나 이상이면 TRUE 리턴

📍EMP 테이블에서 DEPTNO별로 그룹화 한 후 각 그룹의 SAL의 최대값과 일치하는 SAL을 가진 EMPNO, ENAME, SAL, DEPTNO를 조회

-- 에러가 발생: 서브쿼리의 결과가 2개 이상
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE SAL IN (SELECT MAX(SAL) FROM EMP GROUP BY DEPTNO);

-- 서브쿼리 결과가 여러값이어도 허용
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE SAL IN (SELECT MAX(SAL) FROM EMP GROUP BY DEPTNO);

 

📍EMP 테이블에서 DEPTNO가 30인 부서의 모든 사원보다 SAL이 더 큰 데이터의 ENAME과 SAL을 조회

-- 에러 발생: 서브쿼리에서 다중 결과 나옴
SELECT ENAME, SAL
FROM EMP
WHERE SAL > (SELECT SAL FROM EMP WHERE DEPTNO = 30);

-- ALL을 쓰면 다중 결과 가능
SELECT ENAME, SAL
FROM EMP
WHERE SAL > ALL(SELECT SAL FROM EMP WHERE DEPTNO = 30);

-- 서브쿼리 결과를 MAX 하나로 지정하면 가능
SELECT ENAME, SAL
FROM EMP
WHERE SAL > (SELECT MAX(SAL) FROM EMP WHERE DEPTNO = 30);

 

📍[EXISTS] EMP 테이블에서 SAL이 3000이 넘는 데이터가 있으면 ENAME과 SAL을 조회

  • EXISTS는 데이터가 존재하면 TRUE 그렇지 않으면 FALSE를 리턴해서 특정 쿼리의 수행 여부를 결정할 때 사용
SELECT ENAME, SAL
FROM EMP
WHERE EXISTS (SELECT 1 FROM EMP WHERE SAL > 3000);

 

📍EMP 테이블에서 MGR의 ENAME이 KING인 사원의 ENAME과 SAL을 조회

  • MGR은 관리자의 EMPNO입니다.
SELECT ENAME, SAL
FROM EMP
WHERE MGR = (SELECT EMPNO FROM EMP WHERE ENAME = 'KING');

 

4. JOIN

1) 개요

  • 2개 이상의 테이블을 합쳐서 하나의 테이블을 만드는 작업
  • 2개 이상의 테이블은 동일한 테이블의 경우에도 가능
  • 찾고자 하는 값이 두 테이블을 거쳐야 하면 JOIN
  • JOIN과 SUB QUERY 둘 다 가능하면 서브 쿼리가 훨씬 빠르다.

2) 종류

  • CROSS JOIN: 2개 테이블의 모든 조합으로 카디션 프로덕트라고도 함
  • EQUI JOIN: JOIN을 할 때 = 연산자를 사용
  • NON EQUI JOIN: JOIN을 할 때 = 이외의 연산자를 사용
  • OUTER JOIN: 한 쪽에만 존재하는 데이터도 JOIN에 참여
  • SELF JOIN: 동일한 테이블을 가지고 JOIN
  • SEMI JOIN: 서브 쿼리를 이용해서 JOIN

3) CROSS JOIN

  • Catesion Product 라고도 하는데, 양쪽 테이블의 모든 조합
  • FROM 절에 테이블 이름을 나열하고 JOIN 조건이 없으면 된다.
  • 양쪽 테이블의 모든 컬럼이 다 나오고 모든 행이 다른 테이블의 모든 행과 결합
  • 컬럼의 개수는 합계가 되고, 행의 개수는 곱하기가 된다.
  • EMP 테이블은 8개의 컬럼이 있고 14개의 행이 존재
  • DEPT 테이블은 3개의 컬럼이 있고, 4개의 행이 있습니다.
SELECT *
FROM EMP, DEPT;

 

4) EQUI JOIN

  • 양쪽 테이블에 동일한 의미를 갖는 컬럼을 기준으로 일치하는 데이터만 조인에 참여
  • 컬럼의 이름은 일치하지 않아도 됩니다.
  • 양쪽 테이블의 컬럼 이름이 동일하다면 테이블 이름까지 추가해서 기재해야 합니다.
  • EMP 테이블에는 부서번호를 의미하는 DEPTNO가 있고 DEPT 테이블에도 부서 번호를 의미하는 DEPTNO가 있다.

📍EMP 테이블 과 DEPT 테이블을 EQUI JOIN

SELECT *
FROM EMP, DEPT
WHERE emp.deptno = dept.deptno;

 

📍EMP 테이블의 ENAME이 MILLER인 사원의 ENAME과 DEPT 테이블의 DNAME을 조회

SELECT ENAME, DNAME
FROM EMP, DEPT
WHERE emp.deptno = dept.deptno AND ENAME = 'MILLER';

 

📍DEPT 테이블의 LOC가 DALLAS인 사원의 EMP 테이블의 ENAME을 조회

SELECT ENAME
FROM EMP, DEPT
WHERE EMP.deptno = dept.deptno and loc = 'DALLAS';

SELECT ENAME
FROM EMP
WHERE deptno = (SELECT deptno from dept where loc = 'DALLAS');

 

5) 테이블에 다른 이름 부여

  • 테이블 이름이 길거나 명시적이 아닌 경우 원래 테이블에 새로운 이름을 부여해서 사용하는 것이 가능
SELECT ENAME, DNAME
FROM EMP e, DEPT d
WHERE e.deptno = d.deptno AND ENAME='MILLER'

-- SELF JOIN 에서는 필수

 

 

6) NON EQUI JOIN

  • JOIN 연산자가 =가 아닌 경우
  • SALGRADE 테이블에는 LOSAL과 HISAL, 그리고 GRADE로 구성되어 있음
select *
from salgrade;

 

📍EMP 테이블에서 SAL을 이용해서 GRADE를 찾아서 EMP 테이블의 ENAME과 SAL, 그리고 SALGRADE를 조회

  • EMP 테이블의 SAL은 SALGRADE의 LOSAL에서 HISAL 사이어야 해서 =으로 비교할 수 없음
SELECT ENAME, SAL, GRADE
FROM EMP, SALGRADE
WHERE SAL BETWEEN LOSAL AND HISAL;

 

 

7) SELF JOIN

  • 동일한 테이블을 가지고 수행하는 JOIN
  • 하나의 테이블에 동일한 의미를 갖는 컬럼이 두 개 이상 존재할 때 가능한 JOIN

📍사원 이름과 관리자 사원 이름을 같이 조회하고자 하는 경우, 이 테이블을 두 번 참조해야합니다.

EMP 테이블에는 EMPNO와 MGR이라는 컬럼이 있는데 EMPNO는 사원번호이고 MGR은 관리자 사원번호

SELECT e1.ename "사원이름", e2.mgr "관리자이름"
FROM emp e1, emp e2
WHERE e1.mgr = e2,empno;

 

📍EMP 테이블에서 KING이 매니저인 사원의 ENAME과 JOB을 조회

  • SUB QUERY를 이용해도 되고, SELF JOIN을 이용해도 됩니다.
SELECT ENAME, JOB
FROM EMP
WHERE MGR = (SELECT EMPNO FROM EMP WHERE ENAME='KING');

SELECT e1.ENAME, e2.JOB
FROM EMP e1, EMP e2
WHERE e1.MGR = e2.EMPNO AND e2.ename='KING';

 

 

8) ANSI JOIN

  • 미국 표준 협회에서 제안한 JOIN 방식
  • 기존의 JOIN을 다른 문법으로 지원
  • ANSI CROSS JOIN
    • 기존의 카디션 프로덕드를 CROSS JOIN 예약어로 수행
    • EMP 테이블과 DEPT 테이블의 CROSS JOIN
SELECT * 
FROM EMP, DEPT;

SELECT * 
FROM EMP CROSS JOIN DEPT;

 

  • ANSI INNER JOIN
    • EQUI JOIN을 대신하는 문법
  • 기본 형식
FROM 테이블이름 INNER JOIN 테이블이름
ON 조인조건;

📍EMP 테이블과 DEPT 테이블을  DEPTNO 컬럼을 이용해서 JOIN

SELECT * 
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO

SELECT * 
FROM EMP INNER JOIN DEPT
ON EMP.DEPTNO = DEPT.DEPTNO;

 

📍컬럼 이름이 같은 경우는 ON 대신에 USING(컬럼 이름)으로도 가능하게

SELECT * 
FROM EMP INNER JOIN DEPT
USING(DEPTNO);

 

📍컬럼 이름이 같은 경우 INNER JOIN 대신에 NATURAL JOIN 이라고 수정해서 하면 JOIN 조건 생략 가능

SELECT * 
FROM EMP NATURAL JOIN DEPT;

-- USING 과 NATURAL JOIN을 이용하는 경우 조인에 사용된 컬럼은 1번만 출력

 

 

9) OUTER JOIN

  • 한 쪽 테이블에만 존재하는 데이터도 JOIN에 참여하는 것
  • LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN이 있는데 MariaDB에서는 FULL OUTER JOIN은 지원하지 않음

📍EMP 테이블에서 DEPTNO와 DEPT 테이블의 DEPTNO를 조회

  • EMP 테이블에는 DEPTNO가 10, 20, 30 이 존재하고 DEPT 테이블에는 DEPTNO가 10, 20, 30, 40 이 존재
SELECT DEPTNO
FROM EMP;

SELECT DEPTNO
FROM DEPT;

SELECT *
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;

 

📍LEFT OUTER JOIN을 수행하면 왼쪽 테이블의 모든 데이터가 JOIN에 참여

SELECT *
FROM EMP LEFT OUTER JOIN DEPT
ON EMP.DEPTNO = DEPT.DEPTNO;

 

📍RIGHT OUTER JOIN을 수행하면 오른쪽 테이블의 모든 데이터가 JOIN에 참여

SELECT *
FROM EMP RIGHT OUTER JOIN DEPT
ON EMP.DEPTNO = DEPT.DEPTNO;
-- 이 경우는 DEPT 테이블의 DEPTNO가 40인 데이터도 조인에 참여

 

📍FULL OUTER JOIN을 하고자 하는 경우에는 LEFT OUTER JOIN 과 RIGHT OUTER JOIN의 UNION으로 수행

SELECT * 
FROM EMP LEFT OUTER JOIN DEPT
ON EMP.DEPTNO = DEPT.DEPTNO
UNION
SELECT * 
FROM EMP RIGHT OUTER JOIN DEPT
ON EMP.DEPTNO = DEPT.DEPTNO;

 

 

 

10) 다중 조인

  • JOIN을 두 번 이상 수행하는 것
  • JOIN의 결과도 하나의 테이블이므로 연속해서 JOIN을 사용할 수 있습니다.
SELECT * 
FROM CCAR C
INNER JOIN
TMAKER M
ON C.MAKER = M.MAKER INNER JOIN tCity T ON M.factory = T.name;

 

5. DML

1) 개요

  • 데이터 조작 언어
  • 예전에는 SELECT, INSERT, DELETE, UPDATE 4가지였는데, 최근에는 SELECT는 DQL로 분리하는 경우가 많다.
  • INSERT와 DELETE 그리고 UPDATE는 TRANSACTION과 관련성이 있음

 

2) 데이터 삽입

  • 기본 형식
INSERT INTO 테이블이름(필드목록) VALUES (값을 나열);

 

  • 필드 목록을 생략하면 모든 값을 순서대로 대입
  • AUTO_INCREMENT가 설정된 컬럼은 값을 생략하면 일련번호가 들어가고
  • DEFAULT가 설정된 경우는 기본값이 들어가고
  • 그 이외의 경우는 NULL이 대입된다.

 

📍tCity 테이블에 데이터 삽입

  • tCity: name, area, popu, metro, region으로 구성된 테이블
INSERT INTO tCity(name, area, popu, metro, region) VALUES('목포', 22, 30, 'n', '전라');
INSERT INTO tCity VALUES('마산', 35, 50, 'n', '경상');
  • 여러개의 데이터를 한 번에 삽입
-- INSERT INTO 테이블이름(필드목록) VALUES (값을 나열),(값을 나열),(값을 나열)...;

INSERT INTO tCity VALUES('울산', 95, 150, 'y', '경상'),('창원', 55, 100, 'y', '경상');

 

📍[SELECT 삽입] VALUES 대신에 SELECT 구문을 사용하면 된다.

  • SELECT 구문의 결과를 가지고 삽입
INSERT INTO tStaff(name, depart, gender, joindate, grade, salary, score)
SELECT name, region, metro, '20251229', '신입', area, popu
FROM tCity
WHERE region = '경기';

 

📍[SELECT 삽입] SELECT 구문을 이용해서 새로운 테이블 생성

CREATE TABLE 테이블이름 AS
SELECT 구문;

 

📍[SELECT 삽입 (COPY)] DEPT 테이블의 모든 데이터를 소유하는 DEPT01 테이블 생성

CREATE TABLE DEPT01
SELECT * 
FROM DEPT;

 

📍[WHERE 0=1] DEPT 테이블의 구조만 복사해서 DEPT02 테이블을 생성

-- WHERE를 거짓으로 쓰면 내용 없이 구조만 복사 가능
CREATE TABLE DEPT02
SELECT * 
FROM DEPT
WHERE 0=1;

SELECT * FROM DEPT02;

 

📍[IGNORE] DEPT02에 테이블에 데이터 3개 삽입

  • 여러 삽입 구문을 스크립트로 만들어서 삽입하는 경우 ICNORE를 사용하면 중간에 오류가 발생하더라도 계속 삽입이 가능하다.
-- 3줄을 한 번에 실행 (드래그 ALT+X) 하면
-- 총무부의 AREA가 너무 길어서 오류가 난다. 그래서 인사부도 안 들어간다.
INSERT INTO DEPT02 VALUES(10, '영업부', '서울');
INSERT INTO DEPT02 VALUES(20, '총무부', '서울시양천구목동삼성쉐르빌1동203호');
INSERT INTO DEPT02 VALUES(30, '인사부', '서울');

SELECT *
FROM DEPT02;

 

  • IGNORE를 쓰면 강제로 넣을 수 있다.
INSERT IGNORE INTO DEPT02 VALUES(10, '영업부', '서울');
INSERT IGNORE INTO DEPT02 VALUES(20, '총무부', '서울시양천구목동삼성쉐르빌1동203호');
INSERT IGNORE INTO DEPT02 VALUES(30, '인사부', '서울');

SELECT *
FROM DEPT02;

 

3) 데이터 삭제

  • 기본 형식
DELETE FROM 테이블이름
[WHERE 조건];
-- 만약 WHERE 절이 없으면 테이블의 모든 데이터를 삭제

 

📍DEPT02 테이블에서 DEPTNO가 10인 데이터를 삭제

DELETE FROM DEPT WHERE DEPTNO = 10;

 

📍DEPT02 테이블의 모든 데이터 삭제

DELETE FROM DEPT02;

 

4) 데이터 수정

  • 기본 형식
UPDATE 테이블이름
SET 수정할내용
[WHERE 조건]
-- 조건이 없으면 테이블의 모든 데이터를 수정

 

📍DEPT01 테이블에서 DEPTNO가 10인 데이터의 LOC를 제주로 DNAME을 비서실로 수정

UPDATE DEPT01
SET LOC='제주', DNAME='비서실'
WHERE DEPTNO = 10;

 

6. TCL

1) Transaction

  • 데이터베이스 작업의 논리적 단위
  • 데이터의 일관성을 유지하기 위해서 도입
  • 성질(ACID)
    • Atomicity(원자성): ALL OR NOTHING, 모두 성공하거나, 하나라도 실패하면 전부 취소
    • Consistency(일관성): 트랜잭션 수행 전과 수행 후가 일관성이 있어야 함
    • Isolation(격리성): 다른 트랙잭션과 격리 되어야 한다.
    • Durability(영속성): 한 번 완료된 트랜잭션은 영원히 반영되어야 한다.

 

2) 임시 작업 영역

  • 데이터베이스에서의 작업은 임시 작업 영역을 통해서 이루어진다
  • 임시 작업 영역 때문에 트랜잭션의 일관성이 유지된다.
  • EX) PPT는 원본에서 수정하지 않고, 작업 영역이 따로 주어진다.

 

3) 관련 명령어

  • COMMIT: 작업 완료
  • ROLLBACK:작업 취소
  • SAVEPOINT: 중간 저장점

 

4) COMMIT과 ROLLBACK 되는 상황

  • COMMIT이 되는 상황
    • 명시적으로 COMMIT을 수행
    • DDL이나 DCL 수행을 한 경우
    • 접속도구가 정상적으로 종료된 경우
  • ROLLBACK 되는 상황
    • 명시적으로 ROLLBACK을 수행하는 경우
    • 접속도구의 비정상 종료

 

5) 트랜잭션의 모드

  • 자동: SQL 문장을 수행하면 자동으로 COMMIT 되는 것
  • 수동: 명시적으로 COMMIT을 수행해야만 COMMIT
  • 실습을 위한 테이블 복사
CREATE TABLE DEPTCOPY
SELECT *
FROM DEPT;

 

📍데이터 한 개를 삽입하고 ROLLBACK

INSERT INTO DEPTCOPY VALUES(50, '비서', '서울');
SELECT * FROM DEPTCOPY;

ROLLBACK;

-- 50 삽입했던 작업이 취소됩니다.
SELECT * FROM DEPTCOPY;

 

📍데이터 한 개를 삽입하고 COMMIT, ROLLBACK

INSERT INTO DEPTCOPY VALUES(50, '비서', '서울');
SELECT * FROM DEPTCOPY;

COMMIT;

ROLLBACK;

-- 50 삽입했던 작업이 취소되지 않음
SELECT * FROM DEPTCOPY;

 

📍데이터 한 개를 삽입하고 DDL을 수행하고 ROLLBACK

INSERT INTO DEPTCOPY VALUES(60, '비서', '서울');
SELECT * FROM DEPTCOPY;

-- DDL 문장이어서 자동 COMMIT
TRUNCATE TABLE DEPT02;

ROLLBACK;

-- 60 삽입했던 작업이 취소되지 않음
SELECT * FROM DEPTCOPY;

 

📍SAVEPOINT 사용

INSERT INTO DEPTCOPY VALUES(70, '비서', '서울');
SELECT * FROM DEPTCOPY;

SAVEPOINT S1;

INSERT INTO DEPTCOPY VALUES(80, '비서', '서울');
SELECT * FROM DEPTCOPY;

ROLLBACK TO S1;

-- 70 삽입했던 작업이 취소되지 않음
SELECT * FROM DEPTCOPY;