현재 선택한 SQL 과정

SQLD 이론 학습

이론 목록으로 돌아가기

DDL과 제약조건

CREATE·ALTER·DROP·TRUNCATE와 PK·FK·UNIQUE·NOT NULL·CHECK의 올바른 선언을 익힌다.

예상 읽기 6

핵심 요약

CREATE·ALTER·DROP·TRUNCATE와 PK·FK·UNIQUE·NOT NULL·CHECK의 올바른 선언을 익힌다.

핵심 질문

  1. DDL과 제약조건에서 반드시 구분해야 할 개념과 결과 규칙은 무엇인가?
  2. 0건·1건·여러 건과 NULL·동점·중복 데이터에서 결과가 어떻게 달라지는가?
  3. 비슷해 보이는 문법과 결과가 같아지는 조건, 달라지는 조건은 무엇인가?
  4. 작은 샘플 데이터를 이용해 결과를 실수 없이 예측하는 순서는 무엇인가?

학습 목표

  • 주요 DDL의 목적과 데이터·구조에 미치는 영향을 구분한다.
  • 컬럼·테이블 수준 제약조건 문법을 올바르게 작성한다.

개념 지도

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
객체 정의 → 데이터 타입·제약조건 → DDL 실행 → 암시적 Commit·의존성 확인

핵심 내용

DDL은 데이터 구조를 정의한다. CREATE는 객체 생성, ALTER는 구조 변경, DROP은 객체 제거, TRUNCATE는 테이블 구조를 남기고 전체 행을 빠르게 제거한다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
CREATE TABLE product (
  prod_id  VARCHAR2(10)  NOT NULL,
  prod_nm  VARCHAR2(100) NOT NULL,
  reg_dt   DATE          NOT NULL,
  regr_no  NUMBER(10),
  CONSTRAINT product_pk PRIMARY KEY (prod_id)
);

PRIMARY KEY는 유일성과 NOT NULL을 함께 보장한다. UNIQUE는 후보키의 유일성, FOREIGN KEY는 참조 무결성, CHECK는 행 값의 조건을 검증한다. NOT NULL은 Oracle에서 컬럼 정의에 선언하는 방식이 일반적이다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
ALTER TABLE product ADD CONSTRAINT product_pk
PRIMARY KEY (prod_id);

흔한 오해와 주의점

  • PRIMARY KEY product_pk ON (prod_id)는 올바른 제약조건 문법이 아니다.
  • DROPTRUNCATE는 구조 보존 여부가 다르다.
  • Oracle DDL은 트랜잭션 경계에 영향을 주며 일반 DML처럼 단순 ROLLBACK되는 것으로 생각하면 안 된다.

문항 풀이 보강: DDL·제약조건을 실제 문법으로 판정하기

컬럼과 테이블 제약

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
CREATE TABLE orders (
  order_id   NUMBER,
  customer_id NUMBER,
  status     VARCHAR2(10) DEFAULT 'READY' NOT NULL,
  amount     NUMBER CHECK (amount >= 0),
  CONSTRAINT orders_pk PRIMARY KEY (order_id),
  CONSTRAINT orders_fk FOREIGN KEY (customer_id)
    REFERENCES customer(customer_id)
);

PRIMARY KEY는 UNIQUE와 NOT NULL을 함께 보장한다. UNIQUE는 DBMS에 따라 NULL 허용과 중복 NULL 처리 세부가 다를 수 있다. CHECK는 행 값의 조건을, DEFAULT는 값을 생략했을 때의 기본값을 정의한다.

참조 동작

동작부모 삭제·변경 시 자식 처리
RESTRICT / NO ACTION참조 자식이 있으면 거부
CASCADE자식 행도 삭제하거나 FK 값을 함께 변경
SET NULL자식 FK를 NULL로 변경
SET DEFAULT자식 FK를 기본값으로 변경

연쇄 참조 T ← S ← R에서 ON DELETE CASCADE가 각 관계에 정의되면 T의 부모 행 삭제가 S와 R까지 전파될 수 있다.

CREATE와 ALTER

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
ALTER TABLE product
  ADD CONSTRAINT product_pk PRIMARY KEY (prod_id);

SQL Server에서 컬럼 타입 변경은 ALTER TABLE employee ALTER COLUMN salary DECIMAL(12,2), Oracle에서는 ALTER TABLE employee MODIFY salary NUMBER(12,2)를 사용한다. 문제에 DBMS가 명시되면 문법을 섞지 않는다.

DELETE·TRUNCATE·DROP

명령분류행 로그·조건구조일반적 롤백
DELETEDMLWHERE 가능, 행 단위 처리유지가능
TRUNCATEDDL전체 행, 공간 초기화에 유리유지Oracle에서 불가
DROPDDL객체 전체 제거제거Oracle에서 불가

삭제 이력을 남겨야 하고 조건별 로그가 필요하면 DELETE가 적합하다. 구조를 남기고 전체 데이터를 빠르게 제거하며 사용 공간을 초기화하려면 TRUNCATE를 검토한다.

문제에 적용하는 순서

  1. 필수·유일·참조·범위 중 어떤 규칙인지 찾는다.
  2. 컬럼 정의 내부인지 ALTER 문인지에 맞는 문법을 고른다.
  3. 부모 삭제 시 원하는 자식 동작을 확인한다.
  4. 데이터만 제거하는지, 구조도 제거하는지, 롤백·로그가 필요한지 구분한다.

결과를 검증하는 순서

  1. 각 Query Block이 만드는 한 행의 의미를 먼저 적습니다.
  2. 조건을 적용하기 전 원본 행과 적용 후 남는 행을 작은 표로 그립니다.
  3. NULL 비교가 TRUE, FALSE, UNKNOWN 중 무엇인지 구분합니다.
  4. 중복 제거, 그룹화, 정렬과 행 제한이 적용되는 순서를 확인합니다.
  5. 데이터가 0건·1건·여러 건일 때도 같은 규칙이 성립하는지 검증합니다.

실무와 시험에서 함께 확인할 항목

  • ORDER BY가 없다면 결과 순서를 가정하지 않습니다.
  • 문자열·숫자·날짜 비교에서는 데이터 타입과 명시적 형변환을 확인합니다.
  • 같은 결과처럼 보이는 SQL도 NULL과 중복이 있을 때 달라질 수 있습니다.
  • 문법을 외우기 전에 샘플 데이터 3~5행으로 결과를 직접 계산합니다.

마지막 점검

  • 작성 순서가 아니라 SQL의 논리적 처리 순서로 결과를 계산합니다.
  • NULL을 0이나 빈 값과 같은 것으로 취급하지 않습니다.
  • ORDER BY가 없는 결과 순서와 DISTINCT 없는 중복 제거를 가정하지 않습니다.
  • 비슷한 문법은 0건·다건·NULL 데이터를 넣어 결과가 정말 같은지 확인합니다.

복습 문제

  1. 필수 속성과 PK 속성은 각각 어떤 제약으로 구현하는가?
  2. 전체 행을 제거하되 테이블 구조를 남기는 명령은?
  3. 샘플 데이터 3행으로 결과를 직접 계산할 수 있는가?
  4. NULL이 포함될 때 결과가 달라지는 지점은 어디인가?