SQL 개발자 (SQLD) 데이터 모델과 SQL 핵심정리
26년 11월 1일 검사 완료
데이터 모델과 SQL, 핵심정리
- 1정규형은 한 칸에 값 하나(원자값), 2정규형은 부분 함수 종속 제거, 3정규형은 이행 함수 종속 제거입니다.
- BCNF는 모든 결정자가 후보키가 되도록 나눈 상태입니다.
- 정규화는 입력·수정·삭제 이상을 줄이지만, 조회할 때 조인이 늘어날 수 있습니다.
- 트랜잭션으로 함께 처리되어야 하는 엔터티 관계는 필수(Mandatory) 관계로 표현합니다.
- Null 을 포함한 산술 연산은 Null, 비교 연산은 알 수 없음(Unknown)이며, 집계 함수는 Null 을 빼고 계산합니다.
- 인조식별자는 키가 단순해지지만 중복 데이터가 생기기 쉽고 인덱스가 늘어날 수 있습니다.
- 중요도
- ★★★★☆ (4 / 5)
- 출제 비중
- 데이터 모델링의 이해 10문항 중 약 5문항 (45%)
정규화(1~3정규형·BCNF)와 반정규화, 관계와 조인의 관계, 모델에서 트랜잭션을 표현하는 방법, Null 속성의 성질, 본질식별자와 인조식별자의 장단점을 다룹니다.
📖 데이터 모델과 SQL 개념 정리 더보기 →데이터 모델과 SQL 대표 문제 10개
문제 1. 테이블의 모든 속성이 더 이상 나눌 수 없는 하나의 값(원자값)만 가지도록 만드는 정규화 단계는?
- ① 제2정규형
- ② 제3정규형
- ③ BCNF
- ④ 제1정규형
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ④ 제1정규형
핵심: 1정규형=원자값, 2정규형=부분 종속 제거, 3정규형=이행 종속 제거
정규화 단계는 순서대로 외우면 쉽습니다.
- 제1정규형: 한 칸에 값이 하나(원자값). 반복되는 값을 없앤다
- 제2정규형: 주식별자의 일부에만 종속된 속성(부분 함수 종속)을 없앤다
- 제3정규형: 주식별자가 아닌 속성끼리의 종속(이행 함수 종속)을 없앤다
- BCNF: 모든 결정자가 후보키가 되게 한다
틀린 선지
- 제2정규형: 부분 함수 종속을 없애는 단계로, 원자값은 그 전에 이미 만족해야 합니다.
- 제3정규형: 이행 함수 종속을 없애는 단계입니다.
- BCNF: 결정자가 모두 후보키가 되도록 하는 단계입니다.
문제 2. 복합 주식별자를 가진 테이블에서, 주식별자의 일부에만 종속된 속성(부분 함수 종속)을 분리하는 정규화 단계는?
- ① 제1정규형
- ② 제3정규형
- ③ 제2정규형
- ④ 제4정규형
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ③ 제2정규형
핵심: 부분 함수 종속 제거 = 제2정규형
제2정규형은 주식별자 전체가 아니라 일부에만 종속된 속성을 다른 테이블로 떼어 내는 단계입니다. 예를 들어 주식별자가 (학번, 과목코드)인데 과목명이 과목코드만으로 정해지면, 과목명을 과목 테이블로 분리합니다.
틀린 선지
- 제1정규형: 원자값(한 칸에 값 하나)을 만드는 단계입니다.
- 제3정규형: 일반 속성끼리의 종속(이행 함수 종속)을 없애는 단계입니다.
- 제4정규형: 다치 종속을 없애는 단계로, 부분 함수 종속과는 다릅니다.
문제 3. 다음 테이블은 제2정규형까지 만족한다. 이 테이블이 만족하지 못하는 정규형으로 가장 알맞은 것은? 사원(사원번호, 사원명, 부서번호, 부서명) - 주식별자: 사원번호 - 사원번호 → 부서번호, 부서번호 → 부서명
- ① 제3정규형
- ② 제1정규형
- ③ 제2정규형
- ④ 반정규형
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ① 제3정규형
핵심: A→B, B→C 처럼 일반 속성끼리 종속되면 제3정규형 위반
사원번호가 부서번호를 정하고, 부서번호가 다시 부서명을 정합니다(사원번호 → 부서번호 → 부서명). 이렇게 주식별자가 아닌 속성(부서번호)이 다른 속성(부서명)을 정하는 것을 이행 함수 종속이라 하며, 이것을 없애야 제3정규형이 됩니다. 부서(부서번호, 부서명) 테이블을 따로 만들면 해결됩니다.
틀린 선지
- 제1정규형: 모든 칸에 값이 하나씩이라 이미 만족합니다.
- 제2정규형: 문제에서 이미 만족한다고 했고, 주식별자가 사원번호 하나라 부분 함수 종속이 생길 수 없습니다.
- 반정규형: 정규형의 한 단계가 아니라, 성능을 위해 일부러 중복을 허용하는 반정규화를 떠올리게 하는 말입니다.
문제 4. 급여(SAL)가 3000, 상여(COMM)가 NULL 인 행에서 SAL + COMM 의 결과는?
- ① NULL
- ② 오류가 발생한다
- ③ 0
- ④ 3000
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ① NULL
핵심: NULL 이 섞인 산술 연산 결과는 NULL
NULL 은 '값을 모름'이라는 뜻입니다. 모르는 값에 무엇을 더해도 결과를 알 수 없으므로 NULL 이 들어간 산술 연산(+, −, ×, ÷)의 결과는 NULL 입니다. 3000 을 얻으려면 NVL(COMM, 0) 처럼 NULL 을 0 으로 바꾼 뒤 더해야 합니다.
틀린 선지
- 오류가 발생한다: 오류 없이 NULL 이 결과로 나옵니다.
- 0: NULL 연산 결과는 0 이 아니라 NULL 입니다.
- 3000: NULL 을 0 처럼 계산했을 때의 값입니다. NULL 은 0 이 아닙니다.
문제 5. [T 테이블] ID | C 1 | 10 2 | 20 3 | NULL 4 | 30 다음 SQL 의 결과는? SELECT COUNT(*), COUNT(C), AVG(C) FROM T;
- ① 4, 3, 15
- ② 4, 4, 15
- ③ 3, 3, 20
- ④ 4, 3, 20
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ④ 4, 3, 20
핵심: 집계 함수는 NULL 을 빼고 계산, COUNT(*)만 모든 행
- COUNT(*): 행 전체를 세므로 4
- COUNT(C): C 가 NULL 이 아닌 행만 세므로 10, 20, 30 → 3
- AVG(C): NULL 을 뺀 값만 평균 → (10 + 20 + 30) ÷ 3 = 60 ÷ 3 = 20
검산: NULL 을 0 으로 보면 60 ÷ 4 = 15 가 되지만, AVG 는 NULL 행을 빼고 나누므로 20 입니다.
틀린 선지
- 4, 3, 15: AVG 를 NULL 행까지 포함해 4로 나눈 값입니다. AVG 는 NULL 을 빼고 3으로 나눕니다.
- 4, 4, 15: COUNT(C) 는 NULL 을 세지 않으므로 4가 아니라 3입니다.
- 3, 3, 20: COUNT(*) 는 NULL 이 있는 행도 세므로 4입니다.
문제 6. NULL 에 대한 설명으로 옳지 않은 것은?
- ① NULL 은 숫자 0 이나 공백 문자와 다르다.
- ② 값이 NULL 인 행을 찾으려면 IS NULL 을 쓴다.
- ③ NULL 과 숫자를 더하면 결과는 NULL 이다.
- ④ NULL = NULL 을 비교하면 결과는 참(TRUE)이다.
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ④ NULL = NULL 을 비교하면 결과는 참(TRUE)이다.
핵심: NULL 과의 비교(=, <> 등)는 참도 거짓도 아닌 '알 수 없음'
NULL 은 '모르는 값'이라서 NULL 과 무엇을 비교해도 결과는 참도 거짓도 아닌 '알 수 없음(UNKNOWN)' 입니다. NULL = NULL 도 마찬가지입니다. WHERE 절은 참인 행만 돌려주므로 `WHERE C = NULL` 은 아무 행도 찾지 못합니다.
틀린 선지
- NULL 은 숫자 0 이나 공백 문자와 다르다: 옳은 설명입니다. (Oracle 은 빈 문자열 ''을 NULL 로 다루는 점은 따로 기억하세요)
- 값이 NULL 인 행을 찾으려면 IS NULL 을 쓴다: 옳은 설명입니다.
- NULL 과 숫자를 더하면 결과는 NULL 이다: 옳은 설명입니다.
문제 7. 정규화를 하면 줄일 수 있는 문제로 가장 알맞은 것은?
- ① 조회할 때 필요한 조인 횟수
- ② 데이터를 넣고 고치고 지울 때 생기는 이상 현상
- ③ 데이터베이스의 테이블 개수
- ④ SQL 문장의 길이
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ② 데이터를 넣고 고치고 지울 때 생기는 이상 현상
핵심: 정규화 = 중복 제거 → 입력·수정·삭제 이상 감소 (대신 조인 증가)
정규화는 중복 데이터를 없애 입력 이상·수정 이상·삭제 이상을 줄이는 작업입니다. 예를 들어 부서명이 사원 행마다 반복되면, 부서명을 바꿀 때 여러 행을 모두 고쳐야 하고 하나라도 빠뜨리면 데이터가 어긋납니다(수정 이상).
틀린 선지
- 조회할 때 필요한 조인 횟수: 정규화를 하면 테이블이 나뉘므로 조인은 오히려 늘어날 수 있습니다.
- 데이터베이스의 테이블 개수: 테이블을 나누므로 보통 늘어납니다.
- SQL 문장의 길이: 조인이 늘어 SQL 이 길어질 수 있습니다.
문제 8. 부모-자식 관계로 연결된 두 테이블을 조인할 때 일반적으로 서로 같은지 비교하는 컬럼은?
- ① 자식 테이블의 기본키와 부모 테이블의 일반 컬럼
- ② 두 테이블의 모든 컬럼
- ③ 두 테이블의 행 번호(ROWNUM)
- ④ 부모 테이블의 기본키와 자식 테이블의 외래키
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ④ 부모 테이블의 기본키와 자식 테이블의 외래키
핵심: 관계 = 부모 PK 와 자식 FK, 조인은 이 둘을 같게(=) 비교
모델의 관계는 실제 테이블에서 부모의 기본키(PK)와 자식의 외래키(FK)로 만들어집니다. 그래서 두 테이블을 조인할 때는 보통 `부모.PK = 자식.FK` 조건을 씁니다. 예: `DEPT.DEPTNO = EMP.DEPTNO`
틀린 선지
- 자식 테이블의 기본키와 부모 테이블의 일반 컬럼: 관계를 연결하는 것은 부모의 기본키와 자식의 외래키입니다.
- 두 테이블의 모든 컬럼: 모든 컬럼을 비교하면 원하는 결과가 나오지 않습니다. 관계를 만드는 키 컬럼만 비교합니다.
- 두 테이블의 행 번호(ROWNUM): ROWNUM 은 조회할 때 붙는 순번이라 두 테이블을 연결하는 값이 아닙니다.
문제 9. 다음 테이블에서 가장 먼저 해결해야 할 정규화 문제는? 수강(학번, 과목코드, 성적, 과목명) - 주식별자: (학번, 과목코드) - (학번, 과목코드) → 성적, 과목코드 → 과목명
- ① 성적이 학번 하나에만 종속되어 제2정규형을 위반한다.
- ② 과목명이 주식별자의 일부(과목코드)에만 종속되어 제2정규형을 위반한다.
- ③ 한 칸에 값이 여러 개 들어 있어 제1정규형을 위반한다.
- ④ 과목명이 성적에 종속되어 제3정규형을 위반한다.
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ② 과목명이 주식별자의 일부(과목코드)에만 종속되어 제2정규형을 위반한다.
핵심: 복합키 일부(과목코드)→과목명 = 부분 종속 → 제2정규형 위반
주식별자는 (학번, 과목코드) 두 속성입니다.
- 성적은 학번과 과목코드를 모두 알아야 정해지므로 문제가 없습니다.
- 과목명은 과목코드 하나만 알면 정해집니다 → 주식별자 일부에만 종속(부분 함수 종속)
따라서 제2정규형을 위반하며, 과목(과목코드, 과목명) 테이블로 분리해야 합니다.
틀린 선지
- 성적이 학번 하나에만 종속되어 제2정규형을 위반한다: 성적은 (학번, 과목코드) 전체에 종속되어 있습니다.
- 한 칸에 값이 여러 개 들어 있어 제1정규형을 위반한다: 주어진 내용에 한 칸에 여러 값이 들어간다는 조건이 없습니다.
- 과목명이 성적에 종속되어 제3정규형을 위반한다: 주어진 종속 관계에 성적 → 과목명은 없습니다.
문제 10. 주문상세 테이블의 주식별자를 (주문번호, 상품번호) 대신 일련번호 하나로 바꾸었다. 이때 생길 수 있는 문제로 가장 알맞은 것은?
- ① 같은 주문번호·상품번호 조합이 중복으로 입력될 수 있다.
- ② 주문 테이블과 외래키로 연결할 수 없게 된다.
- ③ 주문상세 행 수가 줄어든다.
- ④ 주문번호로 주문상세를 조회할 수 없게 된다.
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ① 같은 주문번호·상품번호 조합이 중복으로 입력될 수 있다.
핵심: 인조식별자 단점: 중복 데이터 위험, 필요한 인덱스 증가
일련번호 같은 인조식별자를 쓰면 키가 단순해지는 장점이 있지만, 일련번호만 다르면 같은 주문·같은 상품이 두 번 들어가도 막을 수 없습니다. 이를 막으려면 (주문번호, 상품번호)에 별도의 UNIQUE 인덱스를 더 만들어야 하므로 인덱스도 늘어납니다.
틀린 선지
- 주문 테이블과 외래키로 연결할 수 없게 된다: 주문번호를 일반 속성(외래키)으로 두면 계속 연결할 수 있습니다.
- 주문상세 행 수가 줄어든다: 주식별자를 바꾼다고 데이터 행 수가 줄지 않습니다.
- 주문번호로 주문상세를 조회할 수 없게 된다: 주문번호 컬럼은 그대로 남아 있으므로 조회할 수 있습니다.
직접 풀어서 확인해 보세요.
AI 작성 · 운영진 검수 전