SQLSQL 문법

검색

검색어를 입력해 개념, 문제, 필기를 찾습니다.

SQL DDL과 DCL - 테이블 정의와 권한 관리

DBSQLDDLDCL
읽는데 14분 소요
처음 쓰여진 날: 2026-03-30
마지막 수정일: 2026-06-26
조회수:

요약

SQL의 3대 분류(DDL, DML, DCL)를 알아보고, 테이블을 생성/수정/삭제하는 DDL과 권한을 부여/회수하는 DCL을 정보처리기사 실기 기출문제와 함께 학습합니다.

DDL / DCL 학습 흐름 쌩기초

이 페이지는 SQL의 구조 관리 명령과 권한 관리 명령을 두 영역으로 나누어 봅니다.

영역먼저 볼 내용대표 문제
DDL - 데이터 정의어CREATE TABLE, ALTER TABLE, DROP, TRUNCATE, CREATE INDEX, DROP INDEX테이블 생성·수정·삭제, 제약조건 작성, 인덱스 생성·삭제
DCL - 데이터 제어어GRANT, WITH GRANT OPTION, REVOKE권한 부여·회수 SQL 작성

DDL은 테이블 구조를 만드는 쪽, DCL은 사용자 권한을 다루는 쪽입니다. 시험에서는 두 영역이 같은 SQL 분류 문제로 묶여 나오지만, 실제 풀이에서는 "구조를 바꾸는가, 권한을 바꾸는가"를 먼저 나누면 문법을 훨씬 빠르게 고를 수 있습니다.

SQL 분류 핵심 정리

SQL(Structured Query Language)은 데이터베이스1를 다루기 위한 언어입니다. 크게 3가지로 분류됩니다.

분류이름주요 명령어설명
DDL데이터 정의어CREATE, ALTER, DROP, TRUNCATE테이블 구조를 정의/수정/삭제하거나 데이터를 전체 비움
DML데이터 조작어SELECT, INSERT, UPDATE, DELETE데이터를 조회/추가/수정/삭제
DCL데이터 제어어GRANT, REVOKE사용자 권한2을 부여/회수

DDL - 데이터 정의어 쌩기초

DDL(Data Definition Language)은 테이블, 뷰3 등 데이터베이스 구조(스키마)를 만들고, 바꾸고, 없애는 명령어입니다.

아래는 DDL에서 사용 가능한 명령어입니다. 테이블을 다루는 CREATE TABLE·ALTER TABLE·DROP·TRUNCATE를 먼저 보고, 마지막으로 조회 성능을 위한 CREATE INDEX·DROP INDEX를 살펴봅니다. 각 명령어의 역할과 문법을 순서대로 다룹니다.

CREATE TABLE - 테이블 생성 기초

sql
코드 하이라이팅 중…

여기서 컬럼명4은 테이블의 각 열 이름, 데이터타입5은 그 열에 저장할 값의 형식, [제약조건]6은 입력 값에 적용할 규칙입니다. [ ]로 감싸진 항목은 생략 가능한 선택 요소입니다.

자주 사용되는 제약조건:

제약조건설명
PRIMARY KEY기본키 (NULL 불가, 중복 불가, 테이블당 1개)
FOREIGN KEY외래키 (다른 테이블의 기본키를 참조)
NOT NULLNULL7 값 입력 불가
UNIQUE중복 값 입력 불가 (NULL은 허용, 테이블에 여러 개 가능)
CHECK입력 값의 조건 제한
DEFAULT값 미입력 시 자동으로 채울 기본값 설정

예시:

sql
코드 하이라이팅 중…

제약조건에 이름 붙이기:

위 예시처럼 컬럼 옆에 바로 적는 대신, 컬럼을 모두 정의한 뒤 줄을 따로 만들어 제약조건을 선언할 수도 있습니다. 이때 맨 앞에 CONSTRAINT 제약조건명을 붙이면 그 제약조건에 이름을 줄 수 있는데, 이렇게 이름을 가진 제약조건을 named constraint라고 합니다.

sql
코드 하이라이팅 중…
  • CONSTRAINT PK_회원 PRIMARY KEY (회원ID) : 회원ID를 기본키로 지정하고, 그 제약조건에 PK_회원이라는 이름을 붙입니다.
  • CONSTRAINT UQ_이메일 UNIQUE (이메일) : 이메일이 중복되지 않도록 하는 UNIQUE 제약조건에 UQ_이메일이라는 이름을 붙입니다.
  • CONSTRAINT CHK_등급 CHECK (등급 IN ('일반', 'VIP', 'VVIP')) : 등급이 세 값 중 하나여야 한다는 CHECK 제약조건에 CHK_등급이라는 이름을 붙입니다.

