SQL(Structured Query Language)

1. SQL 정의 및 특징

데이터베이스를 사용할 때, 데이터베이스에 접근할 수 있는 데이터베이스 하부 언어인 구조적 질의어 (Structured Query Language)

관계형 데이터베이스 관리 시스템(RDBMS)의 데이터를 관리 및 처리하기 위해 설계된 질의(Query) 언어

단순하게 질의만을 수행하는 것이 아니라 데이터베이스의 모든 작업을 통제하는 비절차적(Non-procedural) 언어

종합적인 데이트베이스 언어 - 데이터 정의, 조작, 제어

 

- SQL은 기본적으로 대소문자를 구분하지 않는다. (서버 환경이나 DBMS 종류에 따라 데이터베이스 또는 필드명에 대해 대소문자를 구분 하는 경우도 있고, 데이터베이스 저장된 내용을 검색을 하는 경우에는 대소문자를 구분한다.)

- 무엇(what)을 표시하며, 어떻게(how)는 표시하지 않는다. (어떻게는 DBMS에서 알아서 처리한다.)

- SQL은 데이터 연산에 대한 처리가 절차적으로 진행되지 않고, 데이터의 집합 단위로 처리된다. 

- SQL이전에 SEQUEL은 1974년에 IBM에서 최초의 관계형 데이터베이스 관리 시스템인 System R을 위한 데이터베이스 언어로 개발되었다.

- SQL은 1986년 ANSI에서 관계형 데이터베이스 표준언어로 인증되었다.

 

관계 대수식(Relational Algebra)과 SQL의 차이

관계대수식

- 피연산자 : realtion

- 관계대수식의 결과 : 튜플의 집합, 중복을 허용하지 않음

- 중복을 제거하는 것은 튜플을 정렬하는 것과 같은 문제인데결과 생성시 시간이 오래걸려 성능에 문제가 발생한다.

SQL

- 피연산자 : 튜플의 백(bag)

- SQL 결과 : 튜플들 간의 순서는 없으나, 중복을 허용함

- 튜플 중복을 체크하지 않고 결과를 내기 때문에 결과를 빠르게 파악할 수 있다.

 

 

2. SQL 분류

SQL 명령어는 크게 DDL, DML, DCL 3가지로 나눌 수 있다.

- DDL (Data Definition Language, 데이터 정의 언어) 

테이블과 같은 데이터 구조를 정의하는데 사용되는 명령어들로 (생성, 변경, 삭제, 이름변경) 데이터 구조와 관련된 명령어

데이터베이스나 테이블 생성, 변경, 삭제 등의 작업을 포함한다.

- DML (Data Manipulation Language, 데이터 조작 언어)

데이터베이스에 들어 있는 데이터를 조회하거나 검색하기 위한 명령어

데이터 검색, 삽입, 변경, 삭제 수행을 조작하는 언어로 실질적으로 저장된 데이터를 관리하고 처리한다.

- DCL(Data Control Language, 데이터 제어 언어)

데이터베이스에 접근하고 객체들을 사용하도록 권한을 주고 회수하는 명령어

 

 

2-1. DDL(Data Definition Language) - 데이터 정의어

create, drop, alter : 객체 생성(create), 삭제(drop), 변경(alter)

DB구조, 데이터 형식 , 접근방식, DB를 구축하거나 수정할 목적으로 사용하는 언어

DDL은 입력하는 순간 AUTO COMMIT 되기때문에 영구적이다. (ROLLBACK 불가능)

 

 

1) CREATE - 테이블 생성

CREATE TABLE 테이블명

(컬럼명 데이터타입(데이터길이) [제약조건]);

 

테이블 이름, 컬럼 이름, 데이터 타입, 길이, 제약조건을 지정하면서 테이블을 생성한다.

CREATE TABLE STUDENT
(
    NO INT PRIMARY KEY NOT NULL,
    NAME VARCHAR(30) NOT NULL,
    SCORE NUMBER(4,2),
    MAJOR_NO NUMBER(3),
    STATUS NUMBER(1) DEFAULT 0 
);

데이터 길이 () 의 기본 단위는 BYTE이다. (30BYTE)라고 써도 (30)이라고 생략해도 동일하다.

 

NUMBER(a,b) : 전체 자리수 = a, 소수점 자리수 = b 

NUMBER(3,1) -> 23.1 과 같은 숫자를 저장할 수 있다.

