
📋 이 글의 핵심 요약 (TL;DR)
- SQL = 관계 데이터베이스를 위한 표준 질의어 / 비절차 언어 / SEQUEL에서 유래
- SQL 3대 분류 : DDL(테이블 정의) · DML(데이터 조작) · DCL(권한 제어)
- CREATE TABLE : 속성 이름+타입, NOT NULL, DEFAULT, PRIMARY KEY, UNIQUE, FOREIGN KEY, CHECK 지정
- ALTER TABLE : ADD(속성 추가) · DROP COLUMN(속성 삭제) · ADD/DROP CONSTRAINT(제약조건)
- DROP TABLE : 참조하는 외래키 제약조건을 먼저 삭제해야 함
- SELECT : ALL(중복 허용, 기본값) / DISTINCT(중복 제거) / *(전체 속성) / AS(별칭) / 산술식 사용 가능
- WHERE : 비교·논리 연산자로 조건 필터링 / LIKE : %(0개 이상 문자) · _(1개 문자) 와일드카드
01 SQL이란? — 개요와 역사
SQL(Structured Query Language)은 관계 데이터베이스를 다루기 위한 표준 질의어입니다. 앞서 배운 관계 해석처럼 비절차 언어(Non-Procedural)로, "어떻게(How)"가 아닌 "무엇을(What) 가져올지"만 기술하면 됩니다.
| 항목 | 내용 |
| 유래 | SEQUEL(Structured English QUEry Language)에서 발전 — IBM의 연구용 RDBMS인 SYSTEM R을 위해 개발 |
| 표준화 | 미국 표준 연구소 ANSI + 국제 표준화 기구 ISO에서 표준화 진행 |
| 대화식 SQL | DBMS에 직접 접근해 질의를 작성하고 즉시 실행 |
| 삽입 SQL | Java, Python 등 프로그래밍 언어로 작성한 응용 프로그램에 삽입하여 사용 |
02 SQL 3대 분류 — DDL · DML · DCL
| 분류 | Full Name | 대표 명령어 | 역할 |
| DDL | Data Definition Language | CREATE / ALTER / DROP | 테이블 생성·변경·삭제 등 구조 정의 |
| DML | Data Manipulation Language | SELECT / INSERT / UPDATE / DELETE | 데이터 검색·삽입·수정·삭제 |
| DCL | Data Control Language | GRANT / REVOKE | 사용자별 데이터 접근·사용 권한 부여·취소 |
⚠️ 시험 단골 함정 — DDL vs DML 구분
CREATE · ALTER · DROP → DDL (데이터 정의어)
SELECT · INSERT · UPDATE · DELETE → DML (데이터 조작어)
→ "다음 중 성격이 다른 명령어는?" 유형에서 INSERT를 DDL로 착각하기 쉬우니 주의!
03 DDL ① — CREATE TABLE (테이블 생성)
CREATE TABLE의 기본 구조는 아래와 같습니다. [ ]로 표시된 항목은 생략 가능하며, SQL 문은 세미콜론(;)으로 끝내고 대소문자를 구분하지 않습니다.
CREATE TABLE 테이블_이름 (
❶ 속성_이름 데이터_타입 [NOT NULL] [DEFAULT 기본_값]
❷ [PRIMARY KEY (속성_리스트)]
❸ [UNIQUE (속성_리스트)]
❹ [FOREIGN KEY (속성_리스트) REFERENCES 테이블_이름(속성_리스트)]
[ON DELETE 옵션] [ON UPDATE 옵션]
❺ [CONSTRAINT 이름] [CHECK(조건)]
);