CONSTRAINT 이름을 적는 위치만 다를 뿐, 제약조건의 의미는 컬럼 옆에 적는 것과 같습니다. 이름을 붙여두면 나중에 ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건명으로 특정 제약조건만 골라 삭제·관리하기 좋습니다. 외래키도 같은 방식으로 CONSTRAINT 이름 FOREIGN KEY (컬럼) REFERENCES 부모테이블 (컬럼)처럼 이름을 붙입니다.

ALTER TABLE - 테이블 수정 기초

테이블의 구조(컬럼)를 변경할 때 사용합니다. ADD는 새 컬럼을 추가, MODIFY는 기존 컬럼의 데이터타입이나 제약조건을 변경, DROP COLUMN은 컬럼을 삭제합니다.

컬럼을 삭제할 때는 DROP COLUMN을 사용합니다. 여기서 COLUMN은 SQL 표준(ISO/IEC 9075)과 PostgreSQL·MySQL에서는 생략 가능한 선택 키워드라, ALTER TABLE 학생 DROP 과목;처럼 COLUMN을 빼도 동작합니다. 다만 SQL Server 등 일부 DBMS8에서는 COLUMN필수입니다. 표준에서는 둘 다 허용하므로 기호에 맞게 쓰면 됩니다.

sql
코드 하이라이팅 중…

DROP - 테이블/뷰 삭제 기초

테이블이나 뷰를 구조째로 삭제합니다. 테이블에 저장된 데이터도 모두 함께 사라집니다.

sql
코드 하이라이팅 중…

CASCADE vs RESTRICT:

CASCADERESTRICT는 삭제 대상 테이블이나 뷰를 다른 테이블(또는 뷰)이 참조하고 있을 때 어떻게 처리할지를 지정합니다. 옵션을 생략하면 RESTRICT가 적용됩니다.

옵션설명
CASCADE해당 테이블이나 뷰를 참조하는 다른 테이블·뷰도 함께 삭제
RESTRICT다른 테이블·뷰가 참조하고 있으면 삭제 거부 (옵션 생략 시 기본 적용)

시나리오 예시:

직원 테이블의 회사코드 컬럼이 회사 테이블의 기본키를 외래키로 참조하고 있는 상황을 가정합니다.

sql
코드 하이라이팅 중…

TRUNCATE - 테이블 데이터 전체 삭제 기초

테이블 구조는 유지하면서 모든 데이터(행)만 삭제합니다.

sql
코드 하이라이팅 중…

TRUNCATE 전/후 비교:

TRUNCATE 전 학생 테이블:

학번이름학년
20241001김철수1
20241002이영희2

TRUNCATE 후 학생 테이블:

학번이름학년
(행 없음)

컬럼 구조(학번, 이름, 학년)는 그대로 남아 있고, 저장된 데이터만 모두 사라집니다.

CREATE INDEX - 인덱스 생성 기초

인덱스(index, 색인)는 책 뒤의 '찾아보기'와 같습니다. 찾아보기가 본문과 따로 붙어 있듯, 인덱스도 테이블과는 별도로 저장되어 특정 컬럼 값이 어느 행에 있는지를 빠르게 알려줍니다.

인덱스가 컬럼 값으로 테이블의 행 위치를 찾는 구조
부서인덱스는 부서명을 정렬해 두고 각 값이 회사 테이블의 몇 번 행에 있는지를 가리킵니다. 인덱스에서 부서명을 빠르게 찾아 행 위치를 얻은 뒤, 실제 행으로 바로 이동합니다.

데이터를 찾아 읽는 조회(SELECT) 속도를 높이려고 만들며, 인덱스를 추가하거나 지워도 테이블의 실제 데이터는 바뀌지 않습니다. 인덱스가 내부적으로 어떤 자료구조(B-트리·해싱 등)로 동작하는지는 인덱스 접근 구조에서 다룹니다. 여기서는 인덱스를 만들고 없애는 DDL 문법만 봅니다.

sql
코드 하이라이팅 중…

[UNIQUE]는 생략 가능한 선택 요소입니다. 붙이면 해당 컬럼에 같은 값을 두 번 넣을 수 없게 막는데(이미 있는 값을 또 넣으면 오류로 거부됩니다), 앞서 본 UNIQUE 제약조건과 효과가 비슷하면서 검색 속도까지 빨라집니다. 컬럼을 하나만 적으면 그 컬럼에 대한 인덱스가, 여러 개 적으면 그 컬럼들을 한 묶음으로 본 복합 인덱스가 만들어집니다. 복합 인덱스는 여러 컬럼을 함께 조건으로 자주 검색할 때 유용합니다.

예시:

sql
코드 하이라이팅 중…

DROP INDEX - 인덱스 삭제 기초

