Database System 중간고사 연습문제
범위: Chapter 2 ~ Chapter 7
문제 수: 40 (단원별 비율: Ch2=6, Ch3=7, Ch4=7, Ch5=6, Ch6=7, Ch7=7)
사용법: 문제를 먼저 풀고, 바로 아래 정답·해설을 확인.
스키마는 교과서 예시(instructor, student, course, section, takes, teaches, advisor, department, prereq 등)를 그대로 사용.
Chapter 2 — Relational Model (6 문제)
Q1. Superkey / Candidate key / Primary key의 차이를 한 문장씩으로 설명하라.
정답
- Superkey: 튜플을 유일하게 식별할 수 있는 속성의 부분집합 (중복 허용, 최소성 불필요).
- Candidate key: superkey이면서 어떤 진부분집합도 superkey가 아닌 것 (최소성 만족).
- Primary key: candidate key 중 DBA가 식별용으로 선택한 하나.
해설: 포함관계는 Primary ⊆ Candidate ⊆ Superkey. 예를 들어 instructor에서 {ID, name}은 superkey지만 {ID}가 더 작으므로 candidate가 아니다. {ID}가 candidate이고, primary key로 선택된다.
Q2. 다음 관계 대수 식을 자연어로 해석하라.
정답: “Physics 학과에 소속된 교수들의 이름을 모두 조회”.
해설: σ가 먼저 튜플을 필터링하고, Π가 name 컬럼만 투영. 연산 순서는 내부 → 외부.
Q3. instructor(ID, name, dept_name, salary) 테이블에 대해 “급여가 80000 초과인 교수의 ID와 name”을 관계 대수식으로 쓰시오.
정답:
해설: 조건 선택(σ) 후 속성 투영(Π). 투영은 자동으로 중복을 제거한다(집합 의미론).
Q4. Natural join 이 Cartesian product 로부터 어떻게 정의되는지 수식으로 써라. (공통 속성을 라 하자.)
정답:
여기서 .
해설: Natural join = Cartesian product → 공통 속성 동등 조건으로 필터 → 공통 속성 중복 제거. 공통 속성이 하나도 없으면 Cartesian product와 같아진다.
Q5. 관계 대수의 6가지 기본 연산(fundamental operations)을 나열하라.
정답: σ (select), Π (project), ∪ (union), − (set difference), × (Cartesian product), ρ (rename)
해설: 교집합(∩), 자연조인(⋈), 배정(←)은 추가(파생) 연산 — 기본 6개로 표현 가능. 예: .
Q6. 다음 두 식이 동치인지 판별하고 이유를 설명하라.
정답: 동치.
해설: 연속된 선택 조건은 conjunction으로 합쳐도 결과가 같다. 쿼리 최적화기가 selection pushdown을 수행할 때 활용하는 핵심 동치성. 순서도 교환 가능: .
Chapter 3 — Intro to SQL (7 문제)
Q7. 다음 SQL의 결과를 예측하라.
SELECT DISTINCT dept_name FROM instructor;만약 DISTINCT를 빼면 무엇이 달라지는가?
정답: 교수들이 속한 학과 이름의 집합 (중복 제거). DISTINCT를 빼면(혹은 ALL 명시) 같은 학과가 교수 수만큼 중복되어 나옴.
해설: SQL은 기본이 multiset(bag) 의미론 → 기본값은 ALL. 집합(set) 의미론을 원하면 반드시 DISTINCT 명시. 관계 대수(Π)는 기본이 집합 의미론이라는 점이 차이.
Q8. “학생 이름과 그 학생의 지도교수 이름을 출력”하는 쿼리를 작성하라. (student, advisor, instructor 사용)
정답:
SELECT s.name AS student_name, i.name AS advisor_name
FROM student s, advisor a, instructor i
WHERE s.ID = a.s_ID AND a.i_ID = i.ID;해설: from의 다중 릴레이션은 Cartesian product → where에서 동등 조인 조건으로 필터링. AS로 별명(alias) 지정은 선택사항이지만 가독성에 도움.
Q9. like 패턴에서 다음 두 표현의 차이를 설명하라.
name LIKE '10___%' -- (1)
name LIKE '10%' -- (2)정답:
- (1)
10으로 시작하고 그 뒤에 최소 3자 이상의 임의 문자가 따라오는 문자열 (총 5자 이상). - (2)
10으로 시작하는 모든 문자열 (길이 무관,10만이어도 매칭).
해설: _는 정확히 1자, %는 0자 이상. 혼합하면 길이 하한을 만들 수 있다.
Q10. NULL을 포함한 세 값 논리(3VL)에서 다음 식의 값은?
(5 > NULL) -- (1)
(NULL = NULL) -- (2)
(NULL OR TRUE) -- (3)
(NULL AND FALSE) -- (4)정답: (1) unknown, (2) unknown, (3) true, (4) false.
해설: NULL과의 비교/산술은 unknown. OR은 하나라도 true면 true, AND는 하나라도 false면 false — unknown을 흡수하는 규칙. WHERE 절은 true만 통과시키고 unknown/false는 제거.
Q11. “각 학과에서 평균 급여가 42000 초과인 학과의 이름과 평균 급여”를 구하는 SQL을 작성하라.
정답:
SELECT dept_name, AVG(salary) AS avg_sal
FROM instructor
GROUP BY dept_name
HAVING AVG(salary) > 42000;해설: 그룹 자체에 대한 조건은 HAVING, 개별 튜플 조건은 WHERE. HAVING은 GROUP BY 후 평가되므로 집계함수 사용 가능.
Q12. “다른 어떤 교수보다도 급여가 높은 교수”를 all 서브쿼리로 구하라.
정답:
SELECT name
FROM instructor
WHERE salary >= ALL (SELECT salary FROM instructor);해설: >= ALL은 “모든 값보다 크거나 같다” = 최댓값. 동률이 있으면 여러 명 리턴. > 쓰면 유일 최댓값만. max() 집계로도 동치 표현 가능.
Q13. exists와 in은 언제 서로 다른 결과를 낼 수 있는가? 특히 NULL이 섞일 때 주의점을 서술하라.
정답: 서브쿼리 결과에 NULL이 섞이면 NOT IN은 전체가 unknown으로 처리되어 아무것도 반환하지 않을 수 있다. NOT EXISTS는 NULL의 영향을 받지 않아 안전.
해설:
x NOT IN (1, 2, NULL)→x≠1 AND x≠2 AND x≠NULL→ 마지막이 unknown → 전체 unknown.NOT EXISTS (...)는 서브쿼리가 비었는지만 보므로 NULL에 무관.- 실무 tip: 부정 포함 서브쿼리는 가능한
NOT EXISTS를 선호.
Chapter 4 — Intermediate SQL (7 문제)
Q14. Inner join, Left outer, Right outer, Full outer의 차이를 한 줄로 각각 설명하라.
정답:
- Inner: 양쪽 매칭된 튜플만.
- Left outer: 왼쪽 전부 + 매칭 안된 오른쪽은 NULL.
- Right outer: 오른쪽 전부 + 매칭 안된 왼쪽은 NULL.
- Full outer: 양쪽 전부 + 매칭 안된 쪽은 NULL로 채움.
해설: outer join은 “잃고 싶지 않은 쪽”을 결정. 출석 현황·주문 이력 같은 리포트에서 빈 항목도 보이게 할 때 사용.
Q15. natural join, join ... on, join ... using의 차이를 설명하라.
정답:
- natural: 같은 이름의 모든 컬럼을 자동으로 동등 조건 + 중복 컬럼 1개로 merge.
- on: 임의 조건 지정 가능, 매칭된 양쪽 컬럼을 둘 다 유지.
- using(col, …): 지정된 컬럼들만 동등 조인, 해당 컬럼은 natural처럼 1개로 merge.
해설: natural은 편하지만 우연히 같은 이름(name 등)이 있으면 위험 → 명시적 using 또는 on 권장.
Q16. 뷰(view)를 정의하는 SQL 구문을 쓰고, materialized view와의 차이를 한 문장으로 설명하라.
정답:
CREATE VIEW faculty AS
SELECT ID, name, dept_name FROM instructor;- 일반 view: 쿼리 시점에 정의식을 inline expansion (가상 관계).
- Materialized view: 쿼리 결과를 실제로 저장, 원본 변경 시 갱신(maintenance) 필요.
해설: materialized는 조회 빠름·저장 비용·일관성 유지 부담. view는 항상 최신이지만 매번 평가 비용.
Q17. 다음 뷰가 갱신 가능한(updatable) 조건을 3가지 이상 쓰시오.
정답 (교과서 §2.7 기준):
- from 절에 단 하나의 데이터베이스 릴레이션만 있을 것.
- select 절이 릴레이션의 속성만 가질 것 (표현식·집계·DISTINCT 없음).
- select에 없는 속성은 NULL 허용이어야 함 (insert 시 채울 수 없으므로).
- GROUP BY, HAVING 없을 것.
해설: 이 조건을 만족하지 않으면 insert/update/delete를 어느 원본 튜플로 귀속시킬지 모호 → DBMS가 거부.
Q18. 외래키 제약에서 ON DELETE CASCADE, ON DELETE SET NULL, ON DELETE RESTRICT(또는 NO ACTION)의 동작 차이를 설명하라.
정답:
- CASCADE: 부모 행 삭제 시 자식 행도 함께 삭제.
- SET NULL: 자식의 FK 컬럼을 NULL로 변경.
- RESTRICT/NO ACTION: 자식이 남아있으면 부모 삭제를 거부.
해설: 도메인에 따라 선택. 주문 이력은 CASCADE가 위험(감사 기록 손실), SET NULL은 nullable이어야 함.
Q19. 다음 권한 명령의 차이를 설명하라.
GRANT SELECT ON instructor TO Amit; -- (1)
GRANT SELECT ON instructor TO Amit WITH GRANT OPTION; -- (2)정답: (1)은 Amit이 자신만 SELECT 가능. (2)는 Amit이 다른 사용자에게 권한을 재부여할 수 있음.
해설: GRANT OPTION은 권한 위임 체인을 만듦. 나중에 REVOKE ... CASCADE로 전체 체인 회수 가능.
Q20. Role의 필요성을 SQL 예시와 함께 설명하라.
정답:
CREATE ROLE instructor_role;
GRANT SELECT ON student TO instructor_role;
GRANT instructor_role TO Einstein, Curie;- 개별 사용자마다 권한을 반복 부여하는 대신 역할에 한 번 부여하고 역할을 사용자에게 부여.
- 인사 이동/퇴직 시 관리 비용 급감, 권한 일관성 확보.
해설: 역할은 역할에도 부여 가능(중첩) — 권한 계층을 자연스럽게 모델링.
Chapter 5 — Advanced SQL (6 문제)
Q21. 호스트 언어에서 SQL을 호출하는 3가지 주요 방식을 나열하고 각각 1줄 특징.
정답:
- Dynamic SQL (JDBC/ODBC): 런타임 문자열로 SQL 전송, 가장 유연.
- Embedded SQL: 컴파일 타임에 전처리기가 SQL을 번역, 컴파일 시점 검증.
- Stored Procedure: 서버에 미리 저장된 프로시저 호출, 네트워크 왕복 최소화.
해설: 대부분의 현대 앱은 JDBC/ODBC/Python DB-API류 dynamic 방식.
Q22. Prepared Statement가 일반 Statement보다 나은 이유 두 가지를 쓰시오.
정답:
- 성능: SQL 파싱/플래닝을 한 번만 하고 파라미터만 바꿔 재실행 → 루프 반복에서 빠름.
- 보안: 파라미터가 문자열 치환이 아닌 값 바인딩으로 들어가므로 SQL injection 차단.
해설: ? 플레이스홀더로 바인딩 → 따옴표·;·-- 등이 코드가 아닌 데이터로 처리됨.
Q23. 다음 코드의 취약점을 지적하고 수정하라. (Java/JDBC)
String q = "SELECT * FROM users WHERE name = '" + input + "'";
stmt.executeQuery(q);정답: SQL Injection 취약. input으로 x' OR '1'='1 같은 값이 들어오면 전체 테이블이 노출.
수정:
PreparedStatement ps = conn.prepareStatement(
"SELECT * FROM users WHERE name = ?");
ps.setString(1, input);
ResultSet rs = ps.executeQuery();해설: setString은 내부적으로 이스케이프 + 값 바인딩을 안전하게 처리. 문자열 연결은 절대 금지.
Q24. Trigger 설계 시 반드시 지정해야 하는 두 요소는?
정답:
- Triggering event — 어떤 이벤트에 반응 (INSERT/UPDATE/DELETE), timing (BEFORE/AFTER), 단위 (ROW/STATEMENT).
- Action — 이벤트 발생 시 수행할 SQL 로직 (조건부 WHEN + body).
해설: 이 두 요소가 “언제 무엇을” 정의. 예: AFTER INSERT ON takes FOR EACH ROW WHEN (new.grade IS NOT NULL) BEGIN ... END;
Q25. 참조 무결성을 트리거로 구현해야 하는 경우의 예를 들고, 왜 외래키만으로는 부족한지 설명하라.
정답: 예를 들어 “takes 삽입 시 해당 student의 credits_earned를 해당 section의 credits만큼 증가”처럼 파생값을 유지해야 하는 경우. 외래키는 존재 여부만 강제하지, 계산된 속성을 갱신하지 않음.
해설: 참조 무결성(FK)은 관계의 존재를 보장. 트리거는 임의의 business rule을 자동 실행. 복잡한 계산·감사 로그·비정규화 필드 유지 등에 활용.
Q26. JDBC의 4단계 통신 모델을 순서대로 쓰시오.
정답:
- Connection 수립 (DriverManager.getConnection)
- Statement 생성 (createStatement / prepareStatement)
- 실행 및 결과 처리 (executeQuery / executeUpdate, ResultSet 순회)
- 자원 해제 (close — ResultSet, Statement, Connection 순서로)
해설: 4단계는 try-with-resources로 자동 close 권장. 누수는 connection pool 고갈의 주요 원인.
Chapter 6 — ER Model (7 문제)
Q27. ER 다이어그램의 표기 기호 5가지(사각형·이중사각형·다이아몬드·이중다이아몬드·타원)가 각각 무엇을 의미하는지 쓰시오.
정답:
- 사각형: entity set
- 이중 사각형: weak entity set
- 다이아몬드: relationship set
- 이중 다이아몬드: identifying relationship (weak entity와 연결)
- 타원: attribute (실선 밑줄=PK, 점선 밑줄=discriminator)
해설: 기호 간 연결선도 의미 — 실선(직접)/이중선(total participation)/화살표(→=one).
Q28. l..h 표기로 “한 학생은 0~5개 과목을 수강하며, 한 과목은 최소 10명, 최대 300명 수강”을 쓰시오. (student, course, enrolls)
정답:
student 10..300 —[enrolls]— 0..5 course
혹은 (인접 규약에 따라)
student 0..5 —[enrolls]— 10..300 course
**단, “각 변의 l..h는 그 변에 붙은 엔티티 쪽 제약”**이라는 관례(교과서 표기)에 따르면:
- student 쪽 변에
0..5→ 한 학생은 0~5과목 수강. - course 쪽 변에
10..300→ 한 과목은 10~300명 수강.
해설: l=1이면 total. h=*이면 상한 없음. 구 표기(→, 이중선)로는 0/1/∞만 가능했으나 l..h는 임의 정수 구간 표현 가능.
Q29. Weak entity set이 필요한 상황을 한 문장으로 설명하고, section이 weak인 이유를 구체적으로 쓰시오.
정답: 자기 속성만으로는 유일 식별이 불가능하고, 다른 엔티티(identifying entity)의 PK에 존재 의존적일 때 weak entity로 모델링.
- section은 (sec_id, semester, year)만으로는 서로 다른 course의 같은 시간대 section을 구분 못 함.
- course의 PK (
course_id)를 identifying relationshipsec_course를 통해 빌려와야 식별 완성.
해설: 다이어그램에서 section 박스 안에는 course_id를 그리지 않고, 이중 다이아몬드 sec_course가 식별 의존을 시각화. reduction 단계에서야 course_id가 section 테이블의 컬럼으로 등장.
Q30. Total participation과 partial participation의 차이를 예시로 설명하고, ER 다이어그램 표기법을 쓰시오.
정답:
- Total (이중선): 엔티티 집합의 모든 원소가 관계에 반드시 참여.
예: 모든 student는 advisor 관계에 참여 (지도교수를 반드시 가져야 함). - Partial: 일부만 참여해도 OK.
예: instructor는 지도학생이 없을 수도 있음.
해설: l..h로는 l ≥ 1이 total, l = 0이 partial. 구 표기로는 다이아몬드와 엔티티를 잇는 이중선이 total.
Q31. 다음 ER을 관계형 스키마로 환원하라.
- instructor (strong, PK=ID), department (strong, PK=dept_name), inst_dept (many-to-one, instructor 쪽 total).
정답:
department(dept_name, building, budget)
instructor(ID, name, salary, dept_name) -- dept_name은 FK
-- inst_dept 테이블은 생략 (redundant)
해설: §9.5 규칙 — N:1 + many 쪽 total이면 별도 관계 테이블 생략, 많은 쪽 엔티티에 FK 컬럼 추가. partial이면 NULL 발생 가능.
Q32. Specialization에서 overlapping vs disjoint, total vs partial의 차이를 표로 정리하라.
정답:
| 축 | 유형 | 의미 | 예시 |
|---|---|---|---|
| 겹침 | overlapping | 한 엔티티가 여러 하위 집합에 동시 속할 수 있음 | 한 사람이 employee이면서 student |
| 겹침 | disjoint | 하위 집합이 서로소 | instructor vs secretary |
| 완전성 | total | 상위의 모든 엔티티가 어떤 하위에 반드시 속함 | 모든 person은 employee 또는 student |
| 완전성 | partial | 어느 하위에도 속하지 않는 상위 엔티티 허용 | 일부 person은 둘 다 아님 |
해설: 두 축은 독립 → 4가지 조합(overlap+total, overlap+partial, disjoint+total, disjoint+partial) 모두 가능.
Q33. “instructor와 department 사이의 works_in 관계에 start_date 속성을 붙이면, 이것은 entity 속성인가 relationship 속성인가? 이유와 함께 답하라.”
정답: relationship 속성. 특정 instructor가 특정 department에 언제부터 소속되었는지는 두 엔티티의 짝(pair)에 종속된 정보 — 어느 한쪽 엔티티만으로는 의미가 결정되지 않음.
해설: ER 다이어그램에서 점선으로 다이아몬드(works_in)와 연결. instructor가 학과를 옮기면 start_date도 짝과 함께 갱신되는 게 자연스러움.
Chapter 7 — Relational DB Design (7 문제)
Q34. 에서 일 때 를 계산하라.
정답:
- 초기 .
- 적용 → .
- 적용 → .
- 더 이상 추가 불가.
∴ .
해설: 는 도출 불가 → 는 의 superkey가 아님. 의 candidate key는 (계산하면 ).
Q35. 를 와 로 분해했을 때 lossless 조건을 만족하려면 어떤 FD가 있어야 하는가?
정답: 이므로 또는 중 하나라도 에 있어야 lossless.
해설: 일반 규칙 — 공통 속성이 한쪽 분해 릴레이션의 superkey여야 lossless. 둘 중 어느 쪽이든 superkey가 되면 됨.
Q36. BCNF의 정의를 쓰고, 다음 스키마가 BCNF를 위반하는지 판정하라.
, .
정답:
- BCNF 정의: 의 모든 nontrivial FD 에 대해 가 superkey여야 함.
- 이 스키마의 candidate key = .
- 에서 는 superkey가 아님 → BCNF 위반.
해설: 가 advisor를 결정하지만 전체 키가 아님 → transitive dependency. BCNF로 분해하려면 , .
Q37. 3NF 정의(3가지 조건 중 하나)를 쓰고, BCNF와 비교했을 때 완화된 점을 설명하라.
정답: FD ()가 다음 중 하나를 만족:
- 가 superkey, 또는
- 가 trivial, 또는
- 의 각 속성이 어떤 candidate key에 포함됨 (즉 prime attribute).
BCNF와의 차이: 3NF는 조건 3을 허용 → prime attribute로의 partial dependency를 허용 → 일부 redundancy 잔존 가능.
해설: 3NF의 대가로 dependency preservation을 항상 보장 (BCNF는 보장 안 됨). 실무는 3NF이 기본, BCNF는 가능할 때 선택.
Q38. , . 이 스키마의 candidate key와 BCNF/3NF 여부를 판정하라.
정답:
- → superkey. 최소성 확인 → 단독으론 전부 못 만들므로 는 candidate key.
- → 도 candidate key.
- Prime attributes: A, B, C 전부.
- BCNF 검사: 에서 는 superkey 아님 → BCNF 위반.
- 3NF 검사: 의 가 candidate key 의 속성 → prime → 3NF 만족.
해설: 전형적 “3NF는 되지만 BCNF는 안 되는” 예시. BCNF로 분해하면 의존성이 보존되지 않음 → dependency preservation 희생.
Q39. BCNF Decomposition 알고리즘의 핵심 아이디어를 pseudocode 수준으로 쓰시오.
정답:
result := {R}
while result에 BCNF 위반 스키마 R_i 존재:
R_i에서 위반 FD α → β를 하나 선택 (α는 R_i의 superkey 아님)
result := (result - R_i) ∪ { (α ∪ β), (R_i - β) }
return result
해설:
- 각 분해는 lossless 보장 (공통 속성 가 한쪽의 superkey).
- Dependency preservation은 보장 안 됨 — 알고리즘의 한계.
- 기반으로 위반 판정해야 완전 (but 시험에선 given F로도 OK).
Q40. 다음 Q38 스키마에 3NF decomposition을 적용하라. , .
정답:
- Canonical cover (이미 최소).
- 각 FD에 대해 릴레이션 생성:
- →
- →
- Candidate key를 포함하는 릴레이션이 있는지 확인: 이 를 포함 → OK.
- 다른 릴레이션에 subsume되는 것 제거: 관계가 아님 (C, B만 포함). 그대로 유지.
최종:
단, 둘이 중복되는 속성(B, C)이 있으니 실제로는 만 남겨도 F를 보존하므로 는 redundant. 알고리즘 단계에서 “기존 릴레이션이 이미 FD를 보존”하면 새로 만들지 않을 수 있음.
해설: 3NF 알고리즘은 dependency preservation + lossless + 3NF를 모두 보장하는 유일한 표준 알고리즘. BCNF 알고리즘과 달리 FD가 전부 살아있다.
부록 — 빠른 복습 체크리스트
- 관계 대수 6 기본 연산 + 추가 연산 (⋈, ∩, ←)
- SQL의 집합/멀티셋 의미론 차이 (
DISTINCT) - 3값 논리 (NULL의 전파 규칙)
- Outer join 3종의 NULL 채움 방향
- View updatability 조건 4가지
- Prepared Statement = 성능 + 보안
- Trigger = event + action
- Weak entity = 식별 의존 + 이중 사각형 + 이중 다이아몬드
- Cardinality: 구 표기(→/═) vs
l..h - FD closure , attribute closure
- Lossless 조건: 공통 속성이 한쪽 superkey
- BCNF: 모든 nontrivial FD의 LHS가 superkey
- 3NF: BCNF 완화 — prime attribute 허용
- BCNF decomp = lossless but not always dep-preserving
- 3NF decomp = lossless AND dep-preserving