[SQL] DDL (Data Definition Language)

아래의 명령어들은 모두 Oracle 의 SQL 명령어이다. (SQL Server 명령어의 경우 따로 표시)

👑 자료형

SQL에서 자료형은 벤더별로 다양한 형태를 보인다. 예를 들어 숫자타입의 경우 ANSO/ISO 기준에서

NUMERIC Type의 하위 개념으로 NUMERIC, DECIMAL, SMALLINT, INTEGER, INT 등 수많은

타입을 제공하는 반면, Oracle 은 숫자형 타입에 대해 NUMBER 한 가지만 제공한다.

즉, 벤더별로 꽤 많은 차이를 보이므로, 사용하는 DBMS 마다의 차이가 있다는 것을 인지해야 한다.

  • 가변 길이인 VARCHAR 의 경우 정의한 길이(s)와 실제 데이터 길이에 차이가 있는 경우 적합함.

  • CHAR 에서는 공백을 채워 비교하며, VARCHAR 에서는 공백도 하나의 문자로 취급한다.

      e.g. CHAR : 'HELLO' = 'HELLO   '
    
           VARCHAR : 'HELLO' ≠ 'HELLO   '
    
  • 데이터들이 고정된 길이의 문자열을 가지지 않는다면 VARCHAR 를 사용하는 것이 바람직하다.


👑 DDL (Data Definition Language)

테이블을 생성하고 테이블의 구조를 변경하는 명령어로 생성(CREATE), 수정(ALTER)

삭제(DROP), 이름 변경(RENAME) 등의 명령어들이 존재한다.


👑 CREATE TABLE

다음과 같은 구문을 통해 테이블을 생성할 수 있다.

CREATE TABLE TABLENAME (
    ColumnName DataType [DEFAULT 형식],
    ColumnName DataType [DEFAULT 형식],
    ColumnName DataType [DEFAULT 형식]
);

테이블 생성 시에는 몇 가지 규칙들을 지켜야 한다.

  • 테이블 이름은 다른 테이블 이름과 중복되면 안된다.

  • 한 테이블 내에서 칼럼명은 중복될 수 없다.

  • 각 칼럼들은 , 로 구분되며, 테이블 생성문의 끝은 ; 로 끝난다.
    (마지막 칼럼은 , 를 사용하지 않는다.)

  • 칼럼의 자료형을 꼭 지정해야만 하며, 테이블명과 칼럼명은 문자로 시작해야 한다.

  • A-Z, a-z, 0-9, _, $, # 문자만 사용할 수 있다.

  • 한 테이블의 칼럼명은 다른 테이블의 칼럼명과는 같을 수 있다. (외래 키 관계)

  • 일반적으로 테이블명과 칼럼명은 대/소문자 구분을 하지 않는다.

  • 칼럼에 대한 제약조건은 CONSTRAINT 를 사용하여 추가한다.

      제약조건은 칼럼 LEVEL 방식과 테이블 LEVEL 정의 방식이 있으며,
      하나의 SQL 문장 내에서 혼용이 가능하다. (기능 또한 같음)
    


💡 CREATE TABLE 예시

다음은 Oracle 에서의 CREATE TABLE 구문이다.

TEAM 테이블은 5개의 COLUMN 을 가지며, 기본키는 TEAM_ID 이고, 외래키는 STADIUM_ID 이다.

CREATE TABLE TEAM (
    TEAM_ID         CHAR(3) NOT NULL, -- 데이터 유형 뒤에 정의한 칼럼 LEVEL 방식
    TEAM_NAME       VARCHAR2(30) NOT NULL,
    REGION_NAME     VARCHAR2(30) NOT NULL,
    STADIUM_ID      CHAR(3) NOT NULL,
    FOUNDED_YEAR    CHAR(4),
    -- 테이블 생성 마지막에 모든 제약조건을 기술하는 테이블 LEVEL 정의 방식
    CONSTRAINT TEAM_PK PRIMARY KEY (TEAM_ID),
    CONSTRAINT TEAM_FK FOREIGN KEY (STADIUM_ID) REFERENCES STADIUM(STADIUM_ID)
);


💡 제약조건 (Constraint)

제약조건이란 데이터의 무결성을 유지하기 위해 특정 칼럼에 설정하는 제약이다.

테이블 생성 시에 적절한 제약조건을 기술하여 적절하게 정보를 관리해야 한다.

제약 조건의 종류

  • PRIMARY KEY

    • 테이블에 저장된 튜플을 식별하기 위한 기본키이다.

    • 하나의 테이블에는 하나의 기본키 제약만 정의 가능하다.

    • PRIMARY KEY로 정의한 경우 DBMS가 자동으로 UNIQUE 인덱스를 생성하여
      기본키 칼럼에는 NULL을 입력할 수 없게 된다.

    • PRIMARY KEY = UNIQUE KEY + NOT NULL

  • UNIQUE KEY

    • 테이블에 저장된 튜플을 식별하기 위한 고유키를 정의한다.

    • 기본키와 달리 NULL 값을 허용한다.

    • 테이블 당 여러 개의 고유키를 정의할 수 있다.

  • NOT NULL

    • NULL 값의 입력을 금지한다. 즉, 값의 입력이 필수이다.
  • CHECK

    • 입력할 수 있는 값의 범위를 제한한다.

    • TRUE or FALSE로 평가할 수 있는 논리식을 지정한다.

  • FOREIGN KEY

    • 테이블 간 관계를 정의하기 위해 기본키를 다른 테이블의 외래키로 복사한다.

    • 참조 무결성 제약 옵션을 선택할 수 있다.


