일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- googleapiclient
- kmu
- Regression
- Python
- Heap
- 국민대학교
- programmers
- Stack
- gan
- 스택
- 정렬
- PANDAS
- instaloader
- 머신 러닝
- python3
- 국민대
- Seq2Seq
- GIT
- SQL
- 운영체제
- OS
- db
- 프로그래머스
- machine learning
- 재귀
- 회귀
- LSTM
- 파이썬
- 데이터베이스
- C++
- Today
- Total
정리 노트
관계 데이터 연산 - 순수 관계 연산자 본문
이 포스트는 아래의 포스트의 내용과 이어집니다.
관계 데이터 연산 - 집합 연산자
이 포스트는 국민대학교 소프트웨어학부 '데이터베이스' 강의를 듣고 요약하는 포스트입니다. 원하시는 정보가 없을 수도 있습니다. 이 점 유의 바랍니다. 오류 지적은 매우 환영합니다! 테이블
study-note-99.tistory.com
순수 관계 연산자
순수 관계 연산자에 대해 설명할 때 아래의 기호들을 사용하겠습니다.
- R : 릴레이션(테이블), R(X), X = {
} R( ) - r : R의 tuple, r
R, r = < > : r의 속성 의 값, r. = r[ ] =
앞으로 이야기할 연산자들은 크게 2가지로 나눌 수 있습니다.
- 근원 연산: 다른 연산으로 표현할 수 없는 연산(ex. SELECT, PROJECT, 합집합, 차집합, cartesian product)
- 복합 연산: 근원 연산으로 표현할 수 있는 연산(ex. JOIN, DIVISION, 교집합)
SELECT( )
A, B가 릴레이션 R(X)의 속성들일 때, 조건식에 부합하는 R의 튜플 r의 집합이 select 연산의 결과입니다. 이를 식으로 적으면 아래와 같습니다.
위 식에서
예를 들어 학생이라는 테이블이 아래의 그림처럼 있을 때,

여기서 전체 tuple들에 대해 select 연산에 의해 선택된 tuple들의 비율을 선택도라 합니다. SELECT 연산도 대수 연산이므로 교환 법칙이 성립합니다.
PROJECT( )
릴레이션 R(X), X={
이를 식으로 적으면 아래와 같습니다.
예를 들어 학생이라는 테이블이 아래의 그림처럼 있을 때,

JOIN( )
Join 연산은 'cartesian product'에 기반한 복합 연산입니다. Cartesian product 연산에 대한 설명은 아래 글에서 참고 바랍니다.
곱집합(product set / Cartesian product ) | 과학문화포털 사이언스올
과학의 모든 것, 사이언스올! 과학학습, 과학체험, 과학문화 콘텐츠 제공
www.scienceall.com
Join 연산은 theta-join(세타 조인), equi-join(동일 조인), natural join(자연 조인) 세 가지가 있습니다. 흔히 join 연산을 얘기할 때 자연 조인을 의미합니다. 이 세 가지 연산에 대해 살펴봅시다.
Theta-join, Equi-join ( )
두 릴레이션 R(X), S(Y) (A
위에서 A와 B는 조인 속성,
여기서
Natural join( )
두 릴레이션 R(X), S(Y)의 조인 속성을 Z(X
위의 예시에서 natural join을 시행하면 아래와 같은 결과를 가집니다.

위 그림은 두 테이블을 '학과' 열을 기준으로 equi-join 한 결과와 동일합니다. 이는 두 테이블의 조인 속성이 '학과' 이기 때문에 일어난 우연입니다.
JOIN 연산의 구현
Join 연산을 프로그래밍 언어로 표현하자면, 이중 for문을 사용하는 연산입니다.
두 릴레이션 R, S를 join하려 할 때 아래의 pseudo code를 따라 진행됩니다.
(A는 R 릴레이션의 PK, S 릴레이션의 FK라는 가정)
(R을 driving table로 할 때,)
for each rR do
for each sS do
if r.A = s.A then print rs;
end;
end;
(S을 driving table로 할 때,)
for each sS do
for each rR do
if s.A = r.A then {
print rs;
break; (A는 R의 PK, 즉 unique한 값이므로 추가적으로 for문을 진행할 필요가 없음)
}
end;
end;
연산이 오래 걸리는 연산이기 때문에 driving table의 선택이 중요합니다.
DIVISION( )
두 릴레이션 R(X), S(Y)에 대해 Y
예를 들어 '등록' 테이블과 '과목 1' 테이블이 있을 때, '등록'

학번 100과 200은 과목 번호 'C312'와 'C413'을 등록하지 않았고, 학번 500은 'C312'만 만족하므로 divison 연산 결과에 포함되지 않습니다. 학번 300과 400에서 'C312'와 'C413'이 모두 등장하므로 두 학번이 division 연산 결과에 나오게 됩니다. X = {학번, 과목 번호}, Y ={과목 번호} 일 때, Z = X - Y = {학번}이므로 학번만 출력됩니다.
참고로 이 연산은 SQL에서 제공하지 않습니다.
작명 연산( )
지금까지의 4가지 연산 외에도 자주 쓰이는 연산입니다. 이 연산은 복잡한 관계 대수식에서 중간 결과 릴레이션에 이름을 붙이거나 그 릴레이션의 속성 이름을 변경할 때 사용합니다.
(E): 관계 대수식 E의 결과 릴레이션을 S라 부르고 저장 (E): 관계 대수식 E의 결과 릴레이션의 이름을 S라 하고, 속성 이름들을 로 수정해 저장
'개념 정리 > 데이터베이스' 카테고리의 다른 글
SELECT문 (2) | 2024.02.08 |
---|---|
관계 데이터 연산 - 확장된 관계 연산자 (0) | 2023.11.07 |
관계 데이터 연산 - 집합 연산자 (0) | 2023.09.13 |
관계 데이터 구조 (0) | 2023.08.10 |
논리적 데이터 모델링 (0) | 2023.07.24 |