본문으로 건너뛰기

관계대수: 집합 연산과 카티션 곱

정보처리기사 목차데이터베이스와 관계 모델레슨 80 / 233

목차

일반 집합 연산자는 릴레이션을 튜플의 집합으로 보고 합치거나 견주는 연산입니다. 합집합(∪)·교집합(∩)·차집합(−)은 두 릴레이션이 같은 꼴일 때만 할 수 있고, 카티션 곱(×)은 두 릴레이션의 튜플을 빠짐없이 짝지어 차수는 더하고 카디널리티는 곱합니다.

자료구조(DS)를 들은 학생 명단과 네트워크(NW)를 들은 학생 명단이 따로 있다고 해 봅시다. '둘 가운데 하나라도 들은 학생', '둘 다 들은 학생', '자료구조만 들은 학생'은 두 명단을 견줘야 답할 수 있습니다. 집합에서 쓰던 합집합·교집합·차집합을 릴레이션에 그대로 쓰면 됩니다. 다만 릴레이션은 속성이 여럿이라, 두 릴레이션이 같은 꼴이어야 견줄 수 있습니다. 여기에 카티션 곱 하나가 더 있습니다. 두 릴레이션의 튜플을 빠짐없이 짝지어 놓는 연산으로, 다음 단원에서 배우는 조인의 바탕입니다. 앞 레슨의 관계대수: 셀렉트·프로젝트·조인·디비전이 순수 관계 연산자라면, 이 넷은 집합에서 가져온 일반 집합 연산자입니다. 시험은 기호의 이름과 결과의 차수·카디널리티를 묻습니다.

8단계 중 1단계. 일반 집합 연산자는 릴레이션을 튜플의 집합으로 보고 합치거나 견줍니다.

1합병 가능

이 레슨은 수강에서 뽑은 두 릴레이션으로 봅니다. A는 자료구조를 들은 학번 π 학번 (σ 과목코드='DS' (수강))⁠이고 101·102·103·105 네 튜플입니다. B는 네트워크를 들은 학번이고 101·103·104·105·107 다섯 튜플입니다.

합집합·교집합·차집합은 두 릴레이션의 속성 수가 같고 짝지은 속성의 도메인이 같아야 할 수 있습니다. 이 조건을 합병 가능(union-compatible)이라고 합니다. A와 B는 속성이 학번 하나뿐이고 도메인도 같아 합병 가능합니다. 반대로 π 학번 (학생)과 π 과목코드 (과목)은 속성이 하나씩이지만 학번은 수, 과목코드는 글자라서 합병 가능하지 않습니다.

2합집합(∪)과 교집합(∩)

합집합은 두 릴레이션의 튜플을 모두 모으고, 겹치는 튜플은 하나만 남깁니다. A와 B에 모두 있는 101·103·105가 하나로 합쳐져 A ∪ B는 101·102·103·104·105·107 여섯 튜플입니다. 4 + 5 − 3 = 6으로 셉니다. 겹치는 튜플이 합쳐지므로 합집합의 카디널리티는 두 카디널리티의 합보다 작거나 같습니다.

교집합은 두 릴레이션에 모두 있는 튜플만 남깁니다. A ∩ B는 101·103·105 세 튜플입니다.

3차집합(−)

차집합은 앞 릴레이션에서 뒤 릴레이션에도 있는 튜플을 뺍니다. A − B는 A에만 있는 102 한 튜플입니다. 4 − 3 = 1로 셉니다.

차집합은 앞뒤를 바꾸면 결과가 달라집니다. B − A는 B에만 있는 104·107 두 튜플입니다. 합집합과 교집합은 앞뒤를 바꿔도 같습니다.

4카티션 곱(×)

카티션 곱은 앞 릴레이션의 튜플마다 뒤 릴레이션의 튜플을 하나씩 모두 이어 붙입니다. 학과명 셋(경영·전자·컴퓨터)과 과목명 셋(네트워크·운영체제·자료구조)을 곱하면 아홉 칸이 모두 채워집니다. 자료에 따라 교차곱이라고도 부릅니다.