💡 테이블 구조 확인

테이블 생성 후 테이블이 정상적으로 만들어졌는지 확인해야 한다.

Oracle 의 경우 DESCRIBE 를 통해 테이블의 정보를 확인할 수 있다.

DESCRIBE TEAM;


👑 ALTER TABLE

테이블을 사용하는 도중 요구 사항 등으로 인해 테이블 구조를 변경해야 할 상황이

발생할 수도 있다. 따라서 칼럼을 추가/삭제하거나, 제약조건을 추가/삭제하는

작업이 필요하게 되며, ALTER 를 통해 이를 해결할 수 있다.


💡 ADD COLUMN

  • 테이블에 칼럼을 추가하는 명령어로는 ADD를 사용한다.

  • 추가된 칼럼은 테이블의 마지막에 추가되며, 추가될 위치를 지정할 수는 없다.

ALTER TABLE 테이블명
ADD 추가 칼럼명 자료형;


💡 DROP COLUMN

  • 테이블에서 칼럼을 삭제하는 명령어로는 DROP을 사용한다.

  • 데이터의 유무에 상관없이 삭제가 가능하며, 한 번에 하나의 칼럼만 삭제 가능하다.

  • 또한 칼럼 삭제 후에 최소 하나의 칼럼은 테이블에 남아 있어야 한다.

  • 삭제된 칼럼의 복구는 불가능하다.

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


💡 MODIFY COLUMN

  • 칼럼의 자료형, 디폴트 값, NOT NULL 제약조건에 대한 변경을 할 수 있다.

  • 칼럼의 크기는 줄일 수는 없고, 늘릴 수는 있다.

  • 하지만, 칼럼이 NULL 값만 가지고 있거나 튜플이 아무것도 없다면, 칼럼의 크기를 줄일 수 있다.

  • 칼럼에 NULL 값이 없을 경우에만 NOT NULL 제약조건을 추가할 수 있다.

ALTER TABLE 테이블명
MODIFY (칼럼명1 자료형 [DEFAULT] [NOT NULL],
        칼럼명2 자료형 ...);


💡 RENAME COLUMN

  • 칼럼명을 변경할 수 있는 RENAME 구문이다.
ALTER TABLE 테이블명
RENAME COLUMN 변경  칼럼명 TO  칼럼명;


💡 DROP CONSTRAINT

  • 테이블 생성 시에 부여했던 제약조건을 삭제하는 명령어이다.
ALTER TABLE 테이블명
DROP CONSTRAINT 제약조건명;

-- e.g.
ALTER TABLE TEAM
DROP CONSTRAINT TEAM_FK;


💡 ADD CONSTRAINT

  • 테이블 생성 이후에 제약조건을 추가할 수 있는 명령어이다.
ALTER TABLE 테이블명
ADD CONSTRAINT 제약조건명 제약조건 (칼럼명);

-- e.g.
ALTER TABLE TEAM
ADD CONSTRAINT TEAM_FK
FOREIGN KEY (STADIUM_ID) REFERENCES STADIUM(STADIUM_ID);


👑 RENAME TABLE

  • 테이블명을 변경하려면 RENAME 명령어를 사용해야 한다.
RENAME 변경  테이블명 TO  테이블명;


👑 DROP TABLE

  • 테이블을 삭제하려면 DROP TABLE을 사용한다.

  • CASCADE CONSTRAINT 옵션은 해당 테이블과의 관계에 대해서도 삭제한다는 의미이다.
    (SQL Server 에서는 CASCADE 옵션 존재 X → 테이블 삭제 이전에 제약 조건부터 삭제해야 함)

DROP TABLE 테이블명 [CASCADE CONSTRAINT];


👑 TRUNCATE TABLE

  • 테이블 자체를 삭제하는 것이 아닌, 모든 튜플들을 제거하고, 저장 공간을 재사용 할 수 있도록 해제한다.

  • 테이블을 완전히 삭제하려면 DROP TABLE을 사용한다.

  • TRUNCATEDML로 분류할 수도 있지만 DDL로 분류하기도 한다.

  • 테이블에 있는 데이터를 삭제하는 다른 명령어로 DELETE가 있다.

  • 하지만, 둘은 처리 방식 자체가 다르고, 테이블의 전체 데이터를 삭제하는 경우 시스템 부하가 적은
    TRUNCATE 를 사용하는 것이 권고된다.

TRUNCATE TABLE 테이블명;

Categories:

Updated:

Leave a comment