제 1절 관계형 데이터베이스 개요

1. 데이터베이스

관계형 데이터베이스

정규화를 통한 합리적인 테이블 모델링을 통해 이상(anomaly)현상을 제거하고 데이터 중복을 피할 수 있으며, 동시성 관리, 병행 제어를 통해 많은 사용자들이 동시에 데이터를 공유 및 조작할 수 있는 기능을 제공한다.

2. SQL (Structured Query Language)

관계형 데이터베이스에서 데이터 정의, 조작, 제어를 하기 위해 사용하는 언어다.
ANSI/ISO 를 통해 표준화 되고 있다.

SQL 명령의 종류

DML (데이터 조작어)

SELECT (== retrieve), INSERT, UPDATE, DELETE

DDL (데이터 정의어)

CREATE, ALTER, DROP, RENAME

DCL (데이터 제어어)

GRANT, REVOKE
권한을 주거나 회수한다

TCL (트랜젝션 제어어)

COMMIT, ROLLBACK

3. Table

테이블은 데이터를 저장하는 객체(OBJECT)로서 관계형 데이터베이스의 기본 단위이다.
관계형 데이터베이스는 모든 데이터를 칼럼과 행의 2차원 구조로 나타낸다.
칼럼은 특정 속성을 나타낸다.
칼럼과 행이 겹치는 하나의 공간을 필드라고 한다.

정규화 : 테이블을 분할하여 데이터의 정합성을 확보하고, 불필요한 중복을 줄이는 프로세스
기본키(PRIMARY KEY) : 테이블의 각 행들을 식별할 수 있는 한 개 이상의 칼럼
외래키(FOREIGN KEY) : 다른 테이블의 기본키로 사용되고 있는 관계를 연결하는 칼럼

4. ERD (Entity Relationship Diagram)

ERD 의 구성요소는 엔터티, 관계 속성 3가지 이다.

제 2절 DDL (Data Definition Language)

1. 데이터 유형

character(s)

s 만큼의 고정 길이 문자열 정보
기본 1byte 최대 2000byte

varchar(s)

가변 길이 문자열 정보

char 와 varchar의 '비교 방법'
char는 비교할 때 공백을 채워서 비교한다. 
varchar 공백이 다르면 다른 문자로 판단한다. 공백도 하나의 문자로 취급한다. 

numeric

정수, 실수 등 숫자 정보
처음에 전체 자리수, 뒤에 소수 부분 자리 수를 지정한다
전체 8자리이고 소수 부분2자리 라면 number(8, 2)

date

날짜와 시각 정보

2. CREATE TABLE

구문 형식

CREATE TABLE 테이블명(
    PLAYER DATATYPE [DEFAULT 형식] NOT NULL,
    TEAM DATATYPE [DEFAULT 형식] NOT NULL,
    STADIUM_ID CHAR(3) NOT NULL,
    CONSTRAINT PALYER_PK PRIMARY KEY (PLAYER),
    CONSTRAINT TEAM_FK FOREIGN KEY (STADIUM_ID) REFERENCES STADIUM(STADIUM_ID)
);

주의사항

테이블 명은 다른 테이블의 이름과 중복되지 않아야 한다.
한 테이블 내에서는 칼럼명이 중복되게 지정될 수 없다.
칼럼 뒤에 데이터유형은 반드시 지정해야 한다.
벤더에서 사전에 정의한 예약어(Reserved word)는 쓸 수 없다.
A-Z, a-z, 0-9, '_', '$', '#' 문자만 허용한다.

칼럼에 대한 제약조건이 있으면 CONSTARINT 를 이용하여 추가할 수 있다.
DATETIME 데이터 유형에는 별도로 크기를 지정하지 않는다.
제약조건은 칼럼의 데이터 유형 뒤에 작성하는 칼럼 LEVEL 정의 방식이 있고, CONSTRAINT 로 테이블 LEVEL 정의 방식이 있다. 기능은 동일 하다.

제약조건의 종류

  • PRIMARY KEY (기본키)
    행 데이터를 고유하게 식별하기 위한 기본키를 정의한다.
    하나의 테이블에 하나의 기본키 제약만 정의할 수 있다.
    ( PK = NOT NULL + UNIQUE KEY )

  • UNIQUE KEY (고유키)
    행 데이터를 고유하게 식별하기 위한 고유키를 정의한다.
    단, NULL은 고유키의 제약 대상이 아니다. (NULL 여러개 가능)

  • NOT NULL
    NULL 값 입력을 금지한다.

  • CHECK
    입력할 수 있는 값의 '범위'를 제한한다.
    제약으로는 TRUE or FALSE 로 평가할 수 있는 '논리식'을 지정한다.

  • FOREIGN KEY
    테이블 간의 관계를 정의하기 위해 기본키를 다른 테이블의 외래키로 복사하는 경우에 외래키가 생성된다.