NUMBER(3) -> 123 과 같은 숫자를 저장할 수 있다. (소수점X)

 

제약조건 : NOT NULL, PRIMARY KEY, UNIQUE ...

 

제약조건 자리의 NOT NULL : NULL을 허용하지 않음

DEFAULT는 기본값을 설정하는데, 당연히 NULL이 아니기 때문에 NOT NULL과 공존할 수 없다.

 

위 테이블을 생성할 때는 NO를 PRIMARY KEY로 설정했다.

 

이런 제약 조건은 CONSTRAINT를 이용해서 입력할 수도 있다.

CREATE TABLE PERSON(
PNO CHAR(4BYTE),
PNAME VARCHAR2(15BYTE),
AGE NUMBER(3BYTE),
CONSTRAINT PERSON_PK PRIMARY KEY (PNO),
CONSTRAINT CHECK_AGE CHECK(AGE>1)
);

CONSTRAINT 제약조건이름 PRIMARY KEY (컬럼명)

CONSTRAINT 제약조건이름 CHECK(조건)

 

CONSTRAINT로 두가지 제약조건을 지정해주었다.

PK 제약조건과 CHECK 제약조건은 이와 같이 지정해 줄 수 있다.

제약조건을 위배하는 데이터를 넣게되면 에러가 오류가 발생한다. (check constraint violated)

 

 

2) ALTER TABLE - 테이블 변경

1. 데이터가 존재할 때 기존 데이터보다 작은 크기로 데이터 길이를 변경 할 수 없다.

2. 컬럼에 NULL값만 가지고 있거나 테이블에 행이 없으면 데이터 크기 줄일 수 없다.

3. NULL값만 있으면 데이터 유형 변경할 수 없다.

4. NULL값이 없을 경우에만 NOT NULL 조건 추가할 수 있다.

 

 

- 컬럼 추가

ALTER TABLE 테이블명 ADD 컬럼명 데이터타입

ALTER TABLE STUDENT ADD BIRTH DATE;

DATE형태의 BIRTH 컬럼을 STUDENT 테이블에 추가했다.

ADD COLUMN 형태가 아닌것을 주의하자

 


-컬럼 삭제

ALTER TABLE 테이블명 DROP COLUMN 컬럼명

ALTER TABLE STUDENT DROP COLUMN BIRTH;

BIRTH 컬럼을 삭제했다.

 

 

- 컬럼명 변경

ALTER TABLE 테이블명 RENAME COLUMN 기존 컬럼명 TO 새로운 컬럼명

ALTER TABLE STUDENT RENAME COLUMN MAJOR TO MAJOR_NO;

STUDENT 테이블의 MAJOR를 MAJOR_NO로 컬럼명 변경

 

 

- 테이블명 변경

RENAME 테이블명 TO 새로운테이블명

RENAME STUDENT TO NEW_STUDENT;

테이블 명을 변경할 수 있다.

 

 

- 컬럼 데이터 타입을 변경

ALTER TABLE 테이블명 MODIFY 컬럼명 타입

ALTER TABLE STUDENT MODIFY MAJOR_NO NUMBER(2);

STUDENT 테이블의 MAJOR_NO 컬럼을 NUMBER(2) 형식으로 타입 변경

 

 

- 제약 조건 삭제

ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건명

ALTER TABLE PERSON DROP CONSTRAINT CHECK_AGE;

 

- 제약조건 추가

ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건이름 제약조건

ALTER TABLE PERSON ADD CONSTRAINT CHECK_AGE CHECK(AGE>0);
ALTER TABLE PERSON ADD CONSTRAINT PERSON_PK PRIMARY KEY(PNO);

제약조건에 들어갈 내용은 제약조건을 CREATE TABLE시에 생성할 때와 같다.

제약조건을 바꾸고 싶을 때는 삭제한 뒤에 다시 추가하는 방식으로 한다.

 

 

 

3) DROP - 삭제

DROP TABLE 테이블명

DROP TABLE PERSON;

DDL은 자동으로 COMMIT 되어서, 삭제한 데이터를 복구할 수 없으니 신중히 DROP 해야 한다. (ROLLBACK 불가능) 

 

 

 

2-2. DML(Data Manipulation Language) - 데이터 조작어

데이터 추가(insert), 삭제(delete), 수정(update), 조회(select)

 

 

1) INSERT - 데이터 추가 