만들어 둔 인덱스를 삭제할 때는 DROP INDEX를 사용합니다. 인덱스 이름만 적으면 되고(테이블명은 쓰지 않습니다), 인덱스만 사라질 뿐 테이블과 그 안의 데이터는 그대로 유지됩니다.

sql
코드 하이라이팅 중…
sql
코드 하이라이팅 중…

DCL - 데이터 제어어 쌩기초

데이터베이스에는 여러 사용자(DBA9, 일반 사용자, 애플리케이션 계정 등)가 접근합니다. 사용자마다 허용할 작업 범위가 다르므로, 권한을 세밀하게 제어할 필요가 있습니다. DCL(Data Control Language)은 이러한 사용자 권한을 부여하거나 회수하는 명령어입니다.

GRANT - 권한 부여 기초

sql
코드 하이라이팅 중…

권한 종류:

권한설명
SELECT조회 권한
INSERT삽입 권한
UPDATE수정 권한
DELETE삭제 권한
ALL모든 권한

예시:

sql
코드 하이라이팅 중…

WITH GRANT OPTION - 권한 재부여 허용 심화

GRANT 구문 끝에 WITH GRANT OPTION을 붙이면, 권한을 받은 사용자가 다른 사용자에게도 같은 권한을 부여할 수 있게 됩니다.

sql
코드 하이라이팅 중…

예시:

sql
코드 하이라이팅 중…

WITH GRANT OPTION 없이 부여한 경우, USER1은 자신만 SELECT를 수행할 수 있고 다른 사용자에게 권한을 넘길 수 없습니다.

REVOKE - 권한 회수 기초

sql
코드 하이라이팅 중…

예시:

sql
코드 하이라이팅 중…

REVOKE ... CASCADE - 권한 연쇄 회수 심화

WITH GRANT OPTION으로 권한이 여러 사용자에게 퍼진 상황에서, 중간 사용자의 권한을 회수할 때 사용하는 옵션입니다. DROP의 CASCADE와 의미가 비슷합니다 — 이 사용자가 재부여한 권한도 모두 함께 회수됩니다.

옵션설명
CASCADE해당 사용자가 재부여한 다른 사용자의 권한도 함께 연쇄 회수
RESTRICT재부여한 사용자가 있으면 회수 거부 (옵션 생략 시 기본)

시나리오 예시:

DBA가 USER1에게 WITH GRANT OPTION으로 SELECT 권한을 주고, USER1이 USER2에게 SELECT 권한을 재부여한 상태입니다.

sql
코드 하이라이팅 중…

REVOKE GRANT OPTION FOR - 재부여 권한만 회수 심화

사용자 본인의 권한은 유지하고, 다른 사용자에게 재부여할 수 있는 권한만 회수하려면 GRANT OPTION FOR를 사용합니다.

sql
코드 하이라이팅 중…

이 구문 실행 후 USER1은 여전히 학생 테이블을 SELECT할 수 있지만, 다른 사용자에게 SELECT 권한을 넘길 수는 없게 됩니다.


정보처리기사 실기 대비 문제


Footnotes

  1. 데이터를 체계적으로 저장하고 관리하는 저장소. 여러 사람이 동시에 접근할 수 있으며, 데이터 중복과 불일치를 줄이는 것을 목표로 합니다.

  2. 어떤 사용자가 어떤 테이블에 대해 SELECT(조회), INSERT(삽입), UPDATE(수정), DELETE(삭제) 등을 수행할 수 있는지를 결정하는 접근 허가 단위입니다.

  3. 하나 이상의 테이블을 기반으로 만든 가상 테이블입니다. 실제 데이터를 저장하지 않고, 조회 쿼리를 저장해 두었다가 필요할 때 테이블처럼 사용합니다.

  4. 테이블의 각 열(세로 방향)을 나타내는 이름입니다. 예: 학번, 이름, 학년.

  5. 컬럼에 저장할 값의 종류와 형식을 지정합니다. INT는 정수, VARCHAR(n)은 최대 n자의 가변 문자열입니다.

  6. 컬럼에 입력 가능한 값을 제한하는 규칙입니다. PRIMARY KEY, NOT NULL, UNIQUE, CHECK, DEFAULT 등이 있습니다.

  7. 아직 값이 입력되지 않았음을 나타내는 특수한 상태입니다. 0이나 빈 문자열("")과 다르며, "모른다" 또는 "해당 없음"을 의미합니다.

  8. DBMS(Database Management System): 데이터베이스를 저장·조회·관리하는 소프트웨어입니다. Oracle, MySQL, PostgreSQL, SQL Server 등이 대표적입니다.

  9. DBA(Database Administrator): 데이터베이스를 운영·관리하는 담당자입니다. 사용자 권한 부여, 백업, 성능 관리 등을 책임집니다.