본문 바로가기

sqld

2-19) DDL

DDL (Data Definition Language)
  • 데이터 정의어
  • 데이터 구조 정의 (객체 생성, 삭제, 변경) 언어
  • CREATE(객체 생성), ALTER(객체 변경), DROP(객체 삭제), TRUNCATE(데이터 삭제)
  • AUTO COMMIT (명령어 수행 후 즉시 저장, 원복 불가)

 

CREATE
  • 테이블, 인덱스와 같은 객체를 생성하는 명령어
  • 테이블 생성 시 테이블명, 컬럼명, 컬럼 순서, 컬럼 크기, 컬럼의 데이터 타입 정의 필수
  • 테이블 생성 시 각 컬럼의 제약 조건 및 기본 값은 생략 가능
  • 테이블 생성 시 소유자 명시 가능 (생략 시 명령어 수행 계정 소유)
  • 숫자 컬럼의 경우 컬럼 사이즈 생략 가능 (날짜 컬럼은 사이즈 명시 X)

 

** 문법 1

  • 소유자 명시는 테이블명 앞에 소유자명.테이블명 형태로

 

** 문법 2 (테이블 복제)

 

 

** 특징

  • 복제 테이블의 컬럼명과 컬럼의 데이터 타입이 복제됨
  • SELECT 문에서 컬럼 별칭 사용 시 컬럼 별칭 이름으로 생성
  • CREATE 문에서 컬럼명 변경 가능
  • NULL 속성도 복제됨
  • 테이블에 있는 제약조건, INDEX 등은 복제되지 않음
  • PRIMARY KEY 복제되지 않음

 

데이터 타입

  • CHAR(n) : 고정형, 빈자리수는 공백으로 채워짐
  • VARCHAR2(n) : 가변형, 사이즈보다 작은 수의 입력값 유지 (빈자리수 채우기 X)
  • NUMBER(p, s) : 소수점 자리 제한 시 s, 총 자리수 p
    • 예) NUMBER(5, 2) : 111.23 형태
  • DATE : 사이즈 전달 불가

 

SQL Server)

  • VARCHAR2 → VARCHAR 사용
  • NUMBER → NUMERIC 사용
  • 문자타입도 사이즈 생략 가능 (생략 시 1)

 

예1) NUMBER(7,2)의 경우 총 자리수가 7을 초과할 수 없음

 

예2) MERGE_OLD 테이블 만들기

 

예3) EMP 테이블 복제하여 TEST 테이블 만들기

 

예4) EMP 테이블 데이터 없이 구조만 복제

- WHERE 절에 항상 FALSE인 문장을 전달하여 데이터 SELECT 없이 구조만 복제!

 

예5) 테이블 복제 시 컬럼명 변경 가능

  • 테이블 이름 옆 괄호에 컬럼명 새로 지정

 

ALTER
  • 테이블 구조 변경 (컬럼명, 컬럼 데이터 타입, 컬럼 사이즈, default 값, 컬럼 삭제, 컬럼 추가, 제약 조건)
  • 컬럼 순서 변경 불가 (재생성으로 해결!)

 

1. 컬럼 추가

  • 새로 추가된 컬럼 위치는 맨 마지막
  • 절대 중간 위치에 컬럼 추가 불가 → 순서 변경하고 싶으면 테이블 재생성하기
  • 컬럼 추가 시 데이터 타입 필수, default 값, 제약 조건을 명시할 수 있음
  • 여러 컬럼 동시 추가 가능 (반드시 괄호 사용!)

 

** 문법

 

 

예1) 동시에 여러 컬럼 추가 시 반드시 괄호와 함께 전달

  • 각각 괄호 X, ADD (컬럼1 컬럼1데이터 타입, 컬럼2 컬럼2데이터타입) 형태

 

예2) 컬럼 추가 시 NOT NULL 속성 전달 불가

- 컬럼 추가 시 모두 NULL인 값을 갖고 추가되기 때문

 

** 컬럼 추가 시 DEFAULT를 선언하면 NOT NULL 속성을 갖는 컬럼 추가 가능

  • 순서 주의 ! : DEFAULT 값 선언 이후 NOT NULL 속성 정의

 

