메뉴 건너뛰기

bysql.net

제2절_DDL(DATA_DEFINITION_LANGUAGE)

2011.09.10 22:32

balto 조회 수:10319

1. 데이터 유형

- 숫자 타입

  ANSI/ISO 기준 : NUMERIC, DECIMAL, DEC, SMALLINT, INTEGER, INT, BIGINT, FLOAT, REAL, DOUBLE PRECISION

  SQL Server와 Sybase : 작은 정수형, 정수형, 큰 정수형, 실수형 등 + MONEY, SMALLMONEY

  Oracle : 숫자형 타입에 대해서 NUMBER 한 가지 숫자 타입의 데이터 유형만 지원

 

- 벤더에서 ANSI/ISO 표준을 사용할 때는 기능을 중심으로 구현하므로, 일반적으로 표준과 다른 용어를 사용하는 것이 허용

   (ex: NUMERIC → NUMBER, WINDOW FUNCTION → ANALYTIC/RANK FUNCTION)  

 

- 테이블의 칼럼이 가지고 있는 대표적인 4가지 데이터 유형

  기타 유형 : ANSI/ISO에서 Binary String Type, Binary Large Object String Type, National Character String Type, Boolean Type 등

 

- 문자열 유형 :  CHAR 유형과 VARCHAR 유형의 차이

   VARCHAR 유형 : 가변 길이, CHAR 유형 : 고정길이

   비교 방법의 차이 : 

                     CHAR에서는 문자열을 비교할 때 공백(BLANK)을 채워서 비교

                     VARCHAR 유형에서는 맨 처음부터 한 문자씩 비교하고 공백도 하나의 문자로 취급

                     예) CHAR 유형'AA' = 'AA '       예) VARCHAR 유형 'AA' ≠ 'AA '

2. CREATE TABLE

가. 테이블과 칼럼 정의 : 후보키중에 하나를 선정하여 기본키 칼럼으로 지정

 

(예) 선수 테이블 

(예) 부서와 사원 테이블

나. CREATE TABLE

CREATE TABLE 테이블이름 ( 칼럼명1 DATATYPE [DEFAULT 형식], 칼럼명2 DATATYPE [DEFAULT 형식],

                                                                                    칼럼명3 DATATYPE [DEFAULT 형식] ) ;

다음은 테이블 생성 시에 주의해야 할 몇 가지 규칙이다.

- 테이블명 : 객체를 의미할 수 있는 적절한 이름을 사용

- 벤더에서 사전에 정의한 예약어(Reserved word)는 쓸 수 없다. - A-Z, a-z, 0-9, _, $, # 문자만 허용된다.

- 테이블명이 잘못된 사례

 

(예) 선수 테이블 생성

테이블명 : PLAYER
테이블 설명 : K-리그 선수들의 정보를 가지고 있는 테이블
칼럼명 : => 
제약조건 : 기본키(PRIMARY KEY) → PLAYER_ID (제약조건명은 PLAYER_ID_PK)
                   값이 반드시 존재 (NOT NULL) → PLAYER_NAME, TEAM_ID

Oracle

SQL Server

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) );

CREATE TABLE PLAYER (

PLAYER_ID CHAR(7) NOT NULL,

PLAYER_NAME VARCHAR(20) NOT NULL,

TEAM_ID CHAR(3) NOT NULL,

E_PLAYER_NAME VARCHAR(40),

NICKNAME VARCHAR(30),

JOIN_YYYY CHAR(4),

POSITION VARCHAR(10),

BACK_NO TINYINT,

NATION VARCHAR(20),

BIRTH_DATE DATE,

SOLAR CHAR(1),

HEIGHT SMALLINT,

WEIGHT SMALLINT,

CONSTRAINT PLAYER_PK PRIMARY KEY (PLAYER_ID),

CONSTRAINT PLAYER_FK FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID) );

테이블 생성 예제에서 추가적인 주의 사항 몇 가지

- 테이블 생성시 대/소문자 구분은 하지 않는다. 기본적으로 테이블이나 칼럼명은 대문자로 만들어진다.

- DATETIME 데이터 유형에는 별도로 크기를 지정하지 않는다.

- 문자 데이터 유형은 반드시 가질 수 있는 최대 길이를 표시해야 한다.

- 칼럼과 칼럼의 구분은 콤마로 하되, 마지막 칼럼은 콤마를 찍지 않는다.

- 칼럼에 대한 제약조건이 있으면 CONSTRAINT를 이용하여 추가할 수 있다.

다. 제약조건(CONSTRAINT)