INSERT INTO 테이블명(컬럼명1, 컬럼명2, 컬럼명3...) 

VALUES('데이터1', 데이터2, 데이터3...)

* SQL문에서 문자열은 ' ' 작은따옴표로 묶어줌

 

INSERT INTO STUDENT(NO,NAME,MAJOR,SCORE)
VALUES('201501134','홍길동','경제학과',3.3);

컬럼과 데이터 입력은 1:1로 대응되어야 한다.

NO컬럼에는 데이터 A1234

NAME에는 홍길동

MAJOR_NO에는 11

SCORE에는 3.3으로 데이터가 추가된다.

 

 

INSERT INTO STUDENT
VALUES('201501134','홍길동','경제학과',3.3);

컬럼명없이 테이블명만 적고 값을 적어도 가능하다.

테이블내의 열(COLUMN) 순서대로 데이터가 매칭되어 들어간다.

해당 테이블의 모든 컬럼에 데이터를 추가할 경우에는 좋지만, 모든 컬럼에 데이터를 입력하지 않을때 (부분적으로 데이터 추가할때)는 순서 유의해서 입력해야 하기 때문에 컬럼명을 모두 적는 것이 낫다.

 

DML은 자동으로 COMMIT되지 않기때문에 COMMIT은 따로 해줘야한다.

COMMIT하기 전에는 ROLLBACK이 가능하다.

 

 

다중 INSERT문

한줄씩 데이터를 입력하지 않고 한번에 다중 INSERT문을 사용할 수 있다.

INSERT ALL

INTO 테이블명(컬럼명1, 컬럼명2...) VALUES(데이터1,데이터2...)

INTO 테이블명(컬럼명1, 컬럼명2...) VALUES(데이터1,데이터2...)

...

SELECT * FROM DUAL;

SELECT * FROM DUAL;로 마무리해줘야 실행 가능하다. (DUAL은 임시테이블이며 데이터를 확인할 때 사용한다.)

 

INSERT ALL을 사용하면 INSERT를 반복적으로 입력하지 않아도 된다.

INSERT ALL 
INTO MAJOR VALUES(1,'경제학과')
INTO MAJOR VALUES(2,'경영학과')
SELECT * FROM DUAL;

실행하면 "2개 행 이(가) 삽입되었습니다." 출력을 확인할 수있다.

MAJOR 테이블의 모든 컬럼에 데이터를 입력했기 때문에 컬럼명은 동일하게 생략했다.

 

 

 

2) SELECT - 데이터 조회

SELECT 조회할칼럼1, 조회할칼럼2...

FROM 조회할 테이블

 

SELECT 뒤에 입력한 COLUMN의 순서대로 데이터가 조회된다.

테이블의 일부 컬럼만 조회 가능하고, 순서도 임의로 정할 수 있다.

 

 

SELECT MAKER FROM PRODUCT;

PRODUCT 테이블의 MAKER 컬럼 내용을 모두 가져온다. LG의 경우 데이터가 3개 있는데 모두 확인할 수 있다.

 

 

DISTINCT 를 추가하면 중복된 내용없이 데이터를 뽑아낼 수 있다.

SELECT DISTINCT MAKER FROM PRODUCT;

중복된 내용은 한번씩만 출력된다.

 

 

여러 컬럼을 조회하고 싶을 때는 콤마로 연결한다.

SELECT ID, AGE FROM MEMBER;

MEMBER 테이블의 ID, AGE만 조회하고 싶을 때 SELECT를 사용해서 입력하고 실행한다.

 

 

테이블 내의 모든 컬럼 데이터를 조회하고 싶을 때는 * 을 이용하면 컬럼명을 모두 쓰지 않아도 된다.

*는 임의의 문자와 수를 포함한 와일드카드 문자이다.

(와일드카드는 텍스트 값에서 알 수 없는 문자를 사용할 수 있는 특수 문자로, 유사한 데이터들을 찾을 때 유용하다.)

 

SELECT * FROM 테이블 

SELECT * FROM STUDENT;

컬럼명을 모두 쓰지 않고도 STUDENT 테이블의 모든 컬럼 데이터를 조회할 수 있다.

 

 

WHERE 뒤에 비교 연산자를 이용하여 원하는 조건식을 입력하면 된다.

SELECT 조회할칼럼1, 조회할칼럼2...

FROM 조회할 테이블

WHERE 조건식

 