2. 컬럼 변경

  • 컬럼 사이즈, 데이터 타입, default 값 변경 가능
  • 여러 컬럼 동시 변경 가능

 

** 문법

  • 하나의 컬럼 변경 시 괄호 생략 가능

 

1) 컬럼 사이즈 변경

  • 컬럼 사이즈 증가는 항상 가능
  • 컬럼 사이즈 축소는 데이터 존재 여부에 따라 제한
    • 데이터가 있는 경우, 데이터의 최대 사이즈만큼 축소 가능
  • 동시 변경 가능 (괄호 필수!)

 

예) 여러 컬럼 사이즈 수정

  • 최대 길이보다 크거나 같은 사이즈로 변경 가능

 

2) 데이터 타입 변경

  • 빈 컬럼일 경우 데이터 타입 변경 가능
  • CHAR, VARCHAR 타입일 경우 데이터가 있어도 서로 변경 가능!

 

예1) 데이터 타입 변경

  • DEPTNO는 데이터가 없어서 변경 가능, SAL은 데이터 존재해서 변경 불가

 

예2) CHAR ↔ VRACHAR 데이터 타입 변경

  • 데이터가 존재하더라도 VARCHAR2과 CHAR 사이 변경은 가능

 

3) DEFAULT 값 변경

  • DEFAULT 값이란 특정 컬럼에 값이 생략될 경우 (입력 시 언급 X) 자동으로 부여되는 값
  • INSERT 시 DEFAULT 값이 선언된 컬럼에 NULL을 직접 입력할 때는 DEFAULT 값이 아닌 NULL이 입력됨
  • 이미 데이터가 존재하는 테이블에 DEFAULT 값 선언 시 기존 데이터 수정 안 됨 (이후 입력된 데이터부터 적용)
  • DEFAULT 값 해제 시 DEFAULT 값을 NULL로 선언

 

예) DEFAULT 값 변경 및 적용

  • NULL로 입력한 PARK는 NULL, SAL값을 입력 시 전달하지 않은 CHOI는 DEFAULT 값으로 설정됨
  • 기존에 존재하던 데이터 (KIM)은 변경 X

 

4) 컬럼 이름 변경

  • 항상 가능
  • 동시 여러 컬럼 이름 변경 불가! (괄호 전달 불가)
  • ALTER ... RENAME 명령어로 처리

 

** 문법

  • RENAME COLUMN 컬럼명 TO NEW컬럼명

 

예) 컬럼 이름 변경

  • RENAME COLUMN ~
  • 괄호 전달 불가
  • 동시 변경 불가

 

5) 컬럼 삭제

  • 데이터 존재 여부와 상관 없이 언제나 가능
  • RECYCLEBIN에 남지 X (FLASHBACK으로 복구 불가)
  • 동시 삭제 불가
  • DROP COLUMN ~ 형태 (COLUMN 붙이기)

 

예1)

 

 

예2) 2개 이상 컬럼 동시 삭제 시도 시 에러 발생

  • 괄호로 묶어서 전달 시에도 불가능

 

DROP
  • 객체 (테이블, 인덱스 등) 삭제
  • DROP 후에는 조회 불가

 

** 문법

  • PURGE로 테이블 삭제 시 RECYCLEBIN에서 조회 불가

 

예)

  • 이후 테이블 조회 시 테이블 존재하지 않아 에러 발생

 

TRUNCATE
  • 구조를 남기고 데이터만 즉시 삭제, 즉시 반영 (AUTO COMMIT)
  • RECYCLEBIN에 남지 않음!

 

** 문법

  • TRUNCATE 이후 바로 테이블명 X
  • TRUNCATE TABLE 테이블명

 

예)

  • 삭제 후 데이터 조회 시 구조는 남아있고 데이터는 삭제됨

 

DELETE / DROP / TRUNCATE 차이
  • DELETE : 데이터 일부 또는 전체 삭제, 롤백 가능
  • TRUNCATE : 데이터 전체 삭제만 가능 (일부 삭제 불가), 즉시 반영 (롤백 불가)
  • DROP : 데이터와 구조를 동시 삭제, 즉시 반영 (롤백 불가)

 

