DB

SQL DDL DML +트랜잭션

짱코딩러 2022. 8. 5. 10:34

 

 

DDL(Data Definition Language)

자동으로 커밋됨(명령어가 실패해도 커밋댐;; 걍 커밋광공임)

ex) DELECT(DML)는 롤백이 되는데, TRUNCATE(DDL)는 롤백안댐

 

정의

 

데이터 타입

데이터베이스의 테이블에 특정 자료를 입력할 때, 그 자료를 받아 들일 공간을 자료의 유형별로 나누는 기준

이름  비고
CHAR(size) 고정 길이 문자 데이터. VARCHAR2와 동일한 형태의 자료를 저장할 수 있고, 입력된 자료의 길이와는 상관없이 정해진 길이만큼 저장 영역 차지. 최소 크기는 1
VARCHAR2(size) Up to 2000 Bytes 가변 길이 문자 데이터. 실제 입력된 문자열의 길이만큼 저장 영역을 차지. 최대 크기는 명시해야 하며, 최소 크기는 1
NUMBER Internal Number Format 최고 40자리까지의 숫자를 저장할 수 있습니다. 이때 소수점이나 부호는 길이에 포함되지 않는다.
NUMBER(w) W자리까지의 수치로 최대 38자리까지 가능하다. (38자리가 유효 숫자이다.)
NUMVER(w, d) W는 전체 길이, d는 소수점 이하 자릿수이다. 소수점은 자릿수에 포함되지 않는다.
DATE BC 471211~AD 47121231일까지의 날짜
LONG 가변 길이의 문자형 데이터 타입, 최대 크기는 2GB
LOB 2GB까지의 가변 길이 바이너리 데이터를 저장시킬 수 있습니다. 이미지 문서, 실행 파일을 저장할 수 있습니다.
ROWID ROWIDTree-piece Format을 갖음.
ROWIDDB에 저장되어 있지 않으며, DB Data도 아니다.
BFILE 대용량의 바이너리 데이터를 파일 형태로 저장
최대 4GB
TIMESTAMP(n) DATE 형의 확장된 형태
INTERVAL YEAR TO MONTH 년과 월을 이용하여 기간을 저장
INTERVAL DAY TO SECOND , , , 초를 이용하여 기간을 저장
두 날짜 값의 정확한 차이를 표현하는데 유용하다.
INTERVAL DAY(일수에 대한 자릿수) TO SECOND(초에 대한 자릿수)
INTERVAL YEAR(년도에 대한 자릿수) TO MONTH(달에 대한 자릿수)
=>자릿수를 지정해주지 않으면 디폴트값은 2자리

 

CREATE TABLE : 테이블 생성

새롭게 테이블 생성하기
CREATE TABLE 테이블명 (
        칼럼명1    데이터타입    [디폴트 형식],
        칼럼명2    데이터타입    [디폴트 형식],
        칼럼명3    데이터타입    [디폴트 형식]);

기존 테이블을 복제 생성하기
CREATE TABLE 생성할 테이블명
AS
SELECT 칼럼명 FROM 복제할 테이블명
WHERE절로 원하는 행만 선택해서 복사생성 할 수 있다.
(WHERE 0=1 을 적어주면 구조만 복사해올 수 있다.)

 

변경

 

ALTER TABLE

-ADD COLUMN절 : 새로운 칼럼 추가

ALTER TABLE 테이블명
ADD (추가할 컬럼명, 데이터타입);

-MODIFY COLUMN절 : 기존 칼럼 수정

ALTER TABLE 테이블명
MODIFY (수정할 컬럼명, 데이터타입);

-DROP COLUMN절 : 기존 칼럼 삭제

ALTER TABLE 테이블명
DROP COLUMN 삭제할 칼럼명;

 

RENAME : 테이블의 이름을 변경

RENAME 기존의 테이블명 TO 변경할 테이블명

 

 

삭제

 