조건식(WHERE) 비교 연산자의 결과는 TRUE, FALSE로 나타낸다.

 

SQL 비교 연산자 종류

= 같음
!= 같지 않음
<> 같지 않음
< 작음
>
<= 작거나 같음
>= 크거나 같음
!< 작지 않음
!> 크지 않음
BETWEEN a AND b  a, b 사이 (a와 b는 포함)
IS NULL NULL임

 

NULL, NOT NULL은 = 같은 비교연산자로 비교할 수 없다.

대신에 NULL을 조건에서 확인하고 싶을 때는 IS NOT NULL, IS NULL을 이용한다.

CONSTRAINT CHECK_NAME CHECK (NAME IS NOT NULL);

CHECK CONSTRAINT에서 NULL, NOT NULL을 조건으로 쓰고 싶을 때도 IS 를 이용했다.

 

 

 

SELECT * FROM STUDENT WHERE SCORE>2.0

학점이 2.0보다 큰 학생들을 조회할 수 있다.

 

 

SELECT * FROM STUDENT WHERE SCORE BETWEEN 2 AND 3;

학점이 2 이상, 3 이하인 학생들을 조회할 수 있다.

BETWEEN에서는 기준 숫자를 포함한다. (이상, 이하)

 

 

EX. 1부터 5까지의 정수 중에 일부 숫자 (EX.3,4,5)만을 가지고 있는 데이터를 찾고 싶을 때

SELECT * FROM STUDENT WHERE MAJOR_NO >=3;
SELECT * FROM STUDENT WHERE MAJOR_NO IN(3,4,5);
SELECT * FROM STUDENT WHERE MAJOR_NO NOT IN(1,2);

예시에서는 연속하는 숫자를 찾는 것이기 때문에 >= 크거나같다는 연산자를 쓸 수 있지만,

IN(a,b,c..) 또한 사용 가능하다. 이것은 연속하지 않은 데이터를 찾을 때 사용하면 편리하다.

반대로 포함하지 않는 NOT IN()도 사용할 수 있다.

 

 

문자열 비교 LIKE

MAME LIKE '홍길동' : NAME 칼럼에 있는 데이터 중에 홍길동과 일치하는 데이터

NAME LIKE '홍%' : 홍으로 시작하는 데이터

NAME LIKE '%홍' : 홍으로 끝나는 데이터

NAME LIKE '%홍%' : 홍을 포함하는 데이터 (홍 앞뒤에 데이터가 꼭 있어야 하는 것은 아니다.)

 

 

SELECT * FROM STUDENT WHERE NAME LIKE '홍%';

홍으로 시작하는 이름을 가진 데이터의 모든 컬럼 정보를 가져온다.

 

 

아닌것을 찾을 때는 NOT LIKE 를 사용한다.

WHERE NOT 컬럼명 LIKE 조건

WHERE 컬럼명 NOT LIKE 조건

둘다 가능하다.

SELECT * FROM STUDENT WHERE NAME NOT LIKE '김%';
SELECT * FROM STUDENT WHERE NOT NAME LIKE '김%';

김씨가 아닌 사람의 모든 컬럼 정보를 가져온다.

 

 

SELECT * FROM USER_TABLES;

모든 테이블을 조회하고 싶을 때는 와일드카드 문자 * 를 이용한다.

 

 

SELECT * FROM USER_CONSTRAINTS;
SELECT * FROM ALL_CONSTRAINTS;

모든 테이블의 제약조건을 확인하고싶을 때는 user_constraints 나 all_constraints를 조회한다.

CONSTRAINT_NAME에는 제약조건을 만들 때 설정해주었던 이름이나 임의의 이름이 들어있다.

 

P PRIMARY KEY 
FOREIGN KEY 
UNIQUE 
CHECK, NOT NULL 

CONSTRAINT_TYPE의 알파벳은 위와 같이 제약조건 종류를 의미한다.

 

 

모든 테이블을 삭제하는 DROP문을 만들고 싶을 때는, 모든 테이블명을 조회하고 이에 명령문을 추가할 수 있다.

SELECT 'DROP TABLE ' || TABLE_NAME || ';' FROM USER_TABLES;

모든 테이블을 조회하는 USER_TABELS의 TABLE_NAME을 가져온다.

DROP TABLE 테이블명 ; 이라는 명령문을 만들고 싶기 때문에 원하는 문장을 ' ' 안에 입력하고 || 으로 연결한다.

