DDL·DML 전체 구문과 SELECT 절 실행 순서를 이해하고, JOIN 5종의 차이를 실제 결과 비교표로 완벽히 정리합니다.
📋 DDL — 데이터 정의 언어
이 섹션에서는 테이블 구조를 정의·수정·삭제하는 DDL(Data Definition Language) 명령어를 살펴보겠습니다.
DDL(Data Definition Language)은 데이터베이스의 구조를 정의하는 언어입니다. DDL 명령어는 자동으로 COMMIT되어 ROLLBACK이 불가능합니다. 이 점이 DML과의 큰 차이입니다.
CREATE TABLE의 주요 제약조건은 다음과 같습니다. PRIMARY KEY: 기본키, NULL·중복 불가. UNIQUE: 유일키, NULL은 허용하나 중복 불가. NOT NULL: NULL 값 불가. CHECK: 특정 조건을 만족하는 값만 허용. DEFAULT: 값 미입력 시 기본값 지정. FOREIGN KEY ~ REFERENCES: 외래키로 다른 테이블의 기본키 참조.
ALTER TABLE은 기존 테이블 구조를 변경합니다. ADD COLUMN으로 열 추가, MODIFY COLUMN(또는 ALTER COLUMN)으로 열 수정, DROP COLUMN으로 열 삭제, ADD CONSTRAINT로 제약조건 추가가 가능합니다.
| 명령어 | 기능 | 특징 |
|---|---|---|
| CREATE | 테이블·인덱스·뷰 생성 | 자동 COMMIT |
| ALTER | 테이블 구조 변경 | 자동 COMMIT |
| DROP | 테이블·인덱스·뷰 삭제 | 구조+데이터 모두 삭제, 자동 COMMIT |
| TRUNCATE | 테이블 데이터 전체 삭제 | 구조는 유지, 자동 COMMIT, ROLLBACK 불가 |
TRUNCATE vs DELETE 비교: TRUNCATE는 DDL로 자동 COMMIT되어 ROLLBACK 불가능하며 훨씬 빠릅니다. DELETE는 DML로 트랜잭션 내에서 ROLLBACK 가능하며 WHERE 조건으로 일부만 삭제할 수 있습니다. 기출에서 가장 자주 나오는 비교 문제입니다.
🔍 SELECT — 절 실행 순서 완전 정복
이 섹션에서는 SELECT 문의 각 절이 실행되는 순서를 살펴보겠습니다. 이 순서는 기출에서 반복 출제되는 핵심입니다.
SELECT 문을 작성하는 순서(문법 순서)와 실제 데이터베이스 엔진이 실행하는 순서(실행 순서)는 다릅니다. 실행 순서를 모르면 HAVING과 WHERE의 차이, GROUP BY의 위치를 혼동하게 됩니다.
| 실행 순서 | 절(Clause) | 역할 |
|---|---|---|
| 1 | FROM | 대상 테이블 지정 |
| 2 | WHERE | 행 단위 필터링 (집계 전) |
| 3 | GROUP BY | 그룹화 |
| 4 | HAVING | 그룹 단위 필터링 (집계 후) |
| 5 | SELECT | 출력할 열 선택·집계함수 실행 |
| 6 | ORDER BY | 정렬 |
암기법: "FROM 왔 GROUP 하면 SELECT ORDER" — FROM·WHERE·GROUP BY·HAVING·SELECT·ORDER BY. "프왜그해셀오"로 줄여 외웁니다.
HAVING vs WHERE: WHERE는 집계 함수를 사용할 수 없습니다. 집계 결과를 조건으로 걸 때는 HAVING을 사용해야 합니다. "부서별 평균 급여가 3000 이상인 부서"는 HAVING AVG(salary) >= 3000으로 작성합니다.
📊 집계 함수와 NULL 처리
이 섹션에서는 GROUP BY와 함께 사용하는 집계 함수와 NULL 값 처리 방식을 살펴보겠습니다.
집계 함수는 여러 행의 값을 하나의 결과로 요약합니다. NULL 처리 방식이 함수마다 다르므로 주의가 필요합니다.
| 함수 | 역할 | NULL 처리 |
|---|---|---|
| COUNT(*) | 전체 행 수 | NULL 행도 포함 |
| COUNT(열) | 해당 열의 행 수 | NULL 제외 |
| SUM(열) | 합계 | NULL 무시 |
| AVG(열) | 평균 | NULL 무시 (분모에서도 제외) |
| MAX(열) | 최댓값 | NULL 무시 |
| MIN(열) | 최솟값 | NULL 무시 |
기출 함정: 5개 행 중 2개가 NULL인 열의 AVG = (나머지 3개 합계) / 3. NULL을 포함하여 5로 나누지 않습니다. COUNT(*)=5이지만 COUNT(열)=3입니다. 이 차이를 계산하는 문제가 자주 출제됩니다.
🔀 JOIN 5종 — 결과 비교표
이 섹션에서는 SQL의 JOIN 5가지 종류와 각각의 결과 차이를 살펴보겠습니다.
두 테이블 학생(학번·이름)과 수강(학번·과목)이 있다고 가정합니다. 학생 테이블: (101,홍길동), (102,이순신), (103,강감찬). 수강 테이블: (101,수학), (102,영어), (104,과학).
| JOIN 종류 | 결과 행 | NULL 발생 | 설명 |
|---|---|---|---|
| INNER JOIN | 양쪽 모두 일치하는 행만 | 없음 | (101,홍길동,수학), (102,이순신,영어) → 2행 |
| LEFT OUTER JOIN | 왼쪽 테이블 전체 + 오른쪽 일치 | 오른쪽에 NULL | 홍길동·이순신·강감찬 포함, 강감찬의 과목=NULL → 3행 |
| RIGHT OUTER JOIN | 오른쪽 테이블 전체 + 왼쪽 일치 | 왼쪽에 NULL | 수학·영어·과학 포함, 과학의 이름=NULL → 3행 |
| FULL OUTER JOIN | 양쪽 테이블 모두 포함 | 양쪽에 NULL 가능 | 모든 행 포함 → 4행 |
| CROSS JOIN | 모든 조합 (교차곱) | 없음 | 3×3=9행 (조건 없이 모든 조합) |
NATURAL JOIN은 두 테이블에서 이름이 같은 열을 자동으로 조인 조건으로 사용합니다. ON 조건 없이 공통 열 이름으로 자동 매칭됩니다. USING 절은 조인에 사용할 열 이름을 명시적으로 지정합니다.
암기법: "INNER=교집합, LEFT=왼쪽 전체, RIGHT=오른쪽 전체, FULL=합집합, CROSS=교차곱". OUTER는 생략 가능하므로 LEFT JOIN = LEFT OUTER JOIN입니다.
기출 함정: "INNER JOIN에서는 NULL 행이 발생할 수 있다" → 틀림. INNER JOIN은 양쪽 모두 일치하는 행만 반환합니다. "CROSS JOIN은 ON 조건을 사용한다" → 틀림. CROSS JOIN은 조건 없이 모든 조합을 반환합니다.
📌 12강 핵심 요약과 13강 예고
이 섹션에서는 12강 핵심 내용을 압축 정리합니다.
DDL 4명령: CREATE·ALTER·DROP(구조+데이터)·TRUNCATE(데이터만, 빠름) — 모두 자동 COMMIT. TRUNCATE vs DELETE: TRUNCATE는 ROLLBACK 불가, DELETE는 ROLLBACK 가능.
SELECT 실행 순서: "프왜그해셀오" — FROM·WHERE·GROUP BY·HAVING·SELECT·ORDER BY. HAVING은 집계 후 조건, WHERE는 집계 전 조건. COUNT(*)는 NULL 포함, COUNT(열)은 NULL 제외. AVG는 NULL 제외하고 계산.
JOIN: INNER=교집합, LEFT=왼쪽전체, RIGHT=오른쪽전체, FULL=합집합, CROSS=교차곱(조건없음).
다음 13강에서는 SQL 심화 — 서브쿼리·뷰·인덱스·트랜잭션 — 상관 서브쿼리, 뷰의 특성, B-Tree 인덱스, ACID 속성, 격리수준 4단계를 완벽히 정리합니다.
관련 주제
- CREATE ALTER DROP
- 제약조건 PRIMARY KEY
- SELECT WHERE GROUP BY HAVING
- 집계 함수 COUNT SUM AVG
- INNER LEFT RIGHT FULL OUTER JOIN
- CROSS JOIN
- 자격증
- 자격증 강의
- 정보처리기사 필기 25강 — 핵심이론·기출 완전정복
- 무료강의
- 무료 온라인 강의
- NUGUNA
- 누구나
📚 시리즈 전체 공유
정보처리기사 필기 25강 — 핵심이론·기출 완전정복
이 강의가 속한 시리즈는 총 13강, 모두 무료입니다. 처음부터 배우려는 동료에게 시리즈 전체를 알려 주세요.
댓글
불러오는 중...