SET UNUSED : 사용량이 적은 시간에 삭제할 수 있도록 컬럼을 미사용으로만 표시해 두는 용도.(데드락 방지)

사용을 논리적으로 제한함(실제로는 삭제X).

*데드락 : 삭제가 진행되는 시점에서 다른 사용자가 DML명령어로 접근한다면 락이 걸림

               (다른 사용자가 다시 ROLLBACK 해줘야됨)

<컬럼 사용 제한>
ALTER TABLE 테이블명
SET UNUSED(컬럼명);
<실제 삭제 진행>
ALTER TABLE 테이블명
DROP UNUSED COLUMNS;

 

DROP TABLE : 테이블 삭제

DROP TABLE 테이블명;

 

TRUNCATE : 테이블의 데이터를 삭제(구조만 남음) =>자동커밋되므로 롤백 불가능

TRUNCATE TABLE 테이블명;

 

데이터 딕셔너리 뷰

데이터 딕셔너리는 조회가 불가능하므로, 데이터 딕셔너리 뷰를 제공한다.

(제약 조건 정보 확인 가능)

USER _XXXX : 내가 만든 자료만 조회 

ALL_XXXX : 내가 만든 거+ 권한을 부여받은 거 조회

DBA_XXXX : DB에 있는 모든 정보를 조회 (DBA 사용자 권한을 가져야 함)

 

 

 

DML(Data Manipulation Language)

 

INSERT 문 : 테이블에 새로운 데이터를 입력(순서, 개수, 타입에 맞게 입력해줌)

모든 칼럼에 값을 넣어줄 때는 칼럼명을 생략해 주어도 된다.

INSERT INTO 테이블명 (칼럼1, 칼럼2, 칼럼3)
VALUES(값1, 값2, 값3);

 

NULL값 삽입

저장하려는 칼럼의 값만 입력해준다.
INSERT INTO DEPT01 (DEPTNO, DNAME)
VALUES (30, 'SALES');

NULL 혹은 ' '를 사용해 입력해준다.
INSERT INTO DEPT01
VALUES (40, '', NULL);

서브쿼리로 데이터 삽입

INSERT INTO sam01
select empno, ename, job, sal
from emp
where deptno =10;

 

INSERT ALL : 서브쿼리의 결과를 여러 테이블에 동시에 입력

서브쿼리의 컬럼명과 데이터가 입력되는 테이블의 컬럼명이 같아야 한다.

EMP_HIR테이블의 칼럼들과 EMP_MGR테이블의 칼럼들에 한번에 값을 넣는 예제
INSERT ALL
INTO EMP_HIR VALUES(EMPNO, ENAME, HIREDATE)
INTO EMP_MGR VALUES(EMPNO, ENAME, MGR)
SELECT EMPNO, ENAME, HIREDATE, MGR
FROM EMP
WHERE DEPTNO=20;
조건(WHEN)을 넣어줄 수도 있다.
INSERT ALL
WHEN HIREDATE > '1982/01/01' THEN
INTO EMP_HIR02 VALUES(EMPNO, ENAME, HIREDATE)
WHEN SAL >2000 THEN
INTO EMP_SAL VALUES(EMPNO, ENAME, SAL)
SELECT EMPNO, ENAME, HIREDATE, SAL
FROM EMP;

 

UPDATE문 : 테이블에 저장된 데이터를 수정

UPDATE 테이블명
SET 컬럼1 = 값1, 컬럼2 = 값2,...
WHERE 조건;
(조건절이 없는 경우 모든 행이 수정된다.)
서브쿼리를 이용해 한번에 묶어서 변경해 줄수도 있다.
UPDATE DEPT01
SET (DNAME, LOC) = (SELECT DNAME, LOC
                    FROM DEPT
                    WHERE DEPTNO=40)
WHERE DEPTNO=20;

 

DELETE 문 : 테이블에 저장된 데이터를 삭제  =>롤백 가능