▶ SQL 주요 데이터 타입
| 데이터 타입 | 의미 |
| INT 또는 INTEGER | 정수 |
| SMALLINT | INT보다 작은 정수 |
| CHAR(n) 또는 CHARACTER(n) | 길이가 n인 고정 길이 문자열 |
| VARCHAR(n) 또는 CHARACTER VARYING(n) | 최대 길이가 n인 가변 길이 문자열 |
| NUMERIC(p,s) 또는 DECIMAL(p,s) | 고정 소수점 실수 (p: 전체 자릿수, s: 소수점 이하 자릿수) |
| FLOAT(n) | 길이가 n인 부동 소수점 실수 |
| DATE / TIME / DATETIME | 날짜(연·월·일) / 시간(시·분·초) / 날짜와 시간 |
💡 실무 팁 — CHAR vs VARCHAR 선택 기준
CHAR(n) : 입력값이 n보다 짧아도 남은 자리를 공백으로 채워 항상 n바이트를 사용합니다. 저장 길이가 고정되어 있어 검색·비교 속도가 빠릅니다.
→ 주민등록번호(13자리), 사번, 제품번호처럼 길이가 항상 일정한 데이터에 적합
VARCHAR(n) : 입력값 길이만큼만 저장하므로 저장 공간을 낭비하지 않습니다. 대신 길이 정보를 별도로 관리해 CHAR보다 약간 느릴 수 있습니다.
→ 주소, 이메일, 자기소개처럼 길이가 불규칙한 데이터에 적합
→ 면접 단골 질문 : "주민번호와 이름 중 어떤 타입을 써야 할까?" — 주민번호는 CHAR(13), 이름은 VARCHAR(n)이 정답입니다.
▶ 속성 제약 키워드
| 키워드 | 의미 및 예시 |
| NOT NULL | 널 값 비허용 고객아이디 VARCHAR(20) NOT NULL |
| DEFAULT | 속성의 기본값 지정 (값 미입력 시 자동 삽입) 적립금 INT DEFAULT 0 |
| PRIMARY KEY | 기본키 지정 (유일 + NOT NULL 자동 적용) PRIMARY KEY(고객아이디) |
| UNIQUE | 대체키 지정 (유일성 보장 + NULL 허용, 기본키와 다름) UNIQUE(고객이름) |
| FOREIGN KEY | 외래키 지정 + REFERENCES로 참조 테이블·속성 명시 FOREIGN KEY(주문고객) REFERENCES 고객(고객아이디) |
| CHECK | 데이터 무결성을 위한 값 범위 제약 CHECK(재고량 >= 0 AND 재고량 <= 10000) |
▶ ON DELETE 옵션 (참조 무결성 유지)
| 옵션 | 동작 (부서 테이블의 홍보부 튜플 삭제 시) |
| ON DELETE NO ACTION | 부서 테이블의 튜플을 삭제하지 못하게 막음 |
| ON DELETE CASCADE | 사원 테이블의 관련 튜플(정소화)도 함께 삭제 |
| ON DELETE SET NULL | 관련 튜플의 외래키 값을 NULL로 변경 |
| ON DELETE SET DEFAULT | 관련 튜플의 외래키 값을 미리 지정한 기본값으로 변경 |