자바에서 " " + 변수 + " " 으로 문장을 이어주는 것과 유사하다.

 

 

 

조건을 두개 이상 비교하고 싶을 때는 AND, OR을 사용한다.

 

AND

SELECT * FROM STUDENT WHERE SCORE>=2.0 AND SCORE<=3.0;

STUDENT 테이블에서 SCORE가 2.0이상이고 3.0 이하인 데이터를 조회한다.

위의 SELECT * FROM STUDENT WHERE SCORE BETWEEN 2 AND 3; 와 동일한 결과를 확인 할 수 있다.

 

 

OR

SELECT * FROM STUDENT WHERE SCORE >= 2 OR NAME LIKE '홍%';

SCORE가 2 이상이거나 이름이 홍으로 시작하는 학생 정보를 조회한다.

 

 

_ 또한 와일드카드 문자이다. 하지만 _ 는 하나의 문자만 의미한다. 

SELECT * FROM STUDENT WHERE SNAME LIKE '홍__';

_를 두번 포함했기 때문에 홍으로 시작하는 세글자의 이름만 조회할 수 있다.

홍_ 라고 했을 경우는 홍으로 시작하는 외자 이름만 조회된다.

이것을 모두 포함하고 싶으면 %를 이용하면 된다.

 

 

ROWNUM : 행번호

행번호를 추가해서 조회하고 싶을 때는 ROWNUM을 추가한다.

SELECT ROWNUM, NAME, MAJOR FROM STUDENT;

 

테이블 내 모든 컬럼 : 테이블명.*

SELECT ROWNUM,CAR.* FROM CAR;

행번호와 CAR 테이블의 모든 컬럼을 조회하기 위해 CAR.*을 이용했다.

 

 

테이블명 간단히 지칭하기 

SELECT ROWNUM,C.* FROM CAR C;

CAR을 C로 지칭했고, C.*으로 간단히 쓸 수도있다.

 

 

3) UPDATE - 데이터 수정

UPDATE 테이블명

SET 컬럼=수정할데이터, 컬럼=수정할데이터....

WHERE 조건절 (조건에 맞는 튜플에 대해서 수정하고 싶을 때)

 

 

모든 행의 값을 수정하고 싶을 때,

UPDATE MEMBER
SET ADDRESS = '서울시';

MEMBER 테이블의 전체 데이터 ADDRESS컬럼 값이 서울시로 변경되었다.

 

 

UPDATE MEMBER 
SET AGE = AGE+1;

 MEMBER 테이블 전체 데이터 AGE 컬럼의 나이 데이터를 1씩 증가하였다.

(JAVA 에서는 AGE +=1; AGE ++; 처럼 +=나 ++ 연산자를 사용하지만, SQL에서는 불가능하다.)

 

 

 

조건을 넣고 싶을 때는 WHERE을 추가한다.

UPDATE STUDENT
SET SCORE = SCORE +1 WHERE SCORE+1 =<4.5;

학생 점수(SCORE)를 일괄적으로 1점씩 증가하지만 점수가 4.5를 넘어가면 업데이트 대상에서 제외했다.

SCORE+1을 4.5 이하 조건으로 설정하였다.

 

 

두개이상의 컬럼을 수정하고 싶을 때는 콤마(,)로 연결한다.

UPDATE STUDENT 
SET NAME = '제적', NO = '00000000', SCORE = 0, MAJOR_NO = -1
WHERE SCORE <= 1.5;

학점이 1.5 이하인 학생(조건)은 제적이고 이때 << 학생명 = 제적, 학번 = 00000000, 점수 = 0, 학과변호 = -1 >> 으로 값을 수정했다.

조건에 맞는 (제적을 당할) 학생이 여러명이고, '00000000'으로 변경될 학번이 기본키라면 중복될수가 없다.

이럴 경우에는 기본키는 수정되지 않도록 한다.

기본키가 수정되면 중복의 문제가 생겨서 에러가 발생하니, 주의해서 확인해야 한다.

 

 

4) DELETE - 데이터 삭제

DELETE FROM 테이블 WHERE 조건절

DELETE FROM STUDENT WHERE SCORE < 1.0;

학생 테이블에서 학점이 1.0 미만인 학생 정보를 삭제했다. 

학생의 학점만 삭제되는 것이 아닌, 학점이 1.0 미만인 학생의 이름, 번호, 학점...데이터 행 전체가 삭제된다.

