[SQL 이해와 활용] DDL > CREATE TABLE

Date:     Updated:

카테고리:

태그:


✔️ DDL > CREATE TABLE

데이터 모델링과 정규화로 설계한 테이블을 데이터베이스에 생성한다. 테이블 생성 시에는 컬럼 정보(이름과 타입), 제약조건(PK/UK/FK 및 데이터 입력 조건)을 정의한다.

데이터 타입

테이블을 생성할 때 컬럼의 데이터 타입과 크기를 지정해야한다. 입력할 수 있는 데이터를 제한함으로써 데이터 무결성을 유지하며, 저장 공간 낭비를 막을 수 있다. 대표적인 4가지 데이터 타입이 있다.

타입 설명
CHARACTER(s) s 길이의 고정 길이 문자열로 오라클에서는 CHAR(s)로 작성
VARCHAR(s) 최대 s 길이의 가변 길이 문자열로 오라클에서는 VARCHAR2(s)로 작성
NUMERIC 숫자 타입으로 오라클에서는 NUMBER(정수자릿수, 소수자릿수)로 작성
DATETIME 날짜와 시각 타입으로 오라클에서는 DATE로 작성


테이블 생성 구문

CREATE TABLE 테이블이름 (컬럼명1 DATATYPE [DEFAULT 형식], 컬럼명2 DATATYPE [DEFAULT 형식], ..);

CREATE TABLE 구문으로 테이블을 생성한다. 테이블 생성 시에는 하기 규칙을 따르는 것을 권장한다.

  • 인스턴스를 표현하는 적절한 단수형의 테이블 명 설정
  • 컬럼명은 데이터베이스 내에서 일관성 있게 정의 (데이터 표준화 관점에서)


테이블 생성 실습

선수 정보를 저장하는 선수(PLAYER) 테이블은 다음과 같다.

테이블 컬럼 설명
PLAYER PLAYER_ID 문자 고정 자릿수(7), PLAYER_NAME 문자 가변 자릿수(20), TEAM_ID 문자 고정 자릿수(3), E_PLAYER_NAME 문자 가변 자릿수(40), NICKNAME 문자 가변 자릿수(30), JOIN_YYYY 문자 고정 자릿수(4), POSITION 문자 가변 자릿수(10), BACK_NO 숫자 정수 자릿수(2), NATION 문자 가변 자릿수(20), BIRTH_DATE 날짜와 시각, SOLAR 문자 고정 자릿수(1), HEIGHT 숫자 정수 자릿수(3), WEIGHT 숫자 정수 자릿수(3)

CREATE TABLE 구문으로 위의 선수(PLAYER) 테이블 생성한다.

CREATE TABLE PLAYER
(
    PLAYER_ID CHAR(7),
    PLAYER_NAME VARCHAR2(20),
    TEAM_ID CHAR(3),
    E_PLAYER_NAME VARCHAR2(40),
    NICKNAME VARCHAR2(30),
    JOIN_YYYY CHAR(4),
    POSITION VARCHAR2(10),
    BACK_NO NUMBER(2),
    NATION VARCHAR2(20),
    BIRTH_DATE DATE,
    SOLAR CHAR(1),
    HEIGHT NUMBER(3),
    WEIGHT NUMBER(3)
);


생성된 테이블 구조 확인

생성된 테이블 구조를 확인하기 위해 DESCRIBE 테이블명 또는 DESC 테이블명을 사용한다.

DESCRIBE PLAYER;

image

⚠️ 단, DESCRIBE는 SQL PLUS 기반 명령어기 때문에 DBeaver에서는 작동하지 않는다. SELECT * FROM 테이블명에서 테이블명에 커서를 놓고 F4를 누르면 테이블 설명의 탭을 확인할 수 있다.


제약조건

제약조건은 데이터 무결성과 정합성을 유지하기 위해 데이터에 부여하는 제약이다. 대표적인 5가지 제약조건은 다음과 같다.

제약조건 설명
PRIMARY KEY 인스턴스를 고유하게 식별하는 기본키 설정
DBMS는 기본키 컬럼에 자동으로 UNIQUE 인덱스를 생성하며 NULL을 불허
UNIQUE KEY 인스턴스를 고유하게 식별하는 고유키 설정.
NULL 입력이 가능
FOREIGN KEY 테이블 간의 관계 정의를 위한 제약으로 다른 테이블의 기본키로 설정
외래키 지정 시 참조 무결성 제약 옵션의 선택이 가능
NOT NULL NULL 입력을 불허
CHECK의 일부분으로 볼 수 있음
CHECK 입력할 수 있는 데이터 범위를 제한
TRUE/FALSE로 평가할 수 있는 논리식 지정

제약 조건은 데이터 유형 뒤에 작성하는 컬럼 LEVEL 정의 방식, 테이블 생성 마지막에 기술하는 테이블 LEVEL 정의 방식이 있다. 테이블 LEVEL 정의는 CONSTRAINT 제약조건명 제약조건 구문을 사용한다. 두 정의 방식은 혼용 가능하다.


DEFAULT 부여

