*SQL_Oracle*

DDL < CREATE >

깐부로부터 2021. 11. 8. 22:02

DDL (DATA DEFINITION LANGUAGE) : 데이터 정의 언어

 

오라클에서 제공하는 객체(OBJECT)를

새로이 만들고(CREATE), 구조를 변경하고(ALTER), 구조자체를 삭제하는 (DROP)하는 명령문

즉, 구조자체를 정의하는 언어로 주로 DB관리자, 설계자가 사용함

 

오라클에서의 객체(구조) : 테이블(TABLE), 뷰(VIEW), 시퀀스(SEQUENCE)

                                  인덱스(INDEX), 패키지(PACKAGE), 트리거(TRIGGAER)

                                  프로시져(PROCEDUER), 함수(FUNCTION),

                                  동의어(SYNONYM), 사용자(USER)

 

 

< CREATE TABLE >

테이블이란? 

행(ROW), 열(COLUMN)로 구성되는 가장 기본적인 데이터베이스 객체

모든 데이터는 테이블을 통해서 저장됨(데이터를 보관하고자 한다면 테이블을 만들어야 함)

 

[표현법]

CREATE TABLE 테이블명{

       컬럼명 자료형,

       컬럼명 자료형,

       컬럼명 자료형,

       컬럼명 자료형,

       컬럼명 자료형

       ...........

};

 

 

 

< 자료형 >

- 문자(CHAR()(크기) / VARCHAR2(크기)) : 크기는 BYTE 수이다.

                                                      (숫자, 영문자, 특수문자 => 1글자 당 1BYTE

                                                                              한글 => 1글자 당 3BYTE)

   CHAR (바이트수) : 최대 2000BYTE 까지 지정 가능

                           고정길이(아무리 적은값이 들어와도 공백으로 채워서 처음 할당한 크기 유지)

   

   VARCHAR2 (바이트수) : 최대 4000BYTE까지 지정 가능

                                  가변길이(적은 값이 들어오면 그 담긴 값에 맞춰 크기가 줄어든다.)

                                  VAR는 '가변'을 의미, 2는 '2배'를 의미한다.

 

- 숫자 (NUMBER) : 정수/실수 상관없이 NUMBER

 

- 날짜 (DATE)

 

 

 

 

컬럼에 주석 달기 (컬럼에 대한 설명)

 

COMMENT ON COLUMN 테이블명.컬럼명 IS '주석 내용';

 

 

- 데이터 딕셔너리 : 다양한 객체들의 정보를 저장하고 있는 시스템 테이블
- USER_TABLES : 현재 이 계정이 가지고 있는 테이블의 전반적인 구조를 확인할 수 있는 데이터 딕셔너리

 

 

 

 

-- 데이터를 추가할 수 있는 구문(INSERT : 한 행으로 추가, 값의 순서 중요)
-- INSERT INTO 테이블명 VALUES(첫 번째 컬럼의 값, 두번째 컬럼의 값, 세번째.....);

위의 NULL값이나 중복된 아이디값은 유효하지 않은 값들이다.

유효한 데이터값을 유지하기 위해서 제약조건을 걸어줘야 한다.


< 제약 조건 >

 

- 종류 : NOT NULL, NIQUE, CHECK, PRIMARY KEY, FOREIGN KEY

- 원하는 데이터값만을 유지하기 위해서(보관하기 위해서) 특정 컬럼마다 설정하는 제약

   (데이터 무결성 보장을 목적으로)

- 제약조건 부여된 컬럼에 들어올 데이터에 문제가 없는지 자동으로 검사할 목적

- 컬럼에 제약조건을 부여한는 방식 :  컬럼레벨 / 테이블레벨

 

 

1. NOT NULL 제약조건

 

해당 컬럼에 반드시 값이 존재해야만 할 경우(NULL값이 절대 들어와서는 안되는 컬럼)
삽입 / 수정 시 NULL값을 허용하지 않도록 제한
   

단, NOT NULL 제약조건은 컬럼레벨 방식 밖에 안됨

