SQL :: Oracle :: DDL(CREATE)

김병철·2022년 9월 14일
0

SQL

목록 보기
5/11

DDL

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

오라클에서 제공하는 객체(OBJECT)를 새로 만들고(CREATE) 구조를 변경하고(ALTER) 구조를 삭제하는(DROP) 명령문
DB관리자, 설계자가 사용한다.

CREATE TABLE

TABLE : 행(ROW), 열(COLUMN)로 구성되는 가장 기본적인 데이터베이스 객체 종류 중 하나

모든 데이터는 테이블을 통해 저장된다.
(데이터를 조작하려면 테이블을 만들어야 한다.)

CREATE TABLE 테이블명(
	컬럼명 자료형,
    컬럼명 자료형,
    컬럼명 자료형,
    컬럼명 자료형,
    ...
);

자료형

  • 문자(CHAR(크기)/VARCHAR(크기)) : 크기는 BYTE 수
    (숫자, 영문자, 특수문자 -> 1BYTE, 한글 -> 3BYTES)
    - CHAR(바이트수) : 최대 2000BYTE까지 지정가능. 고정길이(아무리 적은 값이 들어와도 공백으로 채워서 처음 할당한 크기를 유지)
    - VARCHAR2(바이트수) : 최대 4000 BYTE까지 지정가능. 가변길이(적은 값이 들어온 경우 그 값에 맞춰 크기가 줄어든다.
  • 숫자
    • NUMBER : 정수/실수 상관없이 NUMBER
  • 날짜
    • DATE : 년/월/일/시/분/초 형식으로 시간 지정.

COMMENT

컬럼에 주석 달기

  • 예시 :
COMMENT ON COLUMN MEMBER.MEMBER_ID IS '회원아이디';
COMMENT ON COLUMN MEMBER.MEMBER_PW IS '회원비밀번호';
COMMENT ON COLUMN MEMBER.MEMBER_NAME IS '회원이름';
COMMENT ON COLUMN MEMBER.MEMBER_BDATE IS '생년월일';

INSERT

한 행으로 추가.
추가 시 값의 순서를 지켜야 한다.

INSERT INTO 테이블명 VALUES(첫번째컬럼값,두번째컬럼값,....);

CONSTRAINT

유효한 데이터를 유지하기 위해 제약조건을 걸어야 한다.
원하는 데이터값만 유지하기 위해 특정 컬럼마다 설정
제약조건이 부여된 컬럼에 들어올 데이터에 문제가 있는지 자동으로 검사

NOT NULL

해당 컬럼에 반드시 값이 존재해야만 할 경우 사용
NULL이 들어와서는 안 되는 컬럼에 부여

  • 예시 :
CREATE TABLE MEM_NOTNULL(
    MEM_NO NUMBER NOT NULL,
    MEM_ID VARCHAR2(20) NOT NULL,
    MEM_PW VARCHAR2(20) NOT NULL,
    MEM_NAME VARCHAR2(20) NOT NULL,
    GENDER CHAR(3),
    PHONE VARCHAR2(20),
    ADDRESS VARCHAR2(50)
);

UNIQUE

컬럼에 중복값을 제한
삽입 / 수정시 기존에 해당 컬럼값 중 중복값이 있을 경우 추가 또는 수정이 되지 않도록 제약
컬럼 레벨 방식 / 테이블 레벨 방식 둘 다 가능

  • 컬럼 레벨 방식 :
CREATE TABLE MEM_UNIQUE(
    MEM_NO NUMBER NOT NULL,
    MEM_ID VARCHAR2(20) NOT NULL UNIQUE, --컬럼 레벨 방식
    MEM_PW VARCHAR2(20) NOT NULL,
    MEM_NAME VARCHAR2(20) NOT NULL,
    GENDER CHAR(3),
    PHONE VARCHAR2(20),
    ADDRESS VARCHAR2(50)
);
  • 테이블 레벨 방식 :
CREATE TABLE MEM_UNIQUE(
    MEM_NO NUMBER NOT NULL,
    MEM_ID VARCHAR2(20) NOT NULL,
    MEM_PW VARCHAR2(20) NOT NULL,
    MEM_NAME VARCHAR2(20) NOT NULL,
    GENDER CHAR(3),
    PHONE VARCHAR2(20),
    ADDRESS VARCHAR2(50),
    UNIQUE(MEM_ID) -- 테이블 레벨 방식
);

제약조건 명 지정하기

지정하지 않을 경우 임의의 이름이 지어진다 ex)SYS_C007650

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

CHECK

컬럼에 기록될 수 있는 값에 대한 조건을 설정