※ ON UPDATE 옵션 : 부모 테이블의 기본키 값이 수정될 때 외래키를 가진 자식 테이블의 처리 방식을 정의합니다. ON DELETE와 동일한 4가지 옵션(NO ACTION · CASCADE · SET NULL · SET DEFAULT)을 사용하며, 같은 FOREIGN KEY 절 안에 함께 명시할 수 있습니다.
FOREIGN KEY(주문고객) REFERENCES 고객(고객아이디)
ON DELETE CASCADE ON UPDATE SET NULL
04 CREATE TABLE 실전 예제
▶ 예제 1 — 고객 테이블
고객아이디·고객이름·나이·등급·직업·적립금 속성 / 고객이름·등급 NOT NULL / 적립금 기본값 0 / 고객아이디 기본키
CREATE TABLE 고객 (
고객아이디 VARCHAR(20) NOT NULL,
고객이름 VARCHAR(10) NOT NULL,
나이 INT,
등급 VARCHAR(10) NOT NULL,
직업 VARCHAR(20),
적립금 INT DEFAULT 0,
PRIMARY KEY(고객아이디)
);
▶ 예제 2 — 제품 테이블 (CHECK 제약조건 포함)
재고량 0 이상 10,000 이하 유지 조건
CREATE TABLE 제품 (
제품번호 CHAR(3) NOT NULL,
제품명 VARCHAR(20),
재고량 INT,
단가 INT,
제조업체 VARCHAR(20),
PRIMARY KEY(제품번호),
CHECK (재고량 >= 0 AND 재고량 <= 10000)
);
▶ 예제 3 — 주문 테이블 (외래키 2개)
주문고객 → 고객(고객아이디) 참조 / 주문제품 → 제품(제품번호) 참조
CREATE TABLE 주문 (
주문번호 CHAR(3) NOT NULL,
주문고객 VARCHAR(20),
주문제품 CHAR(3),
수량 INT,
배송지 VARCHAR(30),
주문일자 DATE,
PRIMARY KEY(주문번호),
FOREIGN KEY(주문고객) REFERENCES 고객(고객아이디),
FOREIGN KEY(주문제품) REFERENCES 제품(제품번호)
);
-- MS SQL에서는 주문일자 데이터 타입을 DATETIME으로 지정
05 DDL ② — ALTER TABLE (테이블 변경)
▶ 속성 추가 — ADD
ALTER TABLE 테이블_이름
ADD 속성_이름 데이터_타입 [NOT NULL] [DEFAULT 기본_값];
-- 예제 7-5: 고객 테이블에 가입날짜 속성 추가
ALTER TABLE 고객 ADD 가입날짜 DATE;
▶ 속성 삭제 — DROP COLUMN
ALTER TABLE 테이블_이름 DROP COLUMN 속성_이름;
-- 예제 7-6: 고객 테이블에서 가입날짜 속성 삭제
ALTER TABLE 고객 DROP COLUMN 가입날짜;
⚠️ 속성 삭제 주의사항
삭제할 속성과 관련된 제약조건이나 다른 속성이 참조하고 있다면 삭제 불가합니다.
먼저 관련 제약조건 또는 참조하는 속성을 삭제한 후에 해당 속성을 삭제해야 합니다.
▶ 제약조건 추가 / 삭제 — ADD CONSTRAINT · DROP CONSTRAINT
-- 제약조건 추가
ALTER TABLE 테이블_이름 ADD CONSTRAINT 제약조건_이름 제약조건_내용;
-- 예제 7-7: 고객 나이 20세 이상 제약조건 추가
ALTER TABLE 고객 ADD CONSTRAINT CHK_AGE CHECK(나이 >= 20);
-- 제약조건 삭제
ALTER TABLE 테이블_이름 DROP CONSTRAINT 제약조건_이름;
-- 예제 7-8: CHK_AGE 제약조건 삭제
ALTER TABLE 고객 DROP CONSTRAINT CHK_AGE;
06 DDL ③ — DROP TABLE (테이블 삭제)
-- 기본 문법
DROP TABLE 테이블_이름 [CASCADE | RESTRICT];
-- 예제 7-9: 배송업체 테이블 삭제
DROP TABLE 배송업체;
| 옵션 | 동작 |
| RESTRICT (기본값, 생략 시 적용) |
삭제할 테이블을 다른 테이블이 참조하고 있으면 삭제를 취소 → 먼저 참조하는 외래키 제약조건을 직접 삭제한 후 DROP 수행 |
| CASCADE | 해당 테이블을 참조하는 다른 테이블의 외래키 제약조건까지 연쇄적으로 함께 삭제 → 연관된 테이블 구조가 의도치 않게 변경될 수 있으므로 주의 필요 |
⚠️ DROP TABLE 실전 주의사항
옵션 미지정 시 RESTRICT가 기본 적용됩니다. 예를 들어 주문 테이블이 고객 테이블의 고객아이디를 외래키로 참조 중이라면, 고객 테이블을 바로 DROP할 수 없습니다.
· RESTRICT 방식 : 주문 테이블의 외래키 제약조건을 ALTER TABLE로 먼저 삭제 → 고객 테이블 DROP
· CASCADE 방식 : DROP TABLE 고객 CASCADE; 한 줄로 고객 테이블 + 주문 테이블의 외래키 제약조건이 연쇄 삭제
→ 시험 포인트 : "DROP TABLE 시 참조 무결성 처리 옵션 2가지는?" → RESTRICT(기본), CASCADE
07 DML — SELECT 기본 검색
SELECT 기본 구조
SELECT [ALL | DISTINCT] 속성_리스트
FROM 테이블_리스트
[WHERE 조건];
· ALL : 중복 튜플 허용 (기본값, 생략 가능)
· DISTINCT : 중복 튜플 제거
· * : 모든 속성 선택 (속성 이름 전부 나열 대신 사용)
· AS : 결과 테이블에서 속성 이름을 별칭으로 출력