카티션 곱의 차수는 두 차수의 합, 카디널리티는 두 카디널리티의 곱입니다. 학과명과 과목명은 속성이 하나씩이라 1 + 1 = 2열이고, 튜플은 3 × 3 = 9입니다. 속성을 줄이지 않고 학생(4열·7행)과 과목(4열·3행)을 곱하면 8열·21행이 됩니다. 카티션 곱은 두 릴레이션의 꼴을 견주지 않으므로 합병 가능할 필요가 없습니다.

예제

네 연산의 결과를 함께 늘어놓습니다. A는 자료구조를 들은 학번 101·102·103·105, B는 네트워크를 들은 학번 101·103·104·105·107입니다. 같은 두 명단을 SQL의 집합 연산자로 다시 쓰는 것은 14단원 집합 연산자에서 봅니다.

네 연산의 차수와 카디널리티

식결과차수카디널리티
A ∪ B101·102·103·104·105·10716
A ∩ B101·103·10513
A − B10211
B − A104·10712

합집합·교집합·차집합은 속성을 그대로 두고 튜플만 고르므로 차수가 1에서 바뀌지 않습니다. 카디널리티는 겹치는 튜플 셋(101·103·105)을 어떻게 세는지에 따라 갈립니다.

차집합은 앞뒤가 중요하다

그림에서 앞뒤를 바꿔 본 B − A입니다. SQL은 13단원부터 배우니, 여기서는 결과 표가 식의 결과와 같은지만 봐도 됩니다. 관계대수의 결과는 순서가 없는 집합이라서, 맞춰 보려고 SQL 끝에 ORDER BY를 붙였습니다.

SELECT 학번
FROM 수강
WHERE 과목코드 = 'NW'
EXCEPT
SELECT 학번
FROM 수강
WHERE 과목코드 = 'DS'
ORDER BY 학번;
학번
104
107

앞뒤를 바꾼 A − B는 102 하나입니다. 같은 두 릴레이션인데 결과가 다릅니다.

카티션 곱

관계대수: π 학과명 (학과) × π 과목명 (과목)

학과와 과목을 그대로 곱하면 속성이 일곱이라 화면을 넘칩니다. 프로젝트로 학과명과 과목명만 남긴 뒤 곱했습니다.

SELECT 학과명,
  과목명
FROM 학과
  CROSS JOIN 과목
ORDER BY 학과명, 과목명;
학과명과목명
경영네트워크
경영운영체제
경영자료구조
전자네트워크
전자운영체제
전자자료구조
컴퓨터네트워크
컴퓨터운영체제
컴퓨터자료구조

차수는 1 + 1 = 2, 카디널리티는 3 × 3 = 9입니다. 학과에 학생이 있는지, 과목을 누가 듣는지는 따지지 않습니다. 카티션 곱은 조건 없이 모든 짝을 만듭니다.

시험 포인트

  • 필기: 기호와 이름을 짝짓고 결과를 셉니다 — ∪ 합집합, ∩ 교집합, − 차집합, × 카티션 곱입니다. 합집합·교집합·차집합은 합병 가능해야 합니다. 두 릴레이션의 차수가 같고 짝지은 속성의 도메인이 같아야 한다는 뜻입니다. 이 셋은 결과의 차수가 그대로이고, 합집합의 카디널리티는 두 카디널리티의 합보다 작거나 같습니다. 차집합은 앞뒤를 바꾸면 결과가 달라집니다. 카티션 곱은 차수가 두 차수의 합, 카디널리티가 두 카디널리티의 곱이고 합병 가능할 필요가 없습니다.
  • 실기: 이름과 기호를 씁니다 — 합집합(Union, ∪)·교집합(Intersection, ∩)·차집합(Difference, −)·카티션 곱(Cartesian Product, ×). 차수와 카디널리티를 수로 씁니다.

확인 문제

1. 교집합(∩)을 할 수 있는 두 릴레이션의 짝을 고르세요.

  • ① π 학번 (학생)과 π 과목코드 (과목)
  • ② π 학번 (학생)과 π 학번 (수강)
  • ③ π 학번, 이름 (학생)과 π 학번 (수강)
  • ④ 학과와 과목