인서트가 아예먹지 않음. 에러발생

 

 

2. UNIQUE 제약조건
    
컬럼에 중복값을 제한하는 제약조건
삽입 / 수정 시 기존에 해당 컬럼값중에 중복값이 있을 경우 추가 또는 수정이 되지 않게 제약!
   

컬럼레벨 / 테이블레벨 방식 둘 다 가능

 

 

 

테이블 삭제하기!

 

 

 

 

제약조건 부여시 제약조건명도 지정하는 표현식

 

컬럼레벨 방식
    CREATE TABLE 테이블명(
        컬럼명 자료형 CONSTRAINT 제약조건명 제약조건,
        컬러명 자료형,
        컬러명 자료형,
        ....
    );

 

테이블레벨 방식
    CREATE TABLE 테이블명(
        컬러명 자료형,
        컬러명 자료형,
        컬럼명 자료형,
        ...
        CONSTRAINT 제약조건명 제약조건 (컬럼명)
    );

 

 

 

 3. CHECK 제약조건


컬럼에 기록될 수있는 값에 대한 조건을 설정해 둘 수 있다.
    
CHECK (조건식)    

 

 

 

 

번외) 특정 컬럼에 들어올 값에 대한 기본값 설정! => 제약조건은 아님

 

 

 

 

 

 

4. PRIMARY KEY (기본키) 제약조건

 

테이블에서 각 행들의 정보를 유일하게 식별할 수 있는 컬럼에 부여하는 제약조건
=> 각 행들을 구분할 수 있는 식별자의 역할
예) 회원번호, 주문번호, 사번, 학번, 예약번호

=> 중복되지 않고 값이 존재해야만 하는 컬럼에 PRIMARY KEY부여 (UNIQUE + NOT NULL)
    
★한 테이블 당 한개의 컬럼만 설정 가능

 

 

 

 

5. FOREIGN KEY (외래키)제약 조건


해당 컬럼에 다른 테이블에 존재하는 값만 들어와야 될 때 부여하는 제약조건
=> 다른 테이블 (부모테이블)을 참조한다고 표현
즉, 참조된 다른 테이블이 제공하고 있는 값만 들어올 수 있다.

=> FOREIGN KEY 제약조건으로 다른 테이블간의 관계를 형성할 수 있음
   

 [ 표현법 ]
    
 - 컬럼레벨 방식
   컬럼명 자료형 CONSTRAINT 제약조건명 REFERENCES 참조할테이블명(참조할컬럼명)
   

- 테이블레벌 방식
CONSTRAINT 제약조건명 FOREIGN KEY(컬럼명) REFERENCES 참조할테이블명(참조할컬럼명)
    
두 방식 모두 참조할 컬럼명을 생략이 가능하다!!

생략 시 기본적으로 참조할 테이블의 PRIMARY KEY 컬럼으로 참조할 컬럼명이 잡힌다.

문제) 부모테이블 (MEM_GRADE)에서 데이터값이 삭제된다면??

 

자식테이블 중에 컬럼값을 사용하고 있기 때문에 삭제할 수 없음
외래키 제약조건 부여시 삭제옵션을 부여하지 않았음
자식테이블에서 사용하고 있는 값이 있을 경우 삭제가 안되는 "삭제제한옵션"이 걸려있음


자식 테이블 생성 시 (외래키 제약조건 부여 시)
  

부모테이블의 데이터가 삭제 되었을 때 자식테이블에는 어떻게 처리할지 옵션으로 정할 수 있음
  
*FOREIGN KEY 삭제 옵션
삭제 옵션을 별도로 지정하지 않으면 ON DELETE RESTRICTED(삭제 제한)으로 기본설정

 

 

 

 

1. ON DELETE SET NULL

 

부모데이터 삭제 시 해당 데이터를 사용하고 있는 자식데이터를 

NULL로 변경시키는 옵션

 

 

 

 

2. ON DELETE CASCADE

 

부모데이터 삭제 시 해당 데이터를 사용하고 있는 
데이터도 같이 삭제해버리는 옵션