。공부 。

<DB> SQL 정의어 (DDL)

kyoe 2007. 11. 10. 12:34
* DDL(Data Define Language)의 개념 *
- DDL은 스키마(Schema), 도메인(Domain), 테이블(Table),뷰(View),인덱스(Index)를 정의하거나 변경 또는 제거할 때 사용하는 언어이다.
- DDL로 정의된 내용은 메타데이터(MEtadata)가 되며, 시스템 카탈로그(System Catalog)에 저장한다.
<DDL의 유형>
- CREATE : 스키마, 도메인, 테이블, 뷰, 인덱스를 정의한다.
- ALTER : 테이블에대한 정의를 변경한다.
- DROP : 스키마, 도메인, 테이블, 뷰, 인덱스를 제거한다.

* CREATE SCHEMA *

- 스키마를 정의하는 명령문
- 스키마는 하나의 응용(사용자)에 속하는 테이블과 기타 구성 요소 등을 그룹짓기 위한 것이다.
- 스키마의 식별을 위한 스키마명과 해당 스키마의 소유권자나 허가권자를 정의한다.
= 표기 형식 =
CREATE SCHEMA 스키마_이름 AUTHORIZATION 사용자_ID;
예)
CREATE SCHEMA 대학교 AUTHORIZATION 홍길동;

* CREATE DOMAIN *
- 도메인을 정의하는 명령문
- 도메인이란 하나의 속성이 취할 수 있는 동일한 타입의 원자값들의 집합이다.
- 임의의 속성에서 취할 수 있는 값의 범위가 SQL에서 지원하는 전체 데이터 타입의 값이 아니고 일부분 일 때, 사용자는 그 값의 범위를 도메인으로 정의할 수 있다.
- 정의된 도메인명은 일반적인 데이터 타입처럼  사용한다.
= 표기 형식 =
CREAT DOMAIN 도메인명 데이터_타입
           [DEFAULT 기본값]
           [CONSTRAINT VALID-도메인명 CHECK(범위 값)];
- 데이터 타입 : SQL에서 지원하는 데이터 타입
- 기본값 : 데이터를 입력하지 않았을 때 자동으로 입력되는 값
예) 성별을 '남' 또는 '여'와 같은 정해진 한 개의 문자로 표현되는 도메인 SEX를 정의하는 SQL문
CREATE DOMAIN SEX CHAR(1)    // 정의된 도메인은 문자형이고 크기는 1이다.
DEFAULT '남'   //도메인 SEX를 지정한 속성의 기본값은 '남' 이다.
CONSTRAINT VALID-SEX CHECK(VALUE IN ('남','여'));
//SEX를 지정한 속성에는 '남', '여'중 하나의 값만을 저장할 수 있다.

* CREATE TABLE *
- 테이블을 정의하는 명령문
= 표기 형식 =
CREATE TABLE 테이블명
             (속성명 테이터_타입[NOT NULL],
              [, PRIMARY KEY(기본키_속성명, ..)]
              [, UNQUE(대체키_속성명, ..)]
              [, FOREIGN KEY(외래키_속성명, ..) REFERENCES 참조테이블(기본키_속성명)]
              [, CHECK(조건식)];
- 기본 테이블에 포함될 모든 속성에 대하여 속성명, 속성의 테이터 타입, NOT NULL을 지정한다.
- PRIMARY KEY : 기본키를 구성하는 속성 또는 속성의 집합을 지정한다.
- UNIQUE : 대체키로 사용할 속성 또는 속성의 집합을 지정한다.
- FOREIGN KEY ~ REFERENCES ~ : 외래키 속성과 참조 테이블에 관한 정보를 지정한다. 외래키가 지정되면 참조 무결성의 CASCADE법칙이 적용된다.
- CHECK : 속성값에 대한 제약 사항을 지정한다.

예) 이름, 학번, 전공, 성별, 생년월이로 구성된 <학생> 테이블을 정의하는 SQL문
조건 : 이름은 NULL이 올수 없고, 학번은 기본키로, 전공은 <학과>테이블의 학과 코드를 참조하는 외래키로 사용, 생년월일을 1980-01-01 이후의 데이터만 저장할 수 있다.
CREATE TABLE 학생      //<학생>테이블 생성.
       (이름 VARCHAR(15) NOT NULL,      //'이름'속성은 문자 15자로, NULL 값을 갖지않는다.
        학번 VARCHAR(15),                     //'학번'속성은 문자 15자.
         전공 VARCHAR(20),                     //'전공'속성은 문자 20자.
         성별 SEX,                                   //'성별'속성은 'SEX'도메인을 자료형으로 사용한다.
         생년월일 DATE,                           //'생년월일'속성은 DATE자료형.
         PRIMARY KEY(학번),                  //'학번'속성을 기본키로 정의.
          FOREGIN KEY(전공), REFERENCES 학과(학과코드),
          //'전공' 속성은 <학과>테이블의 '학과코드'속성을 참조하는 외래키.
          CHECK (생년월일 >= '1980-01-01');

* CREATE VIEW *
뷰는 하나 이상의 테이블로부터 유도되는 이름을 갖는 가상 테이블(Virtual Table)로 CREAT VIEW는 뷰를 정의하는 명령문이다.
= 표기 형식 =
CREATE VIEW 뷰명[(속성명[,속성명, ..])]
AS SELECT문;
- SELECT 문을 서브 쿼리 로 사용하여 SELECT 문의 결과로서 뷰를 생성한다.
- 서브 쿼리인 SELECT 문에는 UNION이나 ORDER BY 절을 사용할 수 없다.
- 속성명을 기술하지 않으면, SELECT문의 속성명이 자동으로 사용된다.
예) 고개 테이블에서 주소가 '청주시'인 고객들의 성명과 전화번호를 '청주고객'이라는 뷰로 정의하라
CREATE VIEW 청주고객(성명, 전화번호)
AS SELECT 성명, 전화번호
FROM 고객
WHERE 주소 = '청주시';