정답

②입니다. 속성이 학번 하나씩이고 도메인도 같아 합병 가능합니다. 교집합의 결과는 수강이 있는 학번 여섯(101·102·103·104·105·107)이고, 수강이 없는 106은 빠집니다.

  • ① 속성 수는 같지만 학번은 수, 과목코드는 글자라서 도메인이 다릅니다.
  • ③ 속성 수가 2와 1로 다릅니다. 속성 수부터 같아야 합니다.
  • ④ 학과는 3열, 과목은 4열이라 속성 수가 다릅니다. 카티션 곱은 할 수 있습니다.

2. 학생 표에서 1학년 학번만 모은 릴레이션과 3학년 학번만 모은 릴레이션을 만들었습니다. 두 릴레이션에 연산 하나씩을 걸어 다음 결과를 얻었습니다. (가)~(라)에 쓴 연산의 이름과 기호를 한글 이름과 영문, 기호로 함께 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

  • (가) 결과가 0튜플입니다.
  • (나) 결과가 5튜플이고, 앞뒤를 바꿔도 같습니다.
  • (다) 앞뒤를 바꾸면 결과가 2튜플에서 3튜플로 바뀝니다.
  • (라) 두 릴레이션의 꼴이 달라도 할 수 있고, 2튜플과 3튜플을 걸면 결과가 6튜플입니다.
정답

받는 답: (가) 교집합(Intersection, ∩) · (나) 합집합(Union, ∪) · (다) 차집합(Difference, −) · (라) 카티션 곱(Cartesian Product, ×) 또는 교차곱(Cartesian Product, ×)

1학년은 104·107 두 튜플, 3학년은 101·105·106 세 튜플이고 겹치는 튜플이 없습니다. 그래서 (가)는 0, (나)는 2 + 3 = 5입니다. (다)의 실마리는 '앞뒤를 바꾸면 달라진다', (라)는 '꼴이 달라도 되고 튜플을 모두 짝짓는다'입니다.

  • 같은 이름의 다른 꼴: 기호만 쓴 꼴이나 이름만 쓴 꼴 — 문제가 이름과 기호를 함께 쓰라고 했습니다.
  • 틀리는 꼴 합집합 — (다)에: 앞뒤를 바꿔도 결과가 같습니다. 2튜플과 3튜플로 갈리는 쪽은 차집합입니다.
  • 틀리는 꼴 카티션 곱 — (가)에: 두 릴레이션의 튜플을 모두 짝지어 2 × 3 = 6튜플이 됩니다. 0튜플이 되는 일은 한쪽이 비었을 때뿐입니다.

3. 학생 표(4열·7행)와 학과 표(3열·3행)로 카티션 곱 학생 × 학과를 구했습니다. 학생의 학과코드는 CS가 셋(101·102·103), EE가 셋(104·105·106), NULL이 하나(107)이고, 학과의 학과코드는 CS·EE·BA 셋입니다. 다음에 답하세요.

  • (가) 결과의 차수와 카디널리티
  • (나) 그 결과에서 학생의 학과코드와 학과의 학과코드가 같은 튜플만 남기면 몇 튜플인가
정답

(가) 차수 7 · 카디널리티 21 · (나) 6튜플입니다.

  • (가) 속성은 4 + 3 = 7개로 이어 붙고, 튜플은 7 × 3 = 21개로 늘어납니다. 차수를 곱해 12로 답하는 실수가 많습니다.
  • (나) 21개 가운데 학과코드가 맞는 짝만 남습니다. 학과가 NULL인 107은 어느 학과와도 같지 않아 빠지고, 학생이 없는 BA는 짝지을 학생이 없습니다.
  • 이렇게 카티션 곱에 조건을 걸어 고르면 조인(⋈)과 같은 결과입니다. 결과의 학과코드는 양쪽에서 와 두 번 나옵니다.

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

정보처리기사 목차로