제약조건(CONSTRAINT) :  데이터의 무결성을 유지하기 위한 데이터베이스의 보편적인 방법

  • - 제약조건의 종류
  • - NULL 의미 :
  • 조건에 맞는 데이터가 없을 때의 공집합과도 다르다.

    ‘NULL’은 ‘아직 정의되지 않은 미지의 값’이거나 ‘현재 데이터를 입력하지 못하는 경우’를 의미

     

    - DEFAULT 의미

    데이터 입력 시에 칼럼의 값이 지정되어 있지 않을 경우 기본값(DEFAULT)

     

    [예제] 팀 테이블

    테이블명 : TEAM

    테이블 설명 : K-리그 선수들의 소속팀에 대한 정보를 가지고 있는 테이블

    칼럼명 : =>

    제약조건 : 기본 키(PRIMARY KEY) → TEAM_ID (제약조건명은 TEAM_ID_PK)

                        NOT NULL → REGION_NAME, TEAM_NAME, STADIUM_ID (제약조건명은 미적용)

    Oracle

    SQL Server

    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 CHAR(3),

    ZIP_CODE2 CHAR(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),

    CONSTRAINT TEAM_FK FOREIGN KEY (STADIUM_ID) REFERENCES STADIUM(STADIUM_ID) );

    CREATE TABLE TEAM (

    TEAM_ID CHAR(3) NOT NULL,

    REGION_NAME VARCHAR(8) NOT NULL,

    TEAM_NAME VARCHAR(40) NOT NULL,

    E_TEAM_NAME VARCHAR(50),

    ORIG_YYYY CHAR(4),

    STADIUM_ID CHAR(3) NOT NULL,

    ZIP_CODE1 CHAR(3),

    ZIP_CODE2 CHAR(3),

    ADDRESS VARCHAR(80),

    DDD VARCHAR(3),

    TEL VARCHAR(10),

    FAX VARCHAR(10),

    HOMEPAGE VARCHAR(50),

    OWNER VARCHAR(10),

    CONSTRAINT TEAM_PK PRIMARY KEY (TEAM_ID),

    CONSTRAINT TEAM_FK FOREIGN KEY (STADIUM_ID) REFERENCES STADIUM(STADIUM_ID)

    );

     

    라. 생성된 테이블 구조 확인

    [예제] 선수(PLAYER) 테이블의 구조를 확인한다.

    [실행 결과] Oracle
    DESCRIBE PLAYER;
     

    [실행 결과] SQL Server

    exec sp_help 'dbo.PLAYER' go

     

    마. SELECT 문장을 통한 테이블 생성 사례

    SELECT 문장을 활용해서 테이블을 생성할 수 있는 방법(CTAS: Create Table ~ As Select ~)

    CTAS 기법 사용시 주의할 점 :

                  기존 테이블의 제약조건 중에 NOT NULL만 새로운 복제 테이블에 적용이 되고,

                  기본키, 고유키, 외래키, CHECK 등의 다른 제약 조건은 없어진다는 점이다.

                  제약 조건을 추가하기 위해서는 뒤에 나오는 ALTER TABLE 기능을 사용해야 한다.

                 SQL Server에서는 Select ~ Into ~ 를 활용하여 위와 같은 결과를 얻을 수 있다.

                             단, 칼럼 속성에 Identity를 사용했다면 Identity 속성까지 같이 적용이 된다.

     

    [예제] 선수(PLAYER) 테이블과 같은 내용으로 TEAM_TEMP라는 복사 테이블을 만들어 본다.

    [예제] Oracle
    CREATE TABLE TEAM_TEMP AS SELECT * FROM TEAM; 테이블이 생성되었다.

    [예제] SQL Server

    SELECT * INTO TEAM_TEMP FROM TEAM; (1개 행이 영향을 받음)

     

    3. ALTER TABLE

    가. ADD COLUMN : 
    ALTER TABLE 테이블명 ADD 추가할 칼럼명 데이터 유형;

    주의 : 새롭게 추가된 칼럼은 테이블의 마지막 칼럼이 되며 칼럼의 위치를 지정할 수는 없다.

     

    [예제] PLAYER 테이블에 ADDRESS(데이터 유형은 가변 문자로 자릿수 80자리로 설정한다.) 칼럼을 추가한다.

    [예제] Oracle
    ALTER TABLE PLAYER ADD (ADDRESS VARCHAR2(80));
     

    [예제] SQL Server

    ALTER TABLE PLAYER ADD ADDRESS VARCHAR(80);

     

    나. DROP COLUMN

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

    [예제] 앞에서 PLAYER 테이블에 새롭게 추가한 ADDRESS 칼럼을 삭제한다.

    [예제] Oracle
    ALTER TABLE PLAYER DROP COLUMN ADDRESS;  
     
    [예제] SQL Server
    ALTER TABLE PLAYER DROP COLUMN ADDRESS; 
    다. 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 제약조건을 추가할 수 있다.

     

    [예제] TEAM 테이블의 ORIG_YYYY 칼럼의 데이터 유형을 CHAR(4)→VARCHAR2(8)으로 변경하고, 향후 입력되는 데이터의 DEFAULT 값으로 '20020129'을 적용하고, 모든 행의 ORIG_YYYY 칼럼에 NULL이 없으므로 제약조건을 NULL → NOT NULL로 변경한다.

    [예제] Oracle
    ALTER TABLE TEAM_TEMP MODIFY (ORIG_YYYY VARCHAR2(8) DEFAULT '20020129' NOT NULL);

    [예제] SQL Server
    ALTER TABLE TEAM_TEMP ALTER COLUMN ORIG_YYYY VARCAHR(8) NOT NULL; 
    ALTER TABLE TEAM_TEMP ADD CONSTRAINT DF_ORIG_YYYY DEFAULT '20020129' FOR ORIG_YYYY; 

  • RENAME COLUMN
  • ALTER TABLE 테이블명 RENAME COLUMN 변경해야 할 칼럼명 TO 새로운 칼럼명;

     

    [예제] Oracle

    => RENAME COLUMN으로 칼럼명이 변경되면, 해당 칼럼과 관계된 제약조건에 대해서도 자동으로 변경되는 장점이 있지만, ADD/DROP COLUMN 기능처럼 ANSI/ISO에 명시되어 있는 기능이 아니고 Oracle 등 일부 DBMS에서만 지원하는 기능이다.

     

    ALTER TABLE PLAYER RENAME COLUMN PLAYER_ID TO TEMP_ID;
    ALTER TABLE PLAYER RENAME COLUMN TEMP_ID TO PLAYER_ID; 

     

    [예제] SQL Server

    sp_rename 변경해야 할 칼럼명, 새로운 칼럼명, 'COLUMN';

    sp_rename 'dbo.TEAM_TEMP.TEAM_ID', 'TEAM_TEMP_ID', 'COLUMN';

    주의: 엔터티 이름 부분을 변경하면 스크립트 및 저장 프로시저를 손상시킬 수 있다.

    라. DROP CONSTRAINT

    ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건명;

    [예제] PLAYER 테이블의 외래키 제약조건을 삭제한다.

    [예제] Oracle
    ALTER TABLE PLAYER DROP CONSTRAINT PLAYER_FK; 테이블이 변경되었다.

    [예제] SQL Server

    ALTER TABLE PLAYER DROP CONSTRAINT PLAYER_FK; 명령이 완료되었다.

    마. ADD CONSTRAINT

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

    [예제] PLAYER 테이블에 TEAM 테이블과의 외래키 제약조건을 추가한다.

    제약조건명은 PLAYER_FK로 하고, PLAYER 테이블의 TEAM_ID 칼럼이 TEAM 테이블의 TEAM_ID를 참조하는 조건이다.

    [예제] Oracle
    ALTER TABLE PLAYER ADD CONSTRAINT PLAYER_FK FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID);

    [예제] SQL Server
    ALTER TABLE PLAYER ADD CONSTRAINT PLAYER_FK FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID);
     

    [예제] PLAYER 테이블이 참조하는 TEAM 테이블을 제거해본다.

    [예제] Oracle
    DROP TABLE TEAM; ERROR: 외래 키에 의해 참조되는 고유/기본 키가 테이블에 있다. ※ 테이블은 삭제되지 않음

     

    [예제] SQL Server
    DROP TABLE TEAM; ERROR: 엔터티 'TEAM'은 FOREIGN KEY 제약 조건을 참조하므로 삭제할 수 없다. ※ 테이블은 삭제되지 않음

    [예제] PLAYER 테이블이 참조하는 TEAM 테이블의 데이터를 삭제해본다.

    [예제] Oracle
     DELETE TEAM WHERE TEAM_ID = 'K10'; ERROR: 무결성 제약조건(SCOTT.PLAYER_FK)이 위배되었다. 자식 레코드가 발견되었다. ※ 데이터는 삭제되지 않음

     

    [예제] SQL Server
    DELETE TEAM WHERE TEAM_ID = 'K10'; ERROR: FOREIGN KEY 제약 조건을 참조하므로 삭제할 수 없다. ※ 데이터는 삭제되지 않음

    위와 같이 참조 제약조건을 추가하면 PLAYER 테이블의 TEAM_ID 칼럼이 TEAM 테이블의 TEAM_ID 칼럼을 참조하게 된다. 참조 무결성 옵션에 따라서 만약 TEAM 테이블이나 TEAM 테이블의 데이터를 삭제하려 할 경우 외부(PLAYER 테이블)에서 참조되고 있기 때문에 삭제가 불가능하게 제약을 할 수 있다. 즉, 외부키(FK)를 설정함으로써 실수에 의한 테이블 삭제나 필요한 데이터의 의도하지 않은 삭제와 같은 불상사를 방지하는 효과를 볼 수 있다.

    4. RENAME TABLE

    RENAME 변경전 테이블명 TO 변경후 테이블명;

    SQL Server에서는 sp_rename을 이용하여 테이블 이름을 변경할 수 있다.

    sp_rename 변경전 테이블명, 변경후 테이블명;

    [예제] RENAME 문장을 이용하여 TEAM 테이블명을 다른 이름으로 변경하고, 다시 TEAM 테이블로 변경한다.

    [예제] Oracle
    RENAME TEAM TO TEAM_BACKUP; 테이블 이름이 변경되었다. RENAME TEAM_BACKUP TO TEAM;

    [예제] SQL Server
    sp_rename 'dbo.TEAM','TEAM_BACKUP'; 주의: 엔터티 이름 부분을 변경하면 스크립트 및 저장 프로시저를 손상시킬 수 있다.
    sp_rename 'dbo.TEAM_BACKUP','TEAM'; 주의: 엔터티 이름 부분을 변경하면 스크립트 및 저장 프로시저를 손상시킬 수 있다.

    5. DROP TABLE

    DROP TABLE 테이블명 [CASCADE CONSTRAINT];

     CASCADE CONSTRAINT 옵션은 해당 테이블과 관계가 있었던 참조되는 제약조건에 대해서도 삭제한다는 것을 의미한다.

    SQL Server에서는 CASCADE 옵션이 존재하지 않으며 테이블을 삭제하기 전에 참조하는 FOREIGN KEY 제약 조건 또는 참조하는 테이블을 먼저 삭제해야 한다.

     

    [예제] PLAYER 테이블을 제거한다.

    [예제] Oracle
    DROP TABLE PLAYER; 테이블이 삭제되었다. DESC PLAYER; ERROR: 설명할 객체를 찾을 수 없다.

     

    [예제] SQL Server
    DROP TABLE PLAYER; 명령이 완료되었다. exec sp_help 'dbo.PLAYER'; 메시지 15009, 수준 16, 상태 1, 프로시저 sp_help, 줄 66 데이터베이스 ‘northwind'에 엔터티 'dbo.player'이(가) 없거나 이 작업에 적합하지 않다.

    6. TRUNCATE TABLE

    TRUNCATE TABLE PLAYER;

    TRUNCATE TABLE은 테이블 자체가 삭제되는 것이 아니고, 해당 테이블에 들어있던 모든 행들이 제거되고 저장 공간을 재사용 가능하도록 해제한다. 테이블 구조를 완전히 삭제하기 위해서는 DROP TABLE을 실행하면 된다.

     

    [예제] TRUNCATE TABLE을 사용하여 해당 테이블의 모든 행을 삭제하고 테이블 구조를 확인한다.

    [예제] Oracle
    TRUNCATE TABLE TEAM; 테이블이 트렁케이트되었다.

     

    [예제] SQL Server
    TRUNCATE TABLE TEAM; 명령이 완료되었다.

     

    [예제] DROP TABLE을 사용하여 해당 테이블을 제거하고 테이블 구조를 확인한다.

    [예제] Oracle
    DROP TABLE TEAM; 테이블이 삭제되었다. DESC TEAM; ERROR: 설명할 객체를 찾을 수 없다.

    [예제] SQL Server

    DROP TABLE TEAM; 명령이 완료되었다.

    exec sp_help 'dbo.TEAM'; 메시지 15009, 수준 16, 상태 1, 프로시저 sp_help, 줄 66 데이터베이스 'northwind'에 엔터티 'dbo.TEAM'이(가) 없거나 이 작업에 적합하지 않다.

    TRUNCATE는 데이터 구조의 변경 없이 테이블의 데이터를 일괄 삭제하는 명령어로 DML로 분류할 수도 있지만 내부 처리 방식이나 Auto Commit 특성 등으로 인해 DDL로 분류하였다.

    테이블에 있는 데이터를 삭제하는 명령어는 TRUNCATE TABLE 명령어 이외에도 다음 DML 절에서 살펴볼 DELETE 명령어가 있다. 그러나 DELETE와 TRUNCATE는 처리하는 방식 자체가 다르다.

    테이블의 전체 데이터를 삭제하는 경우, 시스템 활용 측면에서는 DELETE TABLE 보다는 시스템 부하가 적은 TRUNCATE TABLE을 권고한다. 단, TRUNCATE TABLE의 경우 정상적인 복구가 불가능하므로 주의해야 한다.

     

     

     

    • SQL 개발자 자격증 (bysql.net 2011년 2차 스터디)
    • 작성자: 박우창
    • 최초작성일: 2011년 09월 18 일
    • 본문서는 bysql.net 스터디 결과입니다 .본 문서를 인용하실때는 출처를 밝혀주세요. http://www.bysql.net
    • 문서의 잘못된 점이나 질문사항은 본 문서에 댓글로 남겨주세요. ^^