CHECK (조건식)
CREATE TABLE MEM_CHECK(
    MEM_NO NUMBER NOT NULL,
    MEM_ID VARCHAR2(20) NOT NULL UNIQUE,
    MEM_PW VARCHAR2(20) NOT NULL,
    MEM_NAME VARCHAR2(20) NOT NULL,
    GENDER CHAR(3) CHECK (GENDER IN('남','여')), -- CHECK
    PHONE VARCHAR2(20),
    ADDRESS VARCHAR2(50),
    MEM_DATE DATE NOT NULL
);

DEFAULT

특정 컬럼에 들어올 값에 대한 기본값 설정
제약조건은 아니다.

CREATE TABLE MEM_CHECK(
    MEM_NO NUMBER NOT NULL,
    MEM_ID VARCHAR2(20) UNIQUE NOT NULL,
    MEM_PW VARCHAR2(20) NOT NULL,
    MEM_NAME VARCHAR2(20) NOT NULL,
    GENDER CHAR(3) CHECK (GENDER IN('남','여')) NOT NULL,
    PHONE VARCHAR2(20),
    MEM_DATE DATE DEFAULT SYSDATE NOT NULL --DEFUALT 설정을 먼저하고 제약조건을 걸어줘야한다.
);

PRIMARY KEY

테이블에서 각 행들의 정보를 유일하게 식별할 수 있는 컬럼에 부여

  • 예시 :
CREATE TABLE MEM_PRIMARYKEY2(
    MEM_NO NUMBER,
    MEM_ID VARCHAR2(20) CONSTRAINT MEM_PK3 PRIMARY KEY, --컬럼 레벨 방식
    MEM_PWD VARCHAR2(20) NOT NULL,
    MEM_NAME VARCHAR2(20) NOT NULL,
    GENDER CHAR(3) CHECK (GENDER IN('남','여')),
    PHONE VARCHAR2(20),
    MEM_DATE DATE DEFAULT SYSDATE NOT NULL
    --CONSTRAINT MEM_PK2 PRIMARY KEY(MEM_NO) --테이블 레벨 방식
);

FOREIGN KEY

해당 컬럼에 다른 테이블에 존재하는 값만 들어와야 하는 컬럼에 부여
다른 테이블을 참조한다 라고 표현

  • 예시 :
CREATE TABLE MEM(
    MEM_NO NUMBER PRIMARY KEY,
    MEM_ID VARCHAR2(20) NOT NULL UNIQUE,
    MEM_NAME VARCHAR2(20) NOT NULL,
    GRADE_ID CHAR(2) REFERENCES MEM_GRADE(GRADE_CODE), --컬럼레벨방식
    GENDER CHAR(3) CHECK(GENDER IN ('남','여')),
    PHONE VARCHAR2(20),
    MEM_DATE DATE DEFAULT SYSDATE NOT NULL
    --FOREIGN KEY(GRADE_ID) REFERENCES MEM_GRADE(GRADE_CODE) --테이블 레벨 방식
);

자식테이블에서 데이터를 참조하고 있다면 부모테이블에서 값 삭제 불가

FOREIGN KEY 삭제 옵션

  • ON DELETE SET NULL : 부모데이터를 삭제할 때 해당 데이터를 사용하는 자식 데이터는 NULL 로 바뀐다
CREATE TABLE MEM(
    MEM_NO NUMBER PRIMARY KEY,
    MEM_ID VARCHAR2(20) NOT NULL UNIQUE,
    MEM_NAME VARCHAR2(20) NOT NULL,
    GRADE_ID CHAR(2),
    GENDER CHAR(3) CHECK(GENDER IN ('남','여')),
    PHONE VARCHAR2(20),
    MEM_DATE DATE DEFAULT SYSDATE NOT NULL,
    FOREIGN KEY(GRADE_ID) REFERENCES MEM_GRADE(GRADE_CODE) ON DELETE SET NULL
);
  • ON DELETE CASCADE : 부모데이터를 삭제할 때 해당 데이터를 사용하는 자식데이터를 같이 삭제
CREATE TABLE MEM(
    MEM_NO NUMBER PRIMARY KEY,
    MEM_ID VARCHAR2(20) NOT NULL UNIQUE,
    MEM_NAME VARCHAR2(20) NOT NULL,
    GRADE_ID CHAR(2),
    GENDER CHAR(3) CHECK(GENDER IN ('남','여')),
    PHONE VARCHAR2(20),
    MEM_DATE DATE DEFAULT SYSDATE NOT NULL
    FOREIGN KEY(GRADE_ID) REFERENCES MEM_GRADE(GRADE_CODE) ON DELETE CASCADE --테이블 레벨 방식
);
  • ON DELETE RESTRICTED : 삭제 제한(기본옵션)

CREATE TABLE (SUBQUERY)

서브쿼리를 사용하여 테이블 생성

CREATE TABLE 테이블명
    AS 서브쿼리;
profile
keep going on~

0개의 댓글