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. HAVINGGROUP BY 후 평가되므로 집계함수 사용 가능.


Q12. “다른 어떤 교수보다도 급여가 높은 교수”를 all 서브쿼리로 구하라.

정답:

SELECT name
FROM instructor
WHERE salary >= ALL (SELECT salary FROM instructor);

해설: >= ALL은 “모든 값보다 크거나 같다” = 최댓값. 동률이 있으면 여러 명 리턴. > 쓰면 유일 최댓값만. max() 집계로도 동치 표현 가능.


Q13. existsin은 언제 서로 다른 결과를 낼 수 있는가? 특히 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 기준):

  1. from 절에 단 하나의 데이터베이스 릴레이션만 있을 것.
  2. select 절이 릴레이션의 속성만 가질 것 (표현식·집계·DISTINCT 없음).
  3. select에 없는 속성은 NULL 허용이어야 함 (insert 시 채울 수 없으므로).
  4. 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보다 나은 이유 두 가지를 쓰시오.

정답:

  1. 성능: SQL 파싱/플래닝을 한 번만 하고 파라미터만 바꿔 재실행 → 루프 반복에서 빠름.
  2. 보안: 파라미터가 문자열 치환이 아닌 값 바인딩으로 들어가므로 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 설계 시 반드시 지정해야 하는 두 요소는?

정답:

  1. Triggering event — 어떤 이벤트에 반응 (INSERT/UPDATE/DELETE), timing (BEFORE/AFTER), 단위 (ROW/STATEMENT).
  2. 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단계 통신 모델을 순서대로 쓰시오.

정답:

  1. Connection 수립 (DriverManager.getConnection)
  2. Statement 생성 (createStatement / prepareStatement)
  3. 실행 및 결과 처리 (executeQuery / executeUpdate, ResultSet 순회)
  4. 자원 해제 (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 relationship sec_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. 에서 일 때 를 계산하라.

정답:

  1. 초기 .
  2. 적용 → .
  3. 적용 → .
  4. 더 이상 추가 불가.

.

해설: 는 도출 불가 → 의 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 ()가 다음 중 하나를 만족:

  1. 가 superkey, 또는
  2. 가 trivial, 또는
  3. 의 각 속성이 어떤 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