▶ 기본 검색 예제
-- 예제 7-10: 고객 테이블에서 고객아이디, 고객이름, 등급 검색
SELECT 고객아이디, 고객이름, 등급
FROM 고객;
-- 예제 7-11 / 7-12: 모든 속성 검색 (두 가지 방법)
SELECT 고객아이디, 고객이름, 나이, 등급, 직업, 적립금
FROM 고객;
SELECT *
FROM 고객;
-- 예제 7-15: 제조업체 중복 없이 검색
SELECT DISTINCT 제조업체
FROM 제품;
▶ AS 별칭 + 산술식 예제
-- 예제 7-16: 단가를 '가격'이라는 별칭으로 출력
SELECT 제품명, 단가 AS 가격
FROM 제품;
-- 예제 7-17: 단가에 500 더한 값을 '조정 단가'로 출력
SELECT 제품명, 단가 + 500 AS "조정 단가"
FROM 제품;
08 WHERE 조건 검색 + LIKE 패턴 검색
▶ WHERE 비교·논리 연산자
| 연산자 | 의미 | 연산자 | 의미 |
| = | 같다 | AND | 모든 조건 만족 |
| <> | 다르다 | OR | 하나 이상 만족 |
| < / > / <= / >= | 작다/크다/작거나같다/크거나같다 | NOT | 조건 불만족인 것만 |
-- 예제 7-18: 한빛제과가 제조한 제품의 제품명, 재고량, 단가 검색
SELECT 제품명, 재고량, 단가
FROM 제품
WHERE 제조업체 = '한빛제과';
-- 예제 7-21: 단가 2,000원 이상 3,000원 이하인 제품 검색
SELECT 제품명, 단가, 제조업체
FROM 제품
WHERE 단가 >= 2000 AND 단가 <= 3000;
▶ LIKE 패턴 검색
| 기호 | 의미 | 사용 예 | 매칭되는 문자열 예 |
| % | 0개 이상의 문자 (내용·개수 상관없음) |
LIKE '데이터%' LIKE '%데이터' LIKE '%데이터%' |
데이터로 시작하는 문자열 데이터로 끝나는 문자열 데이터가 포함된 문자열 |
| _ | 1개의 문자 (내용 상관없음) |
LIKE '데이터___' LIKE '__한%' |
데이터로 시작하는 6자 문자열 세 번째 글자가 '한'인 문자열 |

💡 LIKE 사용 시 주의사항
LIKE는 문자열(텍스트) 조건에만 사용 가능합니다. 숫자형 속성에는 사용할 수 없습니다.
또한 조건에서 문자나 날짜 값은 반드시 작은따옴표(' ')로 묶어야 합니다.
📌 핵심 정리
· SQL 분류 : DDL(CREATE·ALTER·DROP) / DML(SELECT·INSERT·UPDATE·DELETE) / DCL(GRANT·REVOKE)
· CREATE TABLE : 속성·타입·NOT NULL·DEFAULT·PRIMARY KEY·UNIQUE·FOREIGN KEY·CHECK 지정
· ON DELETE 옵션 : NO ACTION / CASCADE / SET NULL / SET DEFAULT
· ALTER TABLE : ADD(속성 추가) · DROP COLUMN(속성 삭제) · ADD/DROP CONSTRAINT(제약조건)
· DROP TABLE : 참조 외래키 제약조건 먼저 삭제 필수
· SELECT : DISTINCT(중복 제거) / *(전체) / AS(별칭) / 산술식 / WHERE(조건)
· LIKE : %(0개 이상 문자) / _(1개 문자) — 문자열 조건에만 사용 가능
태그 : SQL이란DDL DML DCL 차이CREATE TABLE 문법FOREIGN KEY 참조 무결성ON DELETE CASCADEALTER TABLE 사용법SELECT DISTINCT 차이SQL WHERE 조건 검색SQL LIKE 와일드카드데이터베이스 언어
'이전 수업 노트 > 데이터베이스 개론' 카테고리의 다른 글
| 9. 데이터베이스 설계 - 관계 추출, 논리적 설계 규칙, 테이블 명세서 (0) | 2026.07.07 |
|---|---|
| 8. SQL과 DB설계 - INSERT, UPDATE, DELETE, 뷰 (0) | 2026.07.06 |
| 6. 관계 데이터 연산 (2) - 셀렉트, 프로젝트, 조인, 디비전, 관계 해석 (0) | 2026.06.17 |
| 5. 관계 데이터 연산 (1) - 데이터 모델, 관계 대수, 카티션 프로덕트 (0) | 2026.06.16 |
| 4. 관계 데이터 모델 (2) - 논리적 데이터 모델, 키의 계층, 무결성 제약조건 (0) | 2026.04.06 |