DELETE FROM 테이블명
WHERE 조건;
(조건절이 없는 경우 모든 행이 삭제된다.)

 

MERGE : 구조가 같은 두개의 테이블을 하나의 테이블로 합쳐준다.

조건에 따라 INSERT, UPDATE, DELETE를 한번에 수행

MERGE INTO 변경할 테이블명
USING 비교할 테이블명
ON 조건문
WHEN MATCHED THEN	=>조건을 만족할 경우
	UPDATE SET (컬럼명 = 값, ...
    DELETE
WHEN NOT MATCHED THEN	=>조건을 만족하지 않을 경우
	INSERT VALUES (칼럼명,...
MERGE INTO EMP01
USING EMP02
ON(EMP01.EMPNO=EMP02.EMPNO)
WHEN MATCHED THEN
UPDATE SET
EMP01.ENAME     =EMP02.ENAME,
EMP01.JOB       =EMP02.JOB,
EMP01.MGR       =EMP02.MGR,
EMP01.HIREDATE  =EMP02.HIREDATE,
EMP01.SAL       =EMP02.SAL,
EMP01.COMM      =EMP02.COMM,
EMP01.DEPTNO    =EMP02.DEPTNO
WHEN NOT MATCHED THEN
INSERT VALUES(EMP02.EMPNO, EMP02.ENAME, EMP02.JOB, 
                EMP02.MGR, EMP02.HIREDATE, EMP02.SAL, 
                EMP02.COMM, EMP02.DEPTNO);

 

 

트랜잭션

트랜잭션 : '거래'라는 의미로, 오류가 발생하면 모든 작업을 원상태로 되돌려 안정성을 확보하는 방법이다.

  ATM에서 현금을 인출하는 과정에서 오류가 일어나면 돈의 행방이 불분명해지는 등

   문제가 생길 수 있으므로, 인출 과정을 하나의 묶음으로 처리해야 한다.

   이때, 묶음으로 처리하는 것을 트랜잭션이라고 한다.

 

 

트랜잭션 제어를 위한 명령어(TCL) : COMMIT, SAVEPOINT, ROLLBACK

트랜잭션은 마지막으로 실행한 커밋(롤백) 명령 이후부터 새로운 커밋(롤백) 명령을 실행하는 시점까지 수행된 모든 DML 명령들을 의미한다.

DDL문은 자동으로 커밋(AUTO COMMIT)이 발생한다.=>이전 상태로 롤백할 수 없음

 

COMMIT

모든 작업들을 정상적으로 처리하겠다고 확정하는 명령어(저장)

변경된 내용을 모두 영구 저장하고 트랜잭션 과정을 종료한다.

 

SAVEPOINT

트랜잭션을 작게 분할하는 명령어

전체가 아닌 특정 부분에서 트랜잭션을 취소시킬 수 있다.

세이브포인트 지정
SAVEPOINT 세이브포인트이름;

특정 위치까지 롤백
ROLLBACK TO 세이브포인트이름;

 

ROLLBACK

작업 중 문제가 발생되어서 트랜잭션의 처리 과정에서 발생한 변경사항을 취소하는 명령어

트랜잭션 과정을 종료한다.

 

커밋(Commit) 롤백(Rollback)
트랜잭션을 데이터베이스에 반영한다. 트랜잭션을 데이터베이스에 취소한다.
락을 해제한다.  락을 해제한다. 
트랜잭션이 종료된다.  트랜잭션이 종료된다. 
자동 커밋(Auto Commit)은 정상 종료이다.  자동 롤백(Auto Rollback)은 비정상 종료이다.

 

 

'DB' 카테고리의 다른 글

SQL 뷰  (0) 2022.08.06
SQL 제약조건  (0) 2022.08.06
SQL 서브 쿼리  (0) 2022.08.04
SQL Join  (0) 2022.08.04
SQL 함수  (0) 2022.08.03