제약 조건
  • 데이터 무결성을 위해 각 컬럼에 생성하는 데이터의 제약 장치
  • 테이블 생성 시 정의 가능, 컬럼 추가 시 정의 가능, 이미 생성된 컬럼에 제약 조건만 추가 가능

 

1. PRIMARY KEY (기본키)

  • 유일한 식별자
  • 중복 허용 X, NULL 허용 X ≫ UNIQUE + NOT NULL
  • 특정 컬럼에 PRIMARY KEY 생성하면 NOT NULL 속성 자동 부여
    • CTAS로 테이블 복사 시 PRIMARY KEY는 복사되지 않음
    • CTAS란 테이블 생성 시 기존 테이블 복제하여 생성하는 것 (CREATE TABLE T AS SELECT * FROM T2)
  • 하나의 테이블에 여러 기본키 생성 불가
  • 하나의 기본키를 여러 컬럼을 결합하여 생성 가능
  • PRIMARY KEY 생성 시 자동으로 UNIQUE INDEX 생성

 

** 문법

1) 테이블 생성 시 제약 조건 생성

  • CONSTRAINT로 제약조건명 정의 가능 (생략 가능 → 자동 생성)
  • 순서는 DEFAULT 값 정의 먼저 → 제약조건 정의

 

2) 컬럼 추가 시 제약 조건 생성

 

 

3) 이미 생성된 컬럼에 제약 조건만 추가

  • ADD로 컬럼명 지정 없이 제약 조건 정의

 

4) 제약 조건 삭제

  • DROP CONSTRAINT 제약조건명 → 제약조건명으로 삭제 가능

 

예1) 테이블 생성 시 제약 조건 설정

 

이름 전달 없이)

 

CREATE 문 밑에)

  • CREATE 문 밑에 제약조건 이름과 함께 전달 가능!
  • PRIMARY KEY를 2개 이상으로 구성할 때에는 각 컬럼에 정의하지 않고 밑에 따로 정의하기

이름과 함께 전달 시)

 

예2) 컬럼 추가 시 제약 조건 생성

 

예3) 이미 있는 컬럼에 제약 조건만 생성

  • 제약 조건 이름 생략도 가능

 

** 제약조건 생성 시에는 어떤 경우에서도 제약조건명 정의하지 않아도 됨

** 제약조건 삭제 시에는 제약조건명으로 삭제!

 

2. UNIQUE

  • 중복을 허용하지 않음
  • NULL은 허용
  • UNIQUE INDEX 자동 생성

 

예) UNIQUE KEY가 생성된 컬러의 값 입력

  • NULL 입력은 자유롭지만 중복 값 입력 시 에러 발생

 

3. NOT NULL

  • 다른 제약 조건과 다르게 컬럼의 특징을 나타냄 ≫ CTAS로 복제 시 따라감!
  • 컬럼 생성 시 NOT NULL을 선언하지 않으면 Nullable 컬럼으로 생성됨 (DEFAULT)
  • 이미 만들어진 컬럼에 NOT NULL 선언 시 제약 조건 생성이 아닌 컬럼 수정 (MODIFY)으로 해결

 

예)

  • ADD NOT NULL(컬럼명) 형태 불가
  • MODIFY 컬럼으로 NOT NULL 속성 추가

 

4. FOREIGN KEY

  • 참조 테이블의 참조 컬럼에 있는 데이터를 확인하면서 본 테이블 데이터를 관리할 목적으로 생성
  • 반드시 참조(부모)테이블의 참조 컬럼이 사전에 PK 혹은 UNIQUE KEY를 가져야 함!

 

** 문법

 

 

예)

 

→ 참조 테이블의 참조대상에 PK 설정, 자식 테이블에 FOREIGN KEY 생성한 상태

 

TEST1) 자식 테이블에서 10번 부서원 삭제 시도

  • 자식 테이블에서의 삭제는 자유로움

 

TEST2) 자식 테이블에서 20번 부서원 50번으로 변경 시도 (불가)

  • 참조 테이블의 참조 컬럼에 존재하지 않는 데이터로 자식 테이블에서 수정 불가

 

TEST3) 자식 테이블에서 50번 부서원 입력 시도 (불가)

  • 참조 테이블의 참조 컬럼에 존재하지 않는 데이터로 자식 테이블에서 입력 불가

 