컬럼의 기본값을 설정할 수 있다. DEFAULT 설정된 컬럼에 대해서는 값을 명시하지 않는 경우 NULL 대신 DEFAULT 값이 입력된다.

컬럼 정의 시 컬럼명 DATATYPE DEFAULT 디폴트값으로 부여할 수 있다. 아래 코드는 선수 테이블(PLAYER)의 NATION 컬럼 디폴트 값을 “한국”으로 부여한다.

CREATE TABLE PLAYER 
(
    ...
    NATION VARCHAR2(20) DEFAULT "한국",
    ...
)


제약조건을 포함한 테이블 생성 실습

선수(PLAYER) 테이블과 팀(TEAM) 테이블은 다음과 같다.

테이블 컬럼 설명 제약조건
TEAM TEAM_ID 문자 고정 자릿수(3), REGION_NAME 문자 가변 자릿수(8), TEAM_NAME 문자 가변 자릿수(40), E_TEAM_NAME 문자 가변 자릿수(50), ORIG_YYYY 문자 고정 자릿수(4), STADIUM_ID 문자 고정 자릿수(3), ZIP_CODE1 숫자 정수 자릿수(3), ZIP_CODE2 숫자 정수 자릿수(3), ADDRESS 문자 가변 자릿수(80), DDD 문자 가변 자릿수(3), TEL 문자 가변 자릿수(10), FAX 문자 가변 자릿수(10), HOMEPAGE 문자 가변 자릿수(50), OWNER 문자 가변 자릿수(10) PK → TEAM_ID(제약조건명: TEAM_PK)
NOT NULL → REGION_NAME, TEAM_NAME, STADIUM_ID
PLAYER PLAYER_ID 문자 고정 자릿수(7), PLAYER_NAME 문자 가변 자릿수(20), TEAM_ID 문자 고정 자릿수(3), E_PLAYER_NAME 문자 가변 자릿수(40), NICKNAME 문자 가변 자릿수(30), JOIN_YYYY 문자 고정 자릿수(4), POSITION 문자 가변 자릿수(10), BACK_NO 숫자 정수 자릿수(2), NATION 문자 가변 자릿수(20), BIRTH_DATE 날짜와 시각, SOLAR 문자 고정 자릿수(1), HEIGHT 숫자 정수 자릿수(3), WEIGHT 숫자 정수 자릿수(3) PK → PLAYER_ID(제약조건명: PLAYER_PK)
FK → TEAM_ID(제약조건명: PLAYER_FK)
NOT NULL → PLAYER_NAME, TEAM_ID

컬럼 LEVEL, 테이블 LEVEL 정의 방식으로 제약조건을 포함하여 테이블을 생성한다.

CREATE TABLE TEAM
(
	TEAM_ID CHAR(3) NOT NULL,
	REGION_NAME VARCHAR2(8) NOT NULL,
	TEAM_NAME VARCHAR2(40) NOT NULL,
	E_TEAM_NAME VARCHAR2(50),
	ORIG_YYYY CHAR(4),
	STADIUM_ID CHAR(3) NOT NULL,
	ZIP_CODE1 NUMBER(3),
	ZIP_CODE2 NUMBER(3),
	ADDRESS VARCHAR2(80),
	DDD VARCHAR2(3),
	TEL VARCHAR2(10),
	FAX VARCHAR2(10),
	HOMEPAGE VARCHAR2(50),
	OWNER VARCHAR2(10),
	CONSTRAINT TEAM_PK PRIMARY KEY (TEAM_ID)
);

CREATE TABLE PLAYER
(
    PLAYER_ID CHAR(7) NOT NULL,
    PLAYER_NAME VARCHAR2(20) NOT NULL,
    TEAM_ID CHAR(3) NOT NULL,
    E_PLAYER_NAME VARCHAR2(40),
    NICKNAME VARCHAR2(30),
    JOIN_YYYY CHAR(4),
    POSITION VARCHAR2(10),
    BACK_NO NUMBER(2),
    NATION VARCHAR2(20),
    BIRTH_DATE DATE,
    SOLAR CHAR(1),
    HEIGHT NUMBER(3),
    WEIGHT NUMBER(3),
    CONSTRAINT PLAYER_PK PRIMARY KEY (PLAYER_ID),
    CONSTRAINT PLAYER_FK FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID)
);


SELECT 문장을 통한 테이블 생성

SELECT(DML) 문장을 통해 테이블을 생성하는 방법도 있다. 이 방법을 CTAS(CREATE TABLE AS SELECT ~)라 한다.

CTAS로 테이블을 정의하는 경우, 데이터 타입을 정하지 않아도 되는 편리함이 있다. 단, 제약조건 중 NOT NULL만 복제되는 점을 주의하자.

CTAS로 TEAM 테이블과 동일한 TEAM_TEMP 테이블을 만들어보자.

CREATE TABLE TEAM_TEMP AS
SELECT * FROM TEAM;

image

TEAM_TEMP 테이블 확인 시, NOT NULL 제약조건만 존재한다.


맨 위로 이동하기

SQL Developer 카테고리 내 다른 글 보러가기

댓글 남기기