1. 데이터 유형
데이터 유형은 데이터베이스 테이블에 특정 컬럼에 입력할 수 있는 자료의 유형을 규정하는 기준이다. 선언한 유형이 아닌 다른 데이터가 들어오면 데이터베이스는 에러를 발생시킨다. 또한 데이터 유형과 더불아 지정한 크기 (SIZE) 도 중요한 기능을 제공한다. 선언 당시에 지정한 데이터 크기를 넘어선 자료가 입력되는 상황도 에러를 발생시키는 중요한 요인이 된다.
데이터베이스에서 사용하는 데이터 유형은 다양한 형태로 제공된다. 벤더별 데이터 유형과 내장형 함수 부분에서 큰 차이가 있다. 숫자 타입을 예로 들어보면 ANSI/ISO 기준에서는 NUMERIC Type 의 하위 개념으로 NUMERIC, DECIMAL, DEC, SMALLINT, INTEGER, INT, BIGINT, FLOAT, REAL, DOUBLE PRECISION 을 소개하고 있다. SQL Server 와 Sybase 는 ANSI/ISO 기준의 하위 개념에 맞추어 작은 정수형, 정수형, 큰 정수형, 실수형 등 여러 숫자 타입을 제공하고 있으며 ORALE 은 숫자형 타입에 대해 NUMBER 한 가지 유형만 지원한다.
벤더에서 ANSI/ISO 표준을 사용할 때는 기능을 중심으로 구현하므로, 일반적인 표준과 다른 (예를 들면, NUMERIC → NUMBER, WINDOW FUNCTION → ANALYTIC/RANK FUNCTION) 용어를 사용하는 것은 현실적으로 허용된다.
테이블의 컬럼이 가지고 있는 대표적인 4가지 데이터 유형은 아래와 같다.
VARCHAR 유형은 가변길이이므로 길이가 다양한 컬럼과, 정의된 길이와 실제 데이터 길이에 차이가 있는 컬럼에 적합하다. 저장 측면에서도 CHAR 유형보다 작은 영역에 저장할 수 있다.
또한 CHAR 는 문자열을 비교할 때 짧은 쪽의 끝에 공백을 추가 하여 두 개의 데이터가 같은 길이가 되도록 한 후 앞에서부터 한 문자씩 비교하기 때문에 맨 끝 공백만 다른 문자열은 같은 것으로 판단된다. 그에 반해 VARCHAR 유형은 맨 처음부터 한 문자씩 비교하고, 공백도 하나의 문자로 취급하기 때문에 맨 끝 공백이 다르면 다른 문자로 판단한다.
- 예) CHAR : ‘AA’ = ‘AA ‘ / VARCHAR : ‘AA’ ≠ ‘AA ‘
2. CREATE TABLE
1) 테이블과 컬럼 정의
테이블에 존재하는 모든 데이터를 고유하게 식별할 수 있으면서 반드시 값이 존재하는 단일 컬럼이나 컬럼의 조합들 (후보키) 중에 하나를 선정하여 기본키 컬럼으로 지정한다. 기본키는 단일 컬럼이 아닌 여러 개의 컬럼으로도 만들어 질 수 있다.
또한 테이블 간에 정의된 관계는 기본키 (PRIMARY KEY) 와 외부키 (FOREIGN KEY) 를 활용해서 설정하도록 한다.
2) CREATE TABLE
테이블을 생성하는 구문 형식은 다음과 같다.
CREATE TABLE 테이블명
( 컬럼명1 DATATYPE [DEFAULT 형식],
컬럼명2 DATATYPE [DEFAULT 형식],
...
);
다음은 테이블 생성 시 주의해야 할 규칙이다.
- 테이블명은 객체를 의미할 수 있는 적절한 이름을 사용한다. 가능한 단수형을 권고한다.
- 테이블명은 다른 테이블과 중복되지 않아야 한다.
- 한 테이블 내에서는 컬럼명이 중복될 수 없다.
- 테이블 이름을 지정하고 각 컬럼은 괄호 ‘()’로 묶어 지정한다.
- 각 컬럼은 콤마 ‘,’로 구분되고, 테이블 생성문의 끝은 항상 세미콜론 ‘;’ 으로 끝난다.
- 컬럼에 대해서는 다른 테이블까지 고려하여 데이터베이스 내에서 일관성있게 사용하는 것이 좋다. (데이터 표준화 관점)
- 컬럼 뒤에 데이터 유형은 반드시 지정해야 한다.
- 테이블명과 컬럼명은 반드시 문자로 시작해야 하고, 벤더별 길이에 대한 한계가 있다.
- 벤더에서 사전에 정의한 예약어 (Reserved word) 는 쓸 수 없다.
- A-Z, a-z, 0-9, ‘_’, ‘$’, ‘#’ 문자만 허용된다.
- DATETIME 데이터 유형에는 크기를 지정하지 않지만, 문자 데이터 유형은 반드시 가질 수 있는 최대 길이를 표시해야 한다.
3) 제약조건 (CONSTRAINT)
제약조건이란, 사용자가 원하는 조건의 데이터만 유지하기 위한, 즉 데이터의 무결성을 유지하기 위한 데이터베이스의 보편적인 방법으로, 테이블의 특정 컬럼에 설정하는 제약이다.
-
NULL 의 의미
– NULL (ASCII 00) 은 공백 (BLANK, ASCII 32) 이나 숫자 0 (ZERO, ASCII 48) 과는 전혀 다른 값으로, 조건에 맞는 데이터가 없을 때의 공집합과도 다르다. NULL 은 ‘아직 정의되지 않은 미지의 값’ 또는 ‘현재 데이터를 입력하지 못하는 경우’를 의미한다. -
DEFAULT 의 의미
– 데이터의 기본값 (DEFAULT) 을 사전에 설정할 수 있다. 데이터 입력 시 명시된 값을 지정하지 않은 경우 NULL 값이 입력되고, DEFAULT 값을 정의했다면 해당 컬럼에 기본 값이 자동으로 입력된다.
4) 생성된 테이블 구조 확인
ORACLE : ‘DESCRIBE 테이블명;’ 또는 ‘DESC 테이블명;’
SQL Server : ‘sp_help “dbo.테이블명”’
5) SELECT 문장을 통한 테이블 생성
기존 테이블을 이용한 CTAS (Create Table ~ As Select ~) 방법을 이용하면 컬럼별 데이터 유형을 재정의하지 않아도 되는 장점이 있다. 그러나 CTAS 사용 시 주의할 점은 기존 테이블의 제약조건 중 NOT NULL 만 새로운 복제 테이블에 적용되고, 기본키, 고유키, 외래키, CHECK 등의 다른 제약 조건은 없어진다는 점이다. 제약조건을 추가하기 위해서는 ALTER TABLE 기능을 사용해야 한다.
SQL Server 에서는 ‘Select ~ Into ~’ 를 활용하여 위와 같은 결과를 얻을 수 있으며, 컬럼 속성에 Identity 를 사용했다면 그 속성까지 같이 적용이 된다.
3. ALTER TABLE
1) ADD COLUMN
다음은 기존 테이블에 필요한 컬럼을 추가하는 명령이다.
ALTER TABLE 테이블명 ADD 추가할컬럼명 데이터유형;
2) DROP COLUMN
DROP COLUMN 은 테이블에서 불필요한 컬럼을 삭제하는 명령이다. 데이터 유무에 관계 없이 삭제 가능하며, 한 번에 하나의 컬럼만 삭제된다. 컬럼 삭제 후 테이블에 최소 하나 이상의 컬럼이 존재해야 하며, 한 번 삭제된 컬럼은 복구가 불가능하다.
ALTER TABLE 테이블명 DROP COLUMN 삭제할컬럼명;
3) MODIFY COLUMN
테이블에 존재하는 컬럼에 대해 ALTER TABLE 명령으로 컬럼의 테이터 유형, DEFAULT 값, NOT NULL 제약조건에 대해 변경할 수 있다.
-- ORACLE
ALTER TABLE 테이블명 MODIFY
( 컬럼명1 데이터유형 [DEFAULT] [NOT NULL],
컬럼명2 데이터유형 ...
);
-- SQL Server
ALTER TABLE 테이블명 ALTER
( 컬럼명1 데이터유형 [DEFAULT] [NOT NULL],
컬럼명2 데이터유형 ...
);
-
컬럼 변경 시 고려사항
– 해당 컬럼의 크기 증가는 가능하지만 감소는 불가능하다. 기존 데이터 훼손 가능성이 있기 때문이다.
– 해당 컬럼이 NULL 값만 가지고 있거나, 테이블에 아무 행도 없으면 컬럼의 폭을 줄일 수 있다.
– 해당 컬럼이 NULL 값만 가지고 있으면 데이터 유형을 변경할 수 있다.
– 해당 컬럼의 DEFAULT 값을 변경하면, 변경 이후에 발생하는 행 삽입에만 영향을 미친다.
– 해당 컬럼에 NULL 값이 없는 경우 NOT NULL 제약조건을 추가할 수 있다. -
RENAME COLUMN
– 테이블을 생성하면서 만들었던 컬럼명을 불가피하게 변경해야 하는 경우 사용할 수 있는 명령이다.
-- ORACLE
ALTER TABLE 테이블명 RENAME COLUMN 변경전컬럼명 TO 변경후컬럼명;
-- SQL Server
sp_rename 'dbo.테이블명.변경전컬럼명', '변경후컬럼명', 'COLUMN';
– 컬럼명이 변경되면, 해당 컬럼과 관계된 제약조건도 자동으로 변경된다.
– ORACLE 등 일부 DBMS 에서만 지원하는 기능이다.
4) DROP CONSTRAINT
테이블 생성 시 부여했던 제약조건을 삭제하는 명령어는 다음과 같다.
ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건명;
5) ADD CONSTRAINT
테이블 생성 이후 특정 컬럼에 제약조건을 추가하는 명령어는 다음과 같다.
ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건명 제약조건 (컬럼명);
4. RENAME TABLE
RENAME 명령어를 사용하여 테이블의 이름을 변경할 수 있다.
-- ORACLE
RENAME 변경전테이블명 TO 변경후테이블명;
-- SQL Server
sp_rename 변경전테이블명, 변경후테이블명;
5. DROP TABLE
불필요한 테이블을 삭제하는 명령어는 다음과 같다.
DROP TABLE 테이블명 [CASCADE CONSTRAINT];
6. TRUNCATE TABLE
TRUNCATE TABLE 은 테이블 자체가 삭제되는 것이 아니고, 해당 테이블에 들어있던 모든 행이 제거되고, 저장 공간을 재사용 가능하도록 해제한다.
TRUNCATE TABLE 테이블명;