TEST4) 부모 테이블에 20번 부서원 삭제 시도 (불가)

  • 20번 부서를 참조하는 데이터가 자식 테이블에 존재하므로 삭제 불가

 

TEST5) 부모 테이블에 20번 부서원의 부서번호를 60번으로 변경 시도 (불가)

  • 20번 부서를 참조하는 데이터가 자식 테이블에 존재하므로 수정 불가

 

FOREIGN KEY 옵션
  • ON DELETE CASECADE : 부모 데이터 삭제 시 자식 데이터 함께 삭제
  • ON DELETE SET NULL : 부모 데이터 삭제 시 자식 데이터의 참조 값은 NULL로 수정
  • 생성 시 정의, 변경은 불가 ! → 변경하려면 재생성

 

예) FOREIGN KEY 옵션

  • 부모 데이터 삭제 시 자식 데이터 함께 삭제

 

  • 부모 데이터 삭제 시 자식 데이터 NULL로 설정

 

5. CHECK

  • 직접적으로 데이터의 값 제한 (양수, (1,2,3,4) 중 하나 등)

 

예) 

 

 

기타 오브젝트

 

1. 뷰 (VIEW)

  • 저장 공간을 가지지 않지만 테이블처럼 조회 및 수정할 수 있는 객체

 

** 뷰 (VIEW)의 종류

  • 단순뷰 : 하나의 테이블 조회 뷰
  • 복합뷰 : 둘 이상의 테이블 조인 뷰

 

** 뷰 (VIEW)의 특징

  • 뷰는 기본 테이블로부터 유도된 테이블
  • 기본 테이블과 같은 형태의 구조를 가지고 있으며, 조작도 기본 테이블과 거의 같음
  • 뷰는 가상의 테이블이기에 물리적으로 구현되어 있지않음
    • 저장 공간을 차지하지 않음
  • 데이터를 안전하게 보호 가능
  • 이미 정의되어 있는 뷰는 다른 뷰의 정의에 기초가 될 수 있음
  • 기본 테이블이 삭제되면 그 테이블을 참조하여 만든 뷰 역시 삭제됨

 

** 뷰 (VIEW)의 장점

  • 논리적 독립성을 제공
  • 데이터의 접근을 제어함으로써 보안 유지
  • 사용자의 데이터 관리 단순화
  • 데이터의 다양한 지원 가능

 

** 뷰 (VIEW)의 단점

  • 뷰의 정의 변경 불가
  • 삽입, 삭제, 갱신 연산에 제한
  • 인덱스 구성 불가

 

** 문법

 

 

** 뷰 (VIEW)의 삭제

 

 

예)

  • 복합뷰

 

2. 시퀀스 (SEQUENCE)

  • 자동으로 연속적인 숫자 부여해주는 객체

 

** 문법

  • CYCLE 설정의 경우 재시작 값 정의 → MINVALUE, MAXVALUE
  • CACHE : 메모리에 미리 올려놓는 값 

 

3. 시노님 (SYNONYM)

  • 테이블 별칭 생성
  • 예) HR 계정에서 SCOTT.EMP를 EMP로 조회하는 방법

 

** 문법

  • OR REPLACE : 기존에 같은 이름으로 시노님이 생성되어 있는 경우 대체
  • PUBLIC : 시노님을 생성한 유저만 사용가능하지 않고 모두 사용 가능
    • PRIVATE SYNONYM : 생성한 유저만 사용 가능
    • PUBLIC을 붙이면 PUBLIC SYNONYM이 되는 것, 붙이지 않으면 PRIVATE
  • PUBLIC으로 생성한 시노님은 반드시 PUBLIC으로 삭제

 

예)

 

생성 전 HR 계정에서 조회)

 

생성 후 HR 계정에서 조회)

 

 

 

 

'sqld' 카테고리의 다른 글

2-20) DCL  (0) 2024.08.23
2-18) TCL  (0) 2024.08.23
2-17) DML  (0) 2024.08.23
2-16) 정규 표현식  (0) 2024.08.22
2-15) PIVOT과 UNPIVOT  (0) 2024.08.22