SQL 전문가 가이드 - 관계형 데이터베이스 개요
제1절 관계형 데이터베이스 개요
데이터베이스
DBMS(Database Management System)는 효율적인 데이터 관리와 데이터 복구 및 손상을 막기위한 기본적인 요구사항을 만족시켜주는 시스템을 말한다.
Database의 발전은 먼저 FileSystem -> 계층형 또는 망형 Database -> 관계형 Database 로 발전하였다.
FileSystem의 단점으로는 많은 사용자가 동시에 CRUD가 힘들기 때문에 관리가 어려우며 이를 해결하기 위해 여러 파일을 복사하여 작업을 할 경우 데이터의 불일치성이 발생한다.
관계형 DB(Relational Database)는 정규화를 통한 테이블 모델링을 통해 이상(Anomaly)현상을 제거하고, 데이터의 중복을 피하며, 동시성 관리, 병행제어등의 기능을 제공한다.
SQL
SQL(Structured Query Language)는 관계형 데이터베이스에서 데이터의 정의(DDL), 데이터 조작(DML), 데이터 제어(DCL)를 하기 위해 사용하는 언어이다. 대부분의 RDBMS의 경우 ANSI/ISO 표준을 따르고 있으며 일부 벤더에 따라 구체적인 용어는 다를 수 있다.
데이터 조작어(DML : Data Manpulation Language)
- SELECT, INSERT, UPDATE, DELETE
- 데이터를 조회하거나 검색(SELECT), 변형(삽입, 삭제, 수정)하는 것들을 DML이라 한다.
데이터 정의어(DDL : Data Definition Language)
- CREATE, ALTER, DROP, RENAME
- 테이블과 같은 데이터 구조를 정의하는데 사용되는 명령어이다.
데이터 제어어(DCL : Data Control Language)
- GRANT, REVOKE
- DB 객체를 접근하는 권한을 관리하는 명령어이다.
트랜잭션 제어어(TCL : Transaction Control Language)
- COMMIT, ROLLBACK
- DML작업 단위를 제어하는 명령어이다.
TABLE
흔히 급하게 메모할때 이곳 저곳에 나열하여 메모하는것보다는 필기 정리하듯이 알아보기 쉽게 데이터를 작성하는것이 데이터를 확인하기 쉽다. 하지만 필기 정리를 하는것보다는 excel처럼 table로 관리하는것이 더 바람직하다.
RDBMS는 기본단위인 테이블 형태로 저장한다. RDBMS는 모든 데이터를 컬럼과 행으로 이루어진 2차원의 구조로 나타낸다. 필드(Field)는 컬럼과 행이 겹치는 하나의 공간을 뜻한다.
회원과 관련된 데이터를 저장을 할 때 회원의 모든 데이터를 하나의 테이블에 저장하지 않듯이 테이블을 분할하여 데이터의 중복을 줄이는 것을 정규화(Nomalization)이라 한다. 데이터를 가공(CRD)할때 발생할 수 있는 이상현상(Anomaly)을 방지하기 위해서는 정규화는 모델링에 있어서 중요한 프로세스다.
정규화(Normalization) : 테이블을 분할하여 데이터의 정합성을 확보, 중복을 줄이는 프로세스
기본키(Priamary Key) : 한 행을 식별자로 이용하기 가장 적합한 후보키를 말한다.(책에 나온 정의는 다소 어려워 보여서 Wiki검색)
외부키(Foreign Key) : 다른 테이블의 기본키로 사용되고 있는 관계를 연결하는 칼럼.
ERD(Enitity Relationship Diagram)
테이블간의 서로의 상관 관계를 그림으로 도식화한 Diagram.
ERD의 구성요소로는 Entity, Relationship, Attribute이다.
표기법으로는 IE(Information Engineering), Barker가 있다.
http://www.agiledata.org/images/dm101NotationSummary.gif
식별관계의 경우 A의 PK가 B의 PK 또는 FK가 될경우 식별관계가 되며, 비식별관계의 경우 A의 PK가 B의 일반속성이 될경우 비식별관계라 한다.
제 2절 DDL(Data Definition Language
데이터 유형
데이터 유형 | 설명 |
---|---|
CHARACTER(s) | 고정 길이 문자열 정보. s보다 길이가 작아도 s만큼의 공간을 차지한다. |
VARCHAR(s) | 가변길이 문자열 정보. 최대길이가 s이며 데이터의 크기만큼의 공간을 차지한다. |
NUMERIC | 정수, 실수 등 숫자 정보. |
DATE | 날짜와 시각 정보 |
CHAR와 VARCHAR의 차이는 먼저 저장하는 공간이다. VARCHAR의 경우 데이터의 크기만큼만 공간을 활용하기 때문에 더 적은 영역의 공간을 차지하는 장점이 있다.
비교하는 방법에서도 차이가 난다. CHARACTER의 경우 마지막에 빈공간(BLANK)가 있어도 앞의 문자열과 일치하면 같은 문자로 취급하지만, VARCHARACTER의 경우 빈공간도 비교를 하기 때문에 다른 문자로 취급한다.
주로 CHAR의 경우 길이가 고정이 되어있기 때문에 주민등록번호나, 생년월일, 사번등에 사용된다.
CREATE TABLE
기본키는 데이터를 고유하게 식별할 수 있는 키로, 반드시 값이 존재하는 컬럼이나 해당키의 조합들로 선정할 수 있다.
테이블 생성시 규칙
- 테이블명은 중복되지 않아야한다.
- 컬럼명은 중복되지 않아야한다.
- 각 컬럼은 괄호로 묶어 지정한다.
- 각 컬럼은 ',' 로 구분하며, 끝에 ';' 을 붙인다.
- 컬럼 데이터의 유형은 반드시 지정되어야 한다.
- 테이블명, 컬럼명은 문자로 시작한다.
- 벤더에서 지정한 예약어는 사용할 수 없다.
- A-Z, a-z, 0-9, _, $, # 문자만 허용된다.
- 테이블 생성시 대/소문자 구분을 하지 않는다.
- 문자 데이터 유형은 반드시 가질 수 있는 최대 길이를 표시한다.
- 제약조건은 CONSTRAINT를 이용하여 추가한다.
테이블의 이름은 서로 달라야하지만 컬럼은 다른테이블의 컬럼과 동일할 수 있다. 실제로 DBMS는 디렉토리구조와 같은 ‘DB+사용자+테이블+컬럼’과 같은 구조를 가진 전체 경로를 관리한다.
제약 조건은 컬럼의 뒤에 붙이는 방식(ex : NOT NULL)과 테이블의 마지막에 붙이는 방식(ex : PRIMARY KEY)가 있다.
제약조건(Constraint)
- 데이터의 무결성을 유지하기 위한 데이터베이스의 방법으로 특정 컬럼에 설정하는 제약이다.
- 생성시에는 필수 조건이 아니며, 이후에 ALTER TABLE을 통해 추가할 수 있다. 하지만 데이터가 이미 입력되어 있는 경우 처리과정이 쉽지 않다.
구분 | 설명 |
---|---|
PRIMARY KEY(기본키) | 데이터를 고유하게 식별하기 위한 키. 1개의 테이블에 1개의 기본키만 정의 할 수 있으며 기본키는 NULL을 입력할 수 없다. |
UNIQUE KEY(고유키) | 데이터를 고유하게 식별하기 위한 키. 기본키와 다르게 NULL값을 가질수 있다. |
NOT NULL | NULL값의 입력을 금지한다. |
CHECK | 입력할 수 있는 값의 범위를 제한한다. |
FOREIGN KEY(외래키) | 테이블간의 관계를 정의 하기 위해 키이다. |
NULL : 공백이나 숫자 0과 전혀 다른 값이며, 조건에 맞는 데이터가 없을때의 공집합과도 다르다. NULL은 아직 정의되지 않은 값이나 입력하지 못한 경우를 의미한다.
DEFAULT : 데이터 입력시 DEFAULT가 설정되지 않은 컬럼에 대해 명시된 값을 지정하지 않은 경우 NULL로 값이 채워지며 DEFAULT가 설정된 경우 DEFAULT로 값이 자동 입력된다.
테이블 구조를 확인하기 위해 vendor마다 테이블 구조를 확인할 수 있는 명령어를 제공한다. Oracle의 경우 DESCRIBE 테이블명.
SELECT를 통해 테이블을 생성할 수 있다. 기존 테이블을 이용하여 컬럼별로 데이터 유형을 다시 재정의 하지 않아도 동일할 컬럼을 가진 테이블을 생성할 수 있다.
ALTER TABLE
생성된 테이블의 컬럼이나 제약조건을 추가/삭제 할 수 있다.
- ADD COLUMN : 필요한 컬럼을 추가하며, 추가시 테이블의 마지막 컬럼이 된다.(위치 지정 불가능)
- DROP COLUMN : 필요치 않는 컬럼을 제거하며, 데이터가 존재해도 삭제가 가능하다. 한 번에 하나의 컬럼만 삭제가 가능하며 복구가 불가능하다.
- MODIFY COLUMN : 데이터의 유형, DEFAULT, 제약조건에 대해 변경할 수 있다. 변경시에 대한 제약조건은 다음과 같다.
- 컬럼의 크기를 줄일수 없다.(데이터훼손)
- 해당 컬럼이 NULL값만 있거나 데이터가 없다면 줄일수 있다.
- NULL값만 가지고 있다면 데이터의 유형을 변경할 수 있다.
- DEFAULT를 변경하면 변경한 시점이후의 삽입되는 데이터만 적용 된다.
- RENAME COLUMN : 컬럼명을 변경할 수 있다.(표준이 아닌 Oracle등 일부에서만 지원)
- DROP CONSTRAINT : 테이블 생성시 부여했던 제약조건을 삭제하는 명령어이다.
- ADD CONSTRAINT : 테이블 생성이후 제약조건을 추가하는 명령어이다.
RENAME TABLE
테이블의 이름을 변경할 수 있다.
DROP TABLE
테이블을 삭제할 수 있다. 옵션으로 CASCADE CONSTRAINT가 있으며 해당 옵션은 해당 테이블에 참조되는 제약조건도 삭제한다는 뜻이다.
TRUNCATE TABLE
해당 테이블의 데이터를 모두 삭제하는 테이블이다. 따라서 해당 명령어 실행이후에는 모든행들이 삭제 되지만 테이블은 삭제되지 않는다. 데이터를 일괄 삭제하는 명령어로 DML을 사용할 수 있지만 TRUNCATE TABLE 명령어를 사용하는것이 시스템 측면에서 부하가 덜 하다.(정상적인 복구가 불가능 하다.)
제 3절 DML(Data Manipulation Language
DML 이란 데이터를 조회, 입력, 수정, 삭제할 수 있는 명령어이다.
INSERT
- 데이터를 입력하는 명령어이다.
- INSERT INTO table (column list) VALUES (value list);
- INSERT INTO table VALUES (value list);
- 1번에 1건만 입력된다.
- 입력값이 문자열일 경우 Single Quotation ' 를 붙여야한다.
UPDATE
- 데이터를 수정하는 명령어이다.
- UPDATE table SET column=value;
DELETE
- 데이터를 삭제하는 명령어이다.
- DELETE FROM table; DDL의 경우 명령어를 입력하는 순간 해당작업이 즉시 완료된다.(AUTO COMMIT)
- 그러나 DML의 경우 테이블을 메모리 버퍼에 올려놓고 작업을 하므로 실시간으로 테이블에 영향을 미치지 않으며, COMMIT명령어를 입력하여 TRANSACTION을 종료한다.
SELECT
- 데이터를 조회하는 명령어이다.
- SELECT [ALL/DISTINCT] column list FROM table;
- ALL 옵션은 중복된 데이터까지 모두 보는 옵션이며 DISTINCT는 중복된 데이터는 1건으로 출력해준다.
- wild card로 모든 column이 보고 싶을때는 column list 대신에*을 사용하면 된다.
- 조회하는 결과에 대해서 별칭(Alias)를 붙일 수 있으며, 별칭을 통해 컬럼의 레이블을 변경하여 볼 수 있다.
- alias는 컬럼명 바로 뒤에 온다.
- 컬럼명과 alias 사이에 AS 키워드를 사용할 수 있다.
- 별칭에 공백 또는 특수문자가 들어갈경우 Double Quotation을 사용한다.
산술연산자와 합성연산자
- 산술연산자의 경우 NUMBER와 DATE 자료형에 적용되며 우선순위를 위해 괄호 적용이 가능하다.
- 우선순위는 수학과 같은 (),*, / +, -이다.
- 합성연산자는 문자와 문자를 연결하는 연산자이다.
- Oracle에서는 ' || '를 사용한다.(vendor마다 다르다)
- 문자 표현식에 의해서 새로운 컬럼을 생성한다.
제 4절 TCL(Transaction Control Language
트랜잭션의 개요
- 트랜잭션은 데이터베이스의 논리적 연산단위이다.
- 1개의 트랜잭션당 1개 이상의 SQL 문장을 가진다.
- 트랜잭션은 전부 적용되거나 전부 취소된다.
- 트랜잭션은3가지 명령어를 지원한다. 커밋(COMMIT), 롤백(ROLLBACK), 저장점(SAVEPOINT)
- 트랜잭션의 대상이 되는 SQL문은 INSERT, UPDATE, DELETE 등 DML명령어이다.(SELECT의 경우에도 트랜잭션의 대상이 될 수 있다.)
특성 | 설명 |
---|---|
원자성(atomicity) | 트랜잭션에 정의된 연산은 모두 성공적으로 실행되거나 모두 실행되지 않은 상태가 되어야 한다. |
일관성(consistency) | 트랜잭션이 실행되기 전에 데이터베이스의 내용이 잘못되어 있지 않다면, 트랜잭션 실행 후에도 내용에 잘못이 있으면 안된다. |
고립성(isolation) | 트랜잭션이 실행하는 중에 다른 트랜잭션에 영향을 주어서는 안된다. |
지속성(durability) | 트랜잭션이 성공적으로 수행되면 갱신된 내용은 영구적으로 지속되어야 한다. |
COMMIT
트랜잭션을 완료하는 명령어이다. COMMIT 이전의 데이터 상태는 아래와 같다.
- commit 되지 않은 DML명령어는 메모리 Buffer에만 영향을 미치기 때문에 복구가 가능하다.
- 사용자는 SELECT 문으로 결과를 확인할 수 있다.
- 다른 사용자는 현재 사용자가 수행한 명령의 결과를 볼 수 없다.
- 변경된 행은 잠금이 설정되어 다른 사용자가 변경할 수 없다.
COMMIT 이후의 데이터 상태는 아래와 같다.
- 데이터에 대한 변경 사항이 반영된다.
- 이전 데이터는 복구할 수 없다.
- 모든 사용자가 결과를 볼 수 있다.
- 관련된 행에 대해 잠금이 풀리며 다른 사용자들이 조작할 수 있다.
Oracle의 경우 DBMS에서 내부적으로 실행하며, DML문자 수행후 사용자가 COMMIT 또는 ROLLBACK을 해줘야 트랜잭션이 종료된다.
- Auto Commit 명령어가 성공적으로 수행되면 자동으로 COMMIT을 수행하고, 오류 발생시 자동으로 ROLLBACK을 수행한다. SQL Server방식.
- 암시적 트랜잭션 : Oracle의 방식. 트랜잭션의 시작은 DBMS에서 암시적으로 처리하고 트랜잭션의 끝은 사용자가 명시적으로 COMMIT 또는 ROLLBACK으로 처리한다.
- 명시적 트랜잭션은 트랜잭션의 시작과 끝을 사용자가 직접 지정하는 방식이다. BEGIN TRANSACTION으로 트랜잭션을 시작, COMMIT TRANSACTION 또는 ROLLBACK TRANSACTION으로 트랜잭션을 종료한다.
ROLLBACK
트랜잭션 단위로 데이터 변경 사항을 이전으로 되돌리는 명령어 이다. 관련된 행의 잠금이 풀리게 된다.
- SQL Server의 경우 명시적 트랜잭션을 선언해야 ROLLBACK명령어를 사용할 수 있다.
SAVEPOINT
- SAVEPOINT 를 정의하면 트랜잭션에 포함된 전체 작업을 롤백하지 않고 SAVEPOINT 명령어 시점까지 트랜잭션을 롤백 할 수 있다.
- SAVEPOINT savePoint;
트랜잭션에 대한 정리
- DDL의 경우 명령어 실행시 자동으로 커밋된다.
- 데이터베이스를 정상적으로 종료시 자동으로 트랜잭션이 커밋된다.
- 데이터베이스와 이상 종료로인해 접속이 절단될 경우 롤백된다.
리뷰
출처 책 : http://book.naver.com/bookdb/book_detail.nhn?bid=6379151
해당 책의 주요 설명기준 DBMS : Oracle
Database 스터디를 시작하면서 해당 책을 읽고 있는데 학부시절 DB수업을 한번도 안듣고 읽기에는 조금 어려운 부분이 있었다. DB를 하나도 모르는 상태에서 읽게 된다면(정보처리기사에서 나오는 DB지식정도) 다소 많은 어려움이 있을거 같다. 용어나 설명 등. 또한 모든 컴퓨터공학 관련된 내용은 영어를 기준으로 하기 때문에 다소 한글로 표현한 부분들이 어렵게 느껴지며 구글링 하면서 해당 내용을 검색하면서 하는것을 추천한다.