[SQL 이해와 활용] DDL > CREATE TABLE
카테고리: SQL Developer
✔️ 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;
⚠️ 단, 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;
TEAM_TEMP 테이블 확인 시, NOT NULL 제약조건만 존재한다.
댓글 남기기