* CREATE INDEX *
인덱스는 검색을 빠르게 하기 위해 만든 보조적인 데이터 구조이며, CREATE INDEX는 인덱스를 정의하는 명령문이다.
= 표기 형식 =
CREATE [UNIQUE] INDEX <인덱스명>
          ON 테이블명({속성명[ASC[DESC][,속성명[ASC | DESC]]})
          [CLUSTER];
- UNIQUE
    ->사용된 경우 : 중복값이 없는 속성으로 인덱스를 생성한다.
    ->생략된 경우 ; 중복값을 허용하는 속성으로 인덱스를 생성한다.
- 정렬 여부 지정
    ->ASC : 오름차순 정렬
    ->DESC : 내림차순 정렬
    ->생략된 경우 : 오름차순으로 정렬됨
- CLUSTER : 지정된 키에 따라 튜플들을 그룹으로 저장하기 위해 사용한다.
예) <고객> 테이블에서 UNIQUE한 특성을 갖는 고객번호 속성에 대해 내림차순으로 정렬하여 '고객번호_idx'라는 이름으로 인덱스를 정의하시오.
CREATE UNIQUE INDEX 고객번호_idx
       ON 고객(고객번호 DESC);

* ALTER TABLE *
테이블에 대한 정의를 변경하는 명령문.
= 표기 형식 =
ALTER TABLE 테이블명 ADD 속성명 테이타_타입[DEFAULT '기본값];
ALTER TABLE 테이블명 ALTER 속성명 [SET DEFAULT '기본값];
ALTER TABLE 테이블명 DROP 속성명 [CASCADE];
- ADD : 새로운 속성을 추가한다.
- ALTER : 속성의 묵시적(Default) 값을 변경한다.
- DROP : 속성을 제거한다.
. MODIFY : 속성 수정
예) <학생> 테이블에 최대 3문자로 구성되는 학년 속성을 추가하는 SQL문
ALTER TABLE 학생 ADD 학년 VARCHAR(3);

* DROP *
스키마, 도메인, 테이블, 뷰, 인덱스를 제거하는 명령문
= 표기 형식 =
DROP SCHEMA 스키마명[CASCADE | RESTRICT];
DROP DOMAIN 도메인명[CASCADE | RESTRICT];
DROP TABLE 테이블명[CASCADE | RESTRICT];
DROP VIEW 뷰명[CASCADE | RESTRICT];
DROP INDEX 인덱스명;
- CASCADE : 제거할 개체를 참조하는 다른 모든 개체를 함께 제거한다. 즉, 주테이블의 테이터 제거시, 각각의 외래키와 관계를 맺고 있는 모든 데이터를 함께 제거하는 참조 무결성 제약 조건을 설정하기 위해 사용된다.
- RESTRICT : 다른 개체가 제거할 개체를 잠조중일 경우 제거가 취소된다.
예) <학생> 테이블을 제거하는 SQL문을 작성하시오. 단 <학생> 테이블을 참조하는 모든 데이터도 함께 제거한다.
DROP TABLE 학생 CASCADE;

- 자료참고 : 기사친구(www.gisa79.com) -