2022. 8. 25. 18:53ㆍ정처기(실기)/SQL 응용
(1) 트랜잭션
1. 트랜잭션의 개념
- 인가받지 않은 사용자로부터 데이터를 보장하기 위해 DBMS가 가져야 하는 특성이자, 데이터베이스 시스템에서 하나의 논리적 기능을 정상적으로 수행하기 위한 작업의 기본 단위이다.
2. 트랜잭션의 특성
특성 | 설명 | 주요기법 |
원자성 (Atomicity) |
트랜잭션을 구성하는 연산 전체가 모두 정상적으로 실행되거나 모두 취소되어야 하는 성질 트랜잭션의 연산 전체가 성공 또는 실패되어야 하는 성질 |
Commit/Rollback 회복성 보장 |
일관성 (Consistency) |
시스템이 가지고 있는 고정요소는 트래잭션 수행 전과 트랜잭션 수행 완료 후의 상태가 같아야 하는 성질 | 무결성 제약조건 동시성 제어 |
격리성=고립성 (Isolation) |
동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않아야 한다는 성질 | Read Uncommitted Read Committed Repeatable Read Serializable |
영속성 (Durability) |
성공이 완료된 트랜잭션의 결과는 영속적으로 데이터베이스에 저장되어야 하는 성질 | 회복기법 |
3. 트랜잭션의 상태 변화
- 활동 상태(Active) : 초기 상태, 트랜잭션이 실행 중일 때 가지는 상태
- 부분 완료 상태(Partially Committed) : 마지막 명령문이 실행된 후에 가지는 상태
- 완료 상태(Committed) : 트랜잭션이 성공적으로 완료된 후 가지는 상태
- 실패 상태(Failed) : 정상적인 실행이 더 이상 진행될 수 없을 때 가지는 상태
- 철회 상태(Aborted) : 트랜잭션이 취소되고 데이터베이스가 트랜잭션 시작 전 상태로 환원된 상태
4. 트랜잭션 제어
트랜잭션 제어언어는 TCL(Transaction Control Language)이라고 하며, 트랜잭션의 결과를 허용하거나 취소하는 목적으로 사용되는 언어를 지칭한다.
- 커밋(COMMIT) : 트랜잭션 확정(트랜잭션을 메모리에 영구적으로 저장하는 명령어)
- 롤백(ROLLBACK) : 트랜잭션 취소(트랜잭션 내역을 저장 무효화시키는 명령어)
- 체크포인트(CHECKPOINT) : 저장 시기 설정(ROLLBACK을 위한 시점을 지정하는 명령어)
5. 병행 제어(일관성 주요 기법)
- 병행 제어는 다수 사용자 환경에서 여러 트랜잭션을 수행할 때, 데이터베이스 일관성 유지를 위해 상호 작용을 제어하는 기법이다.
- 데이터베이스의 공유를 최대화한다.
- 시스템의 활용도를 최대화한다.
- 데이터베이스의 일관성을 유지한다.
- 사용자에 대한 응답시간을 최소화한다.
[1] : 병행 제어 미보장 시 문제점
- 갱신 손실(Lost Update) : 먼저 실행된 트랜잭션의 결과를 나중에 실행된 트랜잭션이 덮어쓸 때 발생하는 오류
- 현황 파악오류(Dirty Read) : 트랜잭션의 중간 수행 결과를 다른 트랜잭션이 참조하여 발생하는 오류
- 모순성(Inconsistency) : 두 트랜잭션이 동시에 실행되어 데이터베이스의 일관성이 결여되는 오류
- 연쇄복귀(Cascading Rollback) : 복수의 트랜잭션이 데이터 공유 시 특정 트랜잭션이 처리를 취소할 경우 트랜잭션이 처리한 곳의 부분을 취소하지 못하는 오류
[2] : 병행 제어 기법의 종류
로킹 : 같은 자원을 액세스하는 다중 트랜잭션 환경에서 DB의 일관성과 무결성을 유지하기 위해 트랜잭션의 순차적 진행을 보장하는 직렬화 기법, 로킹의 특징은 다음과 같음
- 데이터베이스, 파일, 레코드 등은 로킹 단위가 될 수 있음
- 로킹 단위가 작아지면 데이터베이스 공유도가 증가
- 로킹 단위가 작아지면 로킹 오버헤드가 증가
- 한꺼번에 로킹할 수 있는 객체의 크기를 로킹 단위라고 함
낙관적 검증 : 트랜잭션이 어떠한 검증도 수행하지 않고 일단 트랜잭션을 수행하고, 트랜잭션 종료 시 검증을 수행하여 데이터베이스에 반영하는 기법
타임 스탬프 순서 : 트랜잭션과 트랜잭션이 읽거나 갱신한 데이터에 대해 트랜잭션이 실행을 시작하기 전에 타임 스탬프를 부여하여 부여된 시간에 따라 트랜잭션 작업을 수행하는 기법
다중버전 동시성 제어(MVCC) : 트랜잭션의 타임스탬프와 접근하려는 데이터의 타임스탬프를 비교하여 직렬가능성이 보장되는 적절한 버전을 선택하여 접근하도록 하는 기법
6. 데이터베이스 고립화 수준
- 고립화 수준은 다른 트랜잭션이 현재의 데이터에 대한 무결성을 해치지 않기 위해 잠금을 설정하는 정도이다.
- Read Uncommitted : 한 트랜잭션에서 연산(갱신) 중인(아직 커밋되지 않은) 데이터를 다른 트랜잭션이 읽는 것을 허용하는 수준, 연산(갱신) 중인 데이터에 대한 연산은 불허
- Read Committed : 한 트랜잭션에서 연산(갱신)을 수행할 때, 연산이 완료될 때까지 연산 대상 데이터에 대한 읽기를 제한하는 수준, 연산이 완료되어 커밋된 데이터는 다른 트랜잭션이 읽는 것을 허용
- Repeatable read : 선행 트랜잭션이 특정 데이터를 읽을 때, 트랜잭션 종료 시까지 해당 데이터에 대한 갱신, 삭제를 제한하는 수준
- Serializable read : 선행 트랜잭션이 특정 데이터 영역을 순차적으로 읽을 때, 해당 데이터 영역 전체에 대한 접근을 제한하는 수준
7. 회복 기법
- 회복 기법은 트랜잭션을 수행하는 도중 장애로 인해 손상된 데이터베이스를 손상되기 이전의 정상적인 상태로 복구시키는 작업이다.
[1] : 회복 기법 종류
- 로그 기반 회복 기법인 지연 갱신 회복 기법, 즉각 갱신 회복 기법, 체크 포인트 회복 기법, 그림자 페이징 회복 기법이 있다.
- 자연 갱신 회복 기법(Deffered Update) : 트랜잭션이 완료되기 전까지 데이터베이스에 기록하지 않는 기법
- 즉각 갱신 회복 기법(Immediate Update) : 트랜잭션 수행 중 갱신 결과를 바로 DB에 반영하는 기법
- 체크 포인트 회복 기법(Checkpoint Recovery) : 장애 발생 시 검사점 이후에 처리된 트랜잭션에 대해서만 장애 발생 이전의 상태로 복원시키는 회복 기법
- 그림자 페이징 회복 기법(Shadow Paging Recovery) : 데이터베이스 트랜잭션 수행 시 복제본을 생성하여 데이터베이스 장애 시 이를 이용해 복구하는 기법
(2) DDL
- 데이터 정의어는 데이터를 정의하는 언어로서 '데이터를 담는 그릇을 정의하는 언어'이다.
- 테이블과 같은 데이터 구조를 정의하는 데 사용되는 명령어들로 특정 구조를 생성, 변경, 삭제, 이름을 바꾸는 데이터 구조와 관련된 명령어들을 데이터 정의어라고 부른다.
[1] : DDL의 대상
- 도메인 : 하나의 속성이 가질 수 있는 원자값들의 집합, 속성의 데이터 타입과 크기, 제약조건 등의 정보
- 스키마 : 데이터베이스의 구조, 제약조건 등의 정보를 담고 있는 기본적인 구조, 스키마는 외부/개념/내부 3계층으로 구성되어 있음
- 외부 스키마 : 사용자나 개발자의 관점에서 필요로 하는 데이터베이스의 논리적 구조, 사용자 뷰를 나타냄, 서브 스키마라 불림
- 개념 스키마 : 데이터베이스의 전체적인 논리적 구조, 전체적인 뷰를 나타냄, 개체 간의 관계, 제약조건, 접근 권한, 무결성, 보안에 대해 정의
- 내부 스키마 : 물리적 저장장치의 관점에서 보는 데이터베이스 구조, 실제로 데이터베이스에 저장될 레코드의 형식을 정의하고 저장 데이터 항목의 표현 방법, 내부 레코드의 물리적 순서 등을 표현
- 테이블 : 데이터 저장 공간
- 뷰 : 하나 이상의 물리 테이블에서 유도되는 가상의 테이블
- 인덱스 : 검색을 빠르게 하기 위한 데이터 구조
1. 테이블
- 테이블은 데이터를 저장하는 항목인 필드들로 구성된 데이터의 집합체이다.
- 하나의 DB 내에 여러 개의 테이블로 구성될 수 있고, 릴레이션 혹은 엔티티라고도 불린다.
▼ 테이블 관련 용어
- 튜플/행 : 테이블 내의 행을 의미하며 레코드라고도 함, 튜플은 릴레이션에서 같은 값을 가질 수 없음
- 애트리뷰트/열 : 테이블 내의 열을 의미, 열의 개수를 디그리라고 함
- 식별자 : 여러 개의 집합체를 담고 있는 관계형 데이터베이스에서 각각의 구분할 수 있는 논리적인 개념
- 카디널리티 : 튜플의 개수
- 차수 : 애트리뷰트의 개수
- 도메인 : 하나의 애트리뷰트가 취할 수 있는 같은 타입의 원자값들의 집합
2. 뷰
- 뷰는 논리 테이블로서 사용자에게 테이블과 동일하다.
- 아래 그림에서 '테이블 A'와 '테이블 B'는 물리 테이블을 의미하고, '뷰 C'는 두 개의 테이블을 이용하여 생성한 뷰를 의미한다.
- 뷰는 '테이블 A'와 같은 하나의 물리 테이블로부터 생성 가능하며, 다수의 테이블 또는 다른 뷰를 이용해 만들 수 있다.
- 뷰와 같은 결과를 만들기 위해 조인 기능을 활용할 수 있으나, 뷰가 만들어져 있다면 사용자는 조인 없이 하나의 테이블을 대상으로 하는 단순한 질의어를 사용할 수 있다.
▼ 뷰의 특징
- 논리적 데이터 독립성 제공 : 데이터베이스에 영향을 주지 않고 애플리케이션이 원하는 형태로 데이터에 접근 가능
- 데이터 조작 연산 간소화 : 애플리케이션이 원하는 형태의 논리적 구조를 형성하여 데이터 조작 연산을 간소화
- 보안 기능 제공 : 특정 필드만을 선택해 뷰를 생성할 경우 애플리케이션은 선택되지 않은 필드의 조회 및 접근 불가
- 뷰 변경 불가 : 뷰 정의는 ALTER 문을 이용하여 변경할 수 없음
뷰의 목적
- 뷰를 사용하는 주된 이유는 단순 질의어를 사용할 수 있기 때문이다.
- FROM 절에 있는 하나의 뷰를 통해 뷰를 구성하는 복수의 테이블을 대체하는 단순성에 그 의의가 있다.
- 테이블의 중요 데이터 일부만을 제공할 수 있는 장단점이 있다.
▼ 뷰의 장점과 단점
<장점>
- 논리적 독립성 제공 : 뷰는 논리 테이블
- 사용자 데이터 관리 용이 : 복수 테이블에 존재하는 여러 종류의 데이터에 대해 단순한 질의어 사용이 가능
- 데이터 보안의 용이 : 중요 보안 데이터를 저장 중인 테이블에는 접근 불허, 해당 테이블의 일부 정보만을 볼 수 잇는 뷰에는 접근을 허용, 보안 데이터에 대한 접근 제어 가능
<단점>
- 뷰 자체 인덱스 불가 : 인덱스는 물리적으로 저장된 데이터를 대상으로 하기에 논리적 구성인 뷰 자체는 인덱스를 가지지 못함
- 뷰 정의 변경 불가 : 뷰의 정의를 변경하려면 뷰를 삭제하고 재생성
- 데이터 변경 제약 존재 : 뷰의 내용에 대한 삽입, 삭제, 변경 제약이 있음
3. 인덱스
- 인덱스는 검색 연산의 최적화를 위해 데이터베이스 내 값에 대한 주소 정보로 구성된 데이터 구조이다.
- 인덱스는 데이터를 빠르게 찾을 수 있는 수단으로서, 테이블에 대한 조회 속도를 높여 주는 자료 구조이다.
- 인덱스는 테이블의 특정 레코드 위치를 알려 주는 용도로 사용한다.
▼ 인덱스의 특징
- 기본 키 컬럼은 자동으로 인덱스가 생성된다.
- 연월일이나 이름을 기준으로 하는 인덱스는 자동으로 생성되지 않는다.
- 테이블의 컬럼에 인덱스가 없는 경우, 테이블의 전체 내용을 검색한다.
- 인덱스가 생성되어 있을 때 데이터를 빠르게 찾을 수 있다.
- 조건절에 '='로 비교되는 컬럼을 대상으로 인덱스를 생성하면 검색 속도를 높일 수 있다.
▼ 인덱스의 종류
- 순서 인덱스 : 데이터가 정렬된 순서로 생성되는 인덱스
- 해시 인덱스 : 해시 함수에 의해 직접 데이터에 키 값으로 접근하는 인덱스
- 비트맵 인덱스 : 각 컬럼에 적은 개수 값이 저장된 경우 선택하는 인덱스
- 함수기반 인덱스 : 수식이나 함수를 적용하여 만든 인덱스
- 단일 인덱스 : 하나의 컬럼으로만 구성한 인덱스
- 결합 인덱스 : 두 개 이상의 컬럼으로 구성한 인덱스
- 클러스터드 인덱스 : 기본 키 기준으로 레코드를 묶어서 저장하는 인덱스
▼ 인덱스의 스캔 방식
- 인덱스 범위 스캔 - 인덱스 루트 블록에서 리프 블록까지 수직적으로 탐색한 후에 리프 블록을 필요한 범위만 스캔하는 방식
- 인덱스 전체 스캔 - 수직점 탐색 없이 인덱스 리프 블록을 처음부터 끝까지 수평적으로 탐색하는 방식
- 인덱스 단일 스캔 - 수직적 탐색만으로 데이터를 찾는 스캔 방식
- 인덱스 생략 스캔 - 선두 컬럼이 조건 절에 빠졌어도 인덱스를 활용하는 스캔 방식
4. DDL 명령어
CREATE : 데이터베이스 오브젝트 생성하는 명령어
ALTER : 데이터베이스 오브젝트 변경하는 명령어
DROP : 데이터베이스 오브젝트 삭제하는 명령어
TRUNCATE : 데이터베이스 오브젝트 내용 삭제하는 명령어
[1] : CREATE 명령어
- CREATE TABLE에 들어갈 수 있는 제야곶건으로는 기본 키, 외래 키, UNIQUE, NOT NULL, CHECK, DEFAULT가 있다.
▼ CREATE TABLE 제약조건
- PRIMARY KEY : 테이블의 기본 키를 정의, 유일하게 테이블의 각 행을 식별
- FOREIGN KEY : 외래 키를 정의, 참조 대상을 테이블로 명시, 열과 참조된 테이블의 열 사이의 외래 키 관계를 적용하고 설정
- UNIQUE : 테이블 내에서 얻은 유일한 값을 갖도록 하는 제약조건
- NOT NULL : 해당 컬럼은 NULL 값을 포함하지 않도록 하는 제약조건
- CHECK : 개발자가 정의하는 제약조건, 참이어야 하는 조건을 지정
- DEFAULT : 데이터를 INSERT 할 때, 해당 컬럼의 값을 넣지 않는 경우 기본값으로 설정해 주는 제약조건
▼ ALTER TABLE
- 테이블을 수정하는 명령이다.
- 테이블에 필요한 컬럼을 추가하는 문법이다.
- CREATE TABLE의 컬럼에 사용되는 제약조건인 PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL, CHECK, DEFAULT를 ALTER TABLE에서도 사용할 수 있다.
[2] : DROP TABLE
-테이블을 삭제하는 명령이다.
- DROP TABLE의 명령어의 옵션에는 CASCADE와 RESTRICT가 있다.
- CASCADE와 RESTRICT의 경우 외래 키가 걸려 있을 때 해당한다.
- CASCADE : 참조하는 테이블까지 연쇄적으로 제거하는 옵션
- RESTRICT : 다른 테이블에 삭제할 테이블을 참조 중이면 제거하지 않는 옵션
[3] : TRUNCATE TABLE
- 테이블 내의 데이터들을 삭제하는 명령어다.
[4] : VIEW 관련 DDL
1. CREATE VIEW
- 뷰를 생성하는 명령어
ex) CREATE VIEW 뷰이름 AS 조회쿼리;
- 뷰 테이블의 SELECT 문에는 UNION이나 ORDER BY 절을 사용할 수 없다.
- 컬럼명을 기술하지 않으면 SELECT문의 컬럼명이 자동으로 사용된다.
2. CREATE OR REPLACE VIEW
- 뷰를 교체하는 명령이다.
- OR REPLACE라는 키워드를 추가하는 것을 제외하고는 CREATE VIEW와 사용 방법이 동일하다.
ex) CREATE OR REPLACE VIEW 뷰이름 AS 조회쿼리;
3. DROP VIEW
ex) DROP VIEW 뷰이름;
[5] : INDEX 관련 DDL
1. CREATE INDEX
- 인덱스를 생성하는 명령이다.
- UNIQUE는 생략 가능하고, 인덱스 걸린 컬럼에 중복 값을 허용하지 않는다.
- 복수 컬럼을 인덱스로 걸 수 있다.
ex) CREATE [UNIQUE] INDEX 인덱스명 ON 테이블명(컬럼명1, 컬럼명2, ......)
2. ALTER INDEX
- 인덱스를 수정하는 명령어다.
- 일부 DBMS는 ALTER INDEX를 제공하지 않는다.
- 기존 인덱스를 삭제하고 신규 인덱스를 생성하는 방식으로 사용을 권고한다.
ex) ALTER [UNIQUE] INDEX 인덱스명 ON 테이블명(컬럼명1, 컬럼명2, .......)
3. DROP INDEX
- 인덱스를 삭제하는 명령어이다.
ex) DROP INDEX 인덱스명;
(3) DML
데이터 조작어의 개념
- 데이터 조작어는 데이터베이스에 저장된 자료들을 입력, 수정, 삭제, 조회하는 언어이다.
- 데이터 조작어의 유형에는 SELECT, INSERT, UPDATE, DELETE가 있다.
유형 | 동작 | 설명 |
SELECT | 조회 | 테이블 내 컬럼에 저장된 데이터를 조회 |
INSERT | 삽입 | 테이블 내 칼럼에 데이터를 추가 |
UPDATE | 갱신 | 테이블 내 컬럼에 저장된 데이터를 수정 |
DELETE | 삭제 | 테이블 내 컬럼에 저장된 데이터를 삭제 |
1. SELECT 명령어
- 데이터의 내용을 조회할 때 사용하는 명령어이다.
- SELECT 절, FROM 절, WHERE 절, GROUP BY 절, HAVING 절, ORDER BY 절로 구성된다.
- SELECT 절 : 검색하고자 하는 속성명, 계산식을 기술, 속성명 별칭은 AS를 사용하며 생략 가능함, 2개 이상의 테이블을 대상으로 검색할 때는 '테이블명, 속성명'으로 표현, 술어 부분은 ALL이 기본값
- ALL : 모든 튜플을 검색할 때 사용, SELECT 뒤에 명시하지 않은 경우 ALL로 인식
- DISTINCT : 중복된 속성이 조회될 경우 그중 한 개만 검색
- FROM 절 : 질의에 의해 검색될 데이터들을 포함하는 테이블명을 기술
- WHERE 절 : 검색할 조건을 기술
- GROUP BY 절 : 속성값을 그룹으로 분류하고자 할 때 사용
- HAVING 절 : GROUP BY에 의해 분류한 후 그룹에 대한 조건 지정
- ORDER BY 절 : 속성값을 정렬하고자 할 때 사용
2. 조인
- 조인은 두 개 이상의 테이블을 연결하여 데이터를 검색하는 방법이다.
- 두 릴레이션으로부터 관련된 튜플들을 결합하여 하나의 튜플로 만드는 가장 대표적인 데이터 연결 방법이다.
▼ 논리적 조인 유형(상세)
- 내부 조인 : 공통 존재 컬럼의 값이 같은 경우를 추출하는 기법
- 외부 조인
- 왼쪽 외부 조인 : 왼쪽 테이블의 모든 데이터와 오른쪽 테이블의 동일 데이터를 추출하는 기법
- 오른쪽 외부 조인 : 오른쪽 테이블의 모든 데이터와 왼쪽 테이블의 동일 데이터를 추출하는 기법
- 완전 외부 조인 : 양쪽의 모든 데이터를 추출하는 기법
- 교차 조인 : 조인 조건이 없는 모든 데이터 조합을 추출하는 기법
- 셀프 조인 : 자기 자신에게 별칭을 지정한 후 다시 조인하는 기법
3. 서브쿼리
- 서브쿼리는 SQL문 안에 포함된 또 다른 SQL문이다.
- 서브쿼리의 용도는 알려지지 않은 기준을 위한 검색을 위해 사용한다.
- 메인쿼리와 서비쿼리 관계는 주종 관계로서, 서브쿼리에 사용되는 컬럼 정보는 메인쿼리의 컬럼 정보를 사용할 수 있으나 역으로는 성립하지 않는다.
▼서브쿼리 유형(위치 기준)
- FROM절 서브쿼리 : 서브쿼리가 FROM 절 안에 들어있는 형태, 인라인 뷰라고 불림, 뷰처럼 결과가 동적으로 생성된 테이블 형태로 사용할 수 있음
- WHERE절 서브쿼리 : 서브쿼리가 WHERE절 안에 들어있는 형태, 중첩 서브쿼리라고도 불림
4. 집합 연산자
- 집합 연산자는 테이블을 집합 개념으로 보고, 두 테이블 연산에 집합 연산자를 사용하는 방식이다.
- 집합 연산자는 여러 질의 결과를 연결하여 하나로 결합하는 방식을 사용한다.
집합 연산자 | 설명 |
UNION | 중복 행이 제거된 쿼리 결과를 반환하는 집합 연산자 |
UNION ALL | 중복 행이 제거되지 않은 쿼리 결과를 반환하는 집합 연산자 |
INTERSECT | 두 쿼리 결과에 공통적으로 존재하는 결과를 반환하는 집합 연산자 |
MINUS | 첫 쿼리에 있고 두 번째 쿼리에는 없는 결과를 반환하는 집합 연산자 |
(4) DCL
- 데이터 제어어는 데이터베이스 관리자가 데이터 보안, 무결성 유지, 병행 제어, 회복을 위해 관리자(DBA)가 사용하는 제어용 언어이다.
- 데이터 제어어의 유형에는 GRANT, REVOKE가 있다.
- GRANT : 관리자가 사용자에게 데이터베이스에 대한 권한을 부여하는 명령어
- REVOKE : 관리자가 사용자에게 부여했던 권한을 회수하기 위한 명령어
'정처기(실기) > SQL 응용' 카테고리의 다른 글
절차형 SQL 활용하기 (0) | 2022.09.04 |
---|---|
집계성 SQL 작성 (0) | 2022.09.03 |