SELECT 문장을 통한 테이블 생성

CTAS (create table ~ as select ~)
기존 테이블을 이용하여 테이블을 생성하면 데이터유형을 재정의 안 해도 된다는 장점이 있다.
단, 주의할 점은 기존 테이블의 제약조건 중에 NOT NULL만 새로운 복제 테이블에 적용이 된다. 나머지 PK, FK 등의 다른 제약 조건은 없어진다. ALTER TABLE로 제약조건 추가하는 작업이 필요하다.

3. ALTER TABLE

ADD COLUMN

ALTER TABLE 테이블이름 
ADD 칼럼이름 DATATYPE;

주의 할 점은 추가할 칼럼의 위치를 지정할 수 없다는 것이다.

ALTER TABLE TEAM
ADD ADDRESS VARCHAR(20);

DROP COLUMN

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

주의 할 점은 한 번 삭제된 칼럼은 복구가 불가능하다.

ALTER TABLE TEAM
DROP COLUMN ADDRESS;

MODIFY COLUMN

칼럼의 제약조건, 디폴트값, 데이터유형을 변경할 수 있다.

ALTER TABLE 테이블이름
MODIFY (칼럼이름1 데이터유형 [DEFAULT 값] [NOT NULL],
        칼럼이름2 데이터유형);
  • 해당 칼럼이 NULL값만 가지고 있거나 테이블에 아무 행 도 없으면 칼럼의 폭을 줄일 수 있다.
  • 해당 칼럼의 크기를 늘릴 수는 있지만 줄이지는 못한다. (기존 데이터가 훼손될 수 있기 때문이다.)
  • 해당 칼럼의 DEFAULT값을 변경 할 수 있지만, 변경 작업 이후 발생한 행에만 영향을 미친다.
  • 해당 칼럼에 NULL 값이 없는 경우에만 NOT NULL 제약조건을 추가할 수 있다.

RENAME COLUMN

칼럼명을 변경해야 하는 경우에 RENAME COLUMN 문구를 사용한다.

ALTER TABLE 테이블이름
RENAME COLUMN 변경해야 할 칼럼 TO 새 칼럼이름;

ALTER TABLE TEAM
RENAME COLUMN ADDREEE TO ADDRESS;

DROP CONSTRAINT

제약조건을 삭제하는 명령어.

ALTER TABLE 테이블이름
DROP CONSTARINT 제약조건이름;

ADD CONSTRAINT

제약조건을 추가하는 명령어.

ALTER TABLE 테이블이름 
ADD CONSTRAINT 제약조건명 제약조건 (칼럼명);

ALTER TABLE PLAYER
ADD CONSTRAINT TEAM_FK FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID);

4. RENAME TABLE

RENAME으로 테이블이름을 변경할 수 있다
RENAME 테이블이름 TO 새 테이블이름

5. DROP TABLE

테이블의 구조 및 데이터 전부를 삭제한다.

DROP TABLE 테이블이름 [CASCADE CONSTRAINT];

CASCADE CONSTRAINT : 삭제 할 테이블과 관계 있는 제약조건까지 전부 삭제하는 옵션

6. TRUNCATE TABLE

테이블의 모든 행들을 삭제하고 재사용하기 위한 명령.
테이블 구조 자체가 삭제되는 것은 아니다.

TRUNCATE TABLE 테이블이름;

DELETE 보다 시스템 부하가 적다.
단, TRUNCATE TABLE의 경우 정상적인 복구가 불가능하므로 주의하여 사용해야 한다.

728x90

'프로그래밍 > SQLD' 카테고리의 다른 글

SQL 기본 3 : TCL  (0) 2020.05.27
SQL 기본 2 : DML  (0) 2020.05.27
Toad TNS file 검증 에러  (0) 2020.02.21
실습 환경 만들기 - Toad 설치  (0) 2020.02.21
실습 환경 만들기 - Oracle XE 설치  (0) 2020.02.21

+ Recent posts