데이터베이스 정규화와 SQL 판단법
함수 종속으로 정규형을 판별하고 SQL 실행 결과를 빠르게 추적하는 방법을 다룹니다.
정규화 순서
제1정규형은 원자값, 제2정규형은 부분 함수 종속 제거, 제3정규형은 이행 함수 종속 제거, BCNF는 모든 결정자가 후보키여야 한다는 기준입니다. 이어서 제4정규형은 후보키가 아닌 결정자에 의한 비자명한 다치 종속을 제거하고, 제5정규형은 후보키에서 유도되지 않는 조인 종속을 제거합니다.
- 정규화 순서는 1NF → 2NF → 3NF → BCNF → 4NF → 5NF로 이어진다.
- 복합키가 아니면 부분 함수 종속은 성립하지 않는다.
- 제4정규형은 다치 종속, 제5정규형은 조인 종속이 핵심 판단어다.
- 무손실 분해는 분해한 릴레이션을 조인했을 때 원래 릴레이션이 정확히 복원되는 성질이다.
- 종속성 보존은 원래 함수 종속을 조인 없이 분해된 릴레이션만으로 검사할 수 있는지를 본다.
- 정규화는 이상 현상을 줄이지만 조인 비용이 늘 수 있고, 반정규화는 성능을 위한 의도적 중복이다.
JOIN과 NULL
INNER JOIN은 양쪽에 일치하는 행만, OUTER JOIN은 기준 방향의 불일치 행도 보존합니다. NULL은 0이나 빈 문자열이 아니며 일반 비교 연산자 대신 IS NULL을 사용합니다.
- WHERE 조건이 OUTER JOIN 결과를 다시 제거할 수 있다.
- COUNT(*)는 행을, COUNT(열)은 NULL을 제외한 값을 센다.
- COALESCE는 첫 번째 NULL이 아닌 값을 반환한다.
GROUP BY와 윈도우 함수
GROUP BY는 여러 행을 그룹 단위로 축약하지만 윈도우 함수는 원래 행을 유지한 채 순위·누적값을 계산합니다. WHERE는 그룹화 전, HAVING은 그룹화 후 조건입니다.
- RANK는 동률 다음 순위를 건너뛴다.
- ROW_NUMBER는 동률에도 고유 번호를 준다.
- 집계함수와 일반 열을 함께 조회할 때 그룹 기준을 확인한다.
종속성과 SQL 실행 순서를 실제로 추적하기
정규화 문제는 후보키를 먼저 찾고 비주요 속성이 키 전체에 종속되는지, 다른 비주요 속성을 거쳐 종속되는지를 차례로 검사합니다. SQL 결과 문제는 FROM·JOIN, WHERE, GROUP BY, HAVING, SELECT, ORDER BY의 논리적 처리 순서에 맞춰 중간 결과를 작게 그리면 NULL과 집계 함정을 피할 수 있습니다.
- 부분 함수 종속은 복합 후보키의 일부에 종속될 때만 성립한다.
- OUTER JOIN 뒤 WHERE에서 반대편 열을 제한하면 보존했던 NULL 행이 제거될 수 있다.
- 서브쿼리가 여러 행을 반환할 수 있으면 = 대신 IN·ANY·ALL의 의미를 비교한다.
집합 연산·서브쿼리·인덱스 판단
UNION·INTERSECT·EXCEPT는 대응 열의 개수와 자료형 호환성을 먼저 확인하고, 중복 보존 여부는 ALL 유무로 구분합니다. 인덱스는 검색을 빠르게 하지만 갱신 비용과 저장 공간을 요구하므로 선택도와 사용 조건을 함께 판단해야 합니다.
- UNION은 기본적으로 중복을 제거하고 UNION ALL은 중복을 보존한다.
- EXISTS는 서브쿼리 결과 행의 존재 여부를 판단하며 SELECT 목록의 실제 값은 중요하지 않다.
- NOT IN의 비교 집합에 NULL이 있으면 UNKNOWN 때문에 예상과 다른 결과가 날 수 있다.
- B-트리 계열 인덱스는 범위 검색에 유리하지만 열에 함수를 적용하면 일반 인덱스를 활용하지 못할 수 있다.
데이터 모델링·키·관계대수 전범위
개념 모델은 업무 관점의 엔터티와 관계, 논리 모델은 속성·식별자·정규화, 물리 모델은 자료형·인덱스·파티션처럼 구현 세부사항을 다룹니다. 관계대수는 결과도 릴레이션인 폐쇄성을 가지며 선택·투영·조인·나눗셈의 피연산자와 결과를 구분해야 합니다.
- 엔터티는 업무에서 관리할 필요가 있는 식별 가능한 대상이고 인스턴스는 그 구체적인 한 건이다.
- 후보키는 유일성과 최소성을 모두 만족하며, 기본키로 선택되지 않은 후보키는 대체키가 된다.
- 식별 관계는 부모 기본키가 자식 기본키에 포함되고 비식별 관계는 일반 외래키로 이어지는 구조다.
- 선택은 행, 투영은 열을 고르며 자연 조인은 공통 속성의 동등 조건과 중복 열 제거를 포함한다.
SQLD 함수·계층형·윈도우·관리 구문
SQLD 결과 문제는 단일행 함수와 그룹 함수를 먼저 구분하고, 윈도우 함수는 행을 축약하지 않는다는 점을 기준으로 풉니다. 계층형 질의·Top N·PIVOT은 시험에서 사용하는 Oracle SQL 표현을 전제로 할 수 있으므로 지문의 방언과 처리 순서를 확인합니다.
- CASE와 조건 함수는 NULL 비교 방식과 최초로 참이 되는 분기를 확인하고 문자·날짜 함수는 반환 자료형을 함께 본다.
- RANK는 동률 다음 순위를 건너뛰고 DENSE_RANK는 건너뛰지 않으며 ROW_NUMBER는 동률에도 서로 다른 번호를 준다.
- 윈도우 프레임 ROWS는 물리적 행 수, RANGE는 정렬값의 동등 범위를 기준으로 포함 행이 달라질 수 있다.
- DML은 데이터 변경, TCL은 트랜잭션 제어, DDL은 객체 정의, DCL은 권한 제어이며 일부 DBMS의 DDL 커밋 동작은 방언 전제를 확인한다.
- 계층형 질의는 루트·부모자식 방향·순방향/역방향 조건과 형제 순서를 따로 표시하고, PIVOT은 행 값을 열로 집계하는 변환이다.
시험에 바로 쓰는 비교표
| 항목 | 적용 시점 | 결과 행 | 판단 기준 |
|---|---|---|---|
| WHERE | 그룹화 전 | 조건 불일치 행 제거 | 일반 열 조건 |
| HAVING | 그룹화 후 | 조건 불일치 그룹 제거 | 집계 결과 조건 |
| COUNT(*) | 집계 시 | 모든 행 계산 | NULL 포함 행 수 |
| COUNT(열) | 집계 시 | 해당 열 NULL 제외 | 값이 존재하는 행 수 |
지문 표현을 판단 기준으로 바꾸기
- 모든 결정자가 후보키여야 한다 → BCNF
- 외부 조인의 기준 방향 행을 보존한다 → OUTER JOIN
- 원래 행을 유지하면서 순위를 계산한다 → 윈도우 함수
자주 틀리는 판단
- NULL = NULL이 참이라고 판단
- HAVING을 항상 WHERE보다 먼저 적용
- 제2정규형과 제3정규형의 종속 제거 대상을 혼동
개념을 확인했다면 실제 문제에서 판단 기준을 적용해보세요.
분야별 문제 풀기