조건을 꼭 적어줘야 원하는 데이터만 삭제할 수 있으니 주의하도록 한다.

 

 

 

2-3. DCL(Data Control Language) - 데이터 제어어

commit, rollback, grant, revoke

데이터베이스에 접근하고 객체들을 사용하도록 권한을 주고 회수하는 명령어

 

 

1) GRANT : DB 권한을 부여

GRANT 권한이나 롤 TO 사용자 [WITH GRANT OPTION]

- with grant option : 부여받은 권한을 다른 사용자에게 다시 부여할 수 있는 권한을 부여

GRANT RESOURCE, CONNECT TO STUDENT;
GRANT CONNECT TO STUDENT;
GRANT DBA TO STUDENT; --DB관리자 계정
GRANT CREATE VIEW TO STUDENT;
GRANT CONNECT,SELECT ANY TABLE TO STUDENT;
GRANT INSERT ANY TABLE, SELECT ANY TABLE TO STUDENT;

 

대표적인 시스템 권한

create Session : 데이터 베이스를 연결할 수 있는 권한

create table : 테이블을 생성할 수 있는 권한

create sequence : 시퀀스를 생성할 수 있는 권한

create view : 뷰를 생성할 수 있는 권한

create procedure : 함수 프로시저를 생성할 수 있는 권한

create role : 오라클 데이터베이스 역할을 생성할 수 있는 권한

alter user: 생성한 사용자의 정의를 변경할 수 있는 권한

drop user: 생성한 사용자를 삭제시키는 권한

drop any table : 임의의 테이블 삭제할 수 있는 권한

query rewrite : 함수 기본 인덱스를 생성하는 권한

backup any table : 임의의 테이블을 백업할 수 있는 권한

 

여러가지 권한을 묶어놓은 것를 롤이라고 한다. 여러 권한을 롤으로 묶으면 사용자에게 권한을 효율적으로 부여할 수 있다. 시스템에서 제공해주는 롤은 CONNECT 롤, RESOURECE 롤, DBA 롤이 있다.

 

CONNECT 롤

사용자가 데이터베이스에 접속 하기 위한 기본적인 시스템 권한 8가지
create session, alter session, create cluster, create database link, create sequence, create synonym, create table, create view

 

RESOURCE 롤

사용자가 객체(테이블, 뷰, 인덱스)를 생성할 수 있는 권한

create cluster, create procedure, create sequence, create table, create trigger

 

DBA 롤

데이터베이스 객체를 관리하고 사용자들을 작성, 변경, 제거할 수 있도록 하는 모든 권한
시스템 자원을 무제한적으로 사용하며 시스템 관리에 필요한 모든 권한을 부여할 수 있는 강력한 권한을 보유한 롤

 

 

2) REVOKE : DB 권한 회수, 해제

REVOKE [GRANT OPTION FOR] 권한 FROM 사용자 [CASCADE]

- grant option for : 다른 사용자에게 권한을 부여할 수 있는 권한을 취소

- cascade : 권한 취소 시 다른 사용자에게 부여한 권한도 연쇄적으로 취소

REVOKE RESOURCE, CONNECT FROM STUDENT;
REVOKE SELECT ANY TABLE FROM STUDENT;

 

사용자에게 부여된 권한을 확인할 수도 있다.

--사용자에게 부여된 시스템에 대한 권한 확인
SELECT * FROM DBA_SYS_PRIVS where grantee = 'STUDENT';
--사용자에게 부여된 롤에 대한 권한 확인
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'STUDENT' ;

 

COMMIT, ROLLBACK, SAVEPOINT은 TCL(Transaction Control Language,트랜잭션 제어어) 으로 분류하기도 한다.

 

3) COMMIT 

데이터를 DB에 저장하고 트랜잭션을 종료

 

4) ROLLBACK

데이터의 변경 사항을 취소하고, 원래 상태로 복귀 후 트랜잭션 종료

 

5) SAVEPOINT

SAVEPOINT POINT1;
ROLLBACK TO POINT1;

저장점을 정의하면 롤백할 때 SAVEPOINT 까지 트랜잭션의 일부만 롤백할 수 있음

(SAVEPOINT 로 저장하고 ROLLBACK TO 로 저장된 곳으로 돌아감)

COMMIT하면 저장했던 SAVEPOINT는 모두 사라진다.