관계 대수: Difference between revisions
(관계대수에 대한 넘겨주기를 제거함) Tag: Removed redirect |
No edit summary |
||
(3 intermediate revisions by the same user not shown) | |||
Line 11: | Line 11: | ||
* 기본적으로 관계해석과 관계대수는 관계 데이터베이스를 처리하는 기능과 능력 면에서 동일하다. | * 기본적으로 관계해석과 관계대수는 관계 데이터베이스를 처리하는 기능과 능력 면에서 동일하다. | ||
== 순수 관계 연산자 == | == 요약 == | ||
=== 순수 관계 연산자 === | |||
{| class="wikitable" | {| class="wikitable" | ||
! 연산자 | ! 연산자 | ||
Line 44: | Line 46: | ||
|} | |} | ||
== 일반 집합 연산자 == | === 일반 집합 연산자 === | ||
{| class="wikitable" | {| class="wikitable" | ||
! 연산자 | ! 연산자 | ||
Line 70: | Line 72: | ||
| <nowiki>R×S = {rs|r∈R∧s∈S}</nowiki> | | <nowiki>R×S = {rs|r∈R∧s∈S}</nowiki> | ||
| <nowiki>|R×S|=|R|×|S|</nowiki> | | <nowiki>|R×S|=|R|×|S|</nowiki> | ||
|} | |||
== 설명 == | |||
=== DIVISION === | |||
DIVISION, 즉 DIVIDE 연산은 관계 대수(Relational Algebra)에서 특정 조건을 만족하는 '''모든''' 값을 가지는 튜플을 찾는 데 사용되는 연산이다. 특히, 이 연산은 "A가 B의 모든 조건을 만족하는가?"와 같은 상황을 처리하는 데 유용하다. 예를 들어, '''모든 과목을 들은 학생'''이나 '''모든 상품을 구매한 고객'''을 찾는 문제에서 사용할 수 있다. | |||
'''Divide 연산의 기본 개념''' | |||
* '''R ÷ S'''는 R의 속성 중 S의 속성들과 일치하는 속성들을 기준으로 나눈다는 의미이다. | |||
* '''R'''은 피제수(dividend)라고 하며, 이 관계는 전체 데이터가 포함되어 있다. | |||
* '''S'''는 제수(divisor)라고 하며, 이 관계는 조건을 나타낸다. | |||
* <code>R ÷ S</code>의 결과는 '''S에 있는 모든 값과 일치하는 R의 튜플'''들을 반환한다. | |||
'''예시''' | |||
* '''R(학생 이름, 과목)''': 학생이 수강한 과목 정보 릴레이션 | |||
* '''S(과목)''': 특정 과목들의 릴레이션 (예: {과목: 수학, 과학}) | |||
* 우리는 '''S에 있는 모든 과목을 들은 학생들'''을 찾고자 한다. | |||
{| class="wikitable" | |||
!R | |||
!DIVIDED-BY | |||
!S | |||
!R÷S | |||
|- | |||
| | |||
{| class="wikitable" | |||
!학생 이름 | |||
!과목 | |||
|- | |||
|Alice | |||
|수학 | |||
|- | |||
|Alice | |||
|영어 | |||
|- | |||
|Bob | |||
|수학 | |||
|- | |||
|Bob | |||
|과학 | |||
|- | |||
|Charlie | |||
|수학 | |||
|- | |||
|Charlie | |||
|영어 | |||
|- | |||
|Charlie | |||
|과학 | |||
|} | |||
|÷ | |||
| | |||
{| class="wikitable" | |||
!과목 | |||
|- | |||
|수학 | |||
|- | |||
|영어 | |||
|} | |||
| | |||
{| class="wikitable" | |||
!학생 이름 | |||
|- | |||
|Alice | |||
|- | |||
|Charlie | |||
|} | |||
|} | |||
=== 집계 및 그룹 함수 === | |||
'''Aggregate Functions and Grouping''' | |||
원래 그룹핑과 집계는 관계 대수에서 지원되지 않는다. 하지만 DB에서 흔하게 사용되는 SUM, AVERAGE, MAXIMUM, MINIMUM, COUNT 등을 표현하기 위해 후대에 생겨났다. 표현법은 아래와 같다. | |||
<sub><그루핑 속성></sub> ℑ <sub><집계 함수></sub> (R) | |||
예를 들어 SUM과 COUNT를 표현하려면 아래와 같이 할 수 있다.<blockquote>SELECT SUM(RECORD) FROM EMP_PERFORM GROUP BY SSN -- 사람으로 묶여서 RECORD의 합을 구한다 | |||
<sub>SSN</sub> ℑ <sub>SUM RECORD</sub> (EMP_PERFORM)</blockquote><blockquote>SELECT COUNT(RECORD_NO) FROM EMP_PERFORM -- 특정 그룹핑 기준이 없을 경우 | |||
ℑ <sub>COUNT RECORD_NO</sub> (EMP_PERFORM)</blockquote>현대 SQL에서의 GROUP BY와 같이 집계 결과와, 집계 기준이 되는 속성만 SELECT를 할 수 있다. 집계된 결과들은 그 자체로 속성 명이 없기 때문에 별도로 부여할 수 있다. 새롭게 정의하는 속성명으로 구성된 집합을 만드는 것이다.<blockquote>ρ<sub>R(Dno, No_of_employees, Average_sal)</sub> (<sub>Dno</sub> ℑ <sub>COUNT Ssn, AVERAGE Salary</sub> (EMPLOYEE))</blockquote> | |||
== 예시 == | |||
아래 두 릴레이션을 사용하여 몇 가지 관계 대수 연산의 예를 살펴본다. | |||
'''1. EMPLOYEE 테이블''' | |||
{| class="wikitable" | |||
!Ssn | |||
!Name | |||
!Age | |||
!Dept_no | |||
|- | |||
|123-45-6789 | |||
|Alice | |||
|30 | |||
|1 | |||
|- | |||
|234-56-7890 | |||
|Bob | |||
|40 | |||
|2 | |||
|- | |||
|345-67-8901 | |||
|Charlie | |||
|35 | |||
|1 | |||
|- | |||
|456-78-9012 | |||
|David | |||
|28 | |||
|3 | |||
|- | |||
|567-89-0123 | |||
|Eva | |||
|50 | |||
|2 | |||
|} | |||
'''2. DEPARTMENT 테이블''' | |||
{| class="wikitable" | |||
!Dept_no | |||
!Dept_name | |||
|- | |||
|1 | |||
|HR | |||
|- | |||
|2 | |||
|IT | |||
|- | |||
|3 | |||
|Finance | |||
|} | |||
----'''예시 1: 선택 조건 (Selection)''' | |||
'''조건''': 나이가 30세 이상인 직원의 정보를 선택한다. | |||
'''관계 대수''':<blockquote>σ<sub>(Age ≥ 30)</sub>(EMPLOYEE)</blockquote>'''결과''': | |||
{| class="wikitable" | |||
!Ssn | |||
!Name | |||
!Age | |||
!Dept_no | |||
|- | |||
|123-45-6789 | |||
|Alice | |||
|30 | |||
|1 | |||
|- | |||
|234-56-7890 | |||
|Bob | |||
|40 | |||
|2 | |||
|- | |||
|345-67-8901 | |||
|Charlie | |||
|35 | |||
|1 | |||
|- | |||
|567-89-0123 | |||
|Eva | |||
|50 | |||
|2 | |||
|} | |||
----'''예시 2: 속성 선택 (Projection)''' | |||
* '''쿼리''': 직원의 이름과 나이만 선택한다. | |||
* '''관계 대수''':<blockquote>π<sub>(Name, Age)</sub>(EMPLOYEE)</blockquote> | |||
* '''결과''': | |||
{| class="wikitable" | |||
!Name | |||
!Age | |||
|- | |||
|Alice | |||
|30 | |||
|- | |||
|Bob | |||
|40 | |||
|- | |||
|Charlie | |||
|35 | |||
|- | |||
|David | |||
|28 | |||
|- | |||
|Eva | |||
|50 | |||
|} | |||
----'''예시 3: 선택 조건과 선택 속성 (Selection and Projection)''' | |||
* '''쿼리:''' 나이가 40세 이상인 직원의 이름만 선택한다. | |||
** 조건을 먼저 정하고 선택된 결과 중 속성을 선택하는 것이 일반적이다. | |||
* '''관계 대수''':<blockquote>π<sub>(Name, Age)</sub>(σ<sub>(Age ≥ 40)</sub>(EMPLOYEE))</blockquote> | |||
* '''결과''': | |||
{| class="wikitable" | |||
!Name | |||
|- | |||
|Bob | |||
|- | |||
|Eva | |||
|} | |||
----'''예시 3: 조인 (Join)''' | |||
* '''쿼리''': 각 직원의 이름과 소속 부서 이름을 함께 출력한다. | |||
* '''관계 대수''':<blockquote>EMPLOYEE ⨝ <sub>(EMPLOYEE.Dept_no = DEPARTMENT.Dept_no)</sub> DEPARTMENT</blockquote> | |||
* '''결과''': | |||
{| class="wikitable" | |||
!Ssn | |||
!Name | |||
!Age | |||
!Dept_no | |||
!Dept_name | |||
|- | |||
|123-45-6789 | |||
|Alice | |||
|30 | |||
|1 | |||
|HR | |||
|- | |||
|234-56-7890 | |||
|Bob | |||
|40 | |||
|2 | |||
|IT | |||
|- | |||
|345-67-8901 | |||
|Charlie | |||
|35 | |||
|1 | |||
|HR | |||
|- | |||
|456-78-9012 | |||
|David | |||
|28 | |||
|3 | |||
|Finance | |||
|- | |||
|567-89-0123 | |||
|Eva | |||
|50 | |||
|2 | |||
|IT | |||
|} | |} | ||
Latest revision as of 04:59, 18 October 2024
분류:데이터베이스분류:정보처리기사 Relational Algebra
관계 대수는 관계형 데이터베이스에서 데이터를 조회하고 조작하기 위한 수학적 언어를 말한다. 관계 대수는 테이블(관계)에 대한 여러 가지 연산을 정의하며, 이러한 연산을 통해 데이터를 필터링하고 조합할 수 있다.
개요[edit | edit source]
- 릴레이션 조작을 위한 연산의 집합으로 피연산자와 결과가 모두 릴레이션이다.
- 일반 집합 연산과 순수 관계 연산으로 구분된다.
- 질의에 대한 해를 구하기 위해 수행해야 할 연산의 순서를 명시한다.
- 원하는 정보와 그 정보를 어떻게 유도하는가를 기술하는 절차적 특징을 가지고 있다.
- 기본적으로 관계해석과 관계대수는 관계 데이터베이스를 처리하는 기능과 능력 면에서 동일하다.
요약[edit | edit source]
순수 관계 연산자[edit | edit source]
연산자 | 기호 | 표기법 | 설명 | 예시 |
---|---|---|---|---|
SELECT | δ(시그마) | δ<조건>(R) | 선택 조건, 열 조회 | δDNO=4(EMP) |
PROJECT | π(파이) | π<리스트>(R) | 속성 선택, 행 조회 | πDNO,NAME(EMP) |
JOIN | ⋈(보타이) | R⋈<조건>S | 두 릴레이션 결합 | DEPT⋈dssn=essn EMP |
DIVISION | ÷(나누기) | R÷S | R 중 S 기준 교집합 | EMP÷DEPT |
일반 집합 연산자[edit | edit source]
연산자 | 표기법 | 집합 표현 | 카디널리티 |
---|---|---|---|
합집합 | ∪ | R∪S = {t|t∈R∨t∈S} | |R∪S|≤|R|+|S| |
교집합 | ∩ | R∩S = {t|t∈R∧t∈S} | |R∩S|≤MIN(|R|,|S|) |
차집합 | - | R-S = {t|t∈R∧t∉S} | |R-S|≤|R| |
교차곱(=카티션 프로덕트, 크로스 조인) | × | R×S = {rs|r∈R∧s∈S} | |R×S|=|R|×|S| |
설명[edit | edit source]
DIVISION[edit | edit source]
DIVISION, 즉 DIVIDE 연산은 관계 대수(Relational Algebra)에서 특정 조건을 만족하는 모든 값을 가지는 튜플을 찾는 데 사용되는 연산이다. 특히, 이 연산은 "A가 B의 모든 조건을 만족하는가?"와 같은 상황을 처리하는 데 유용하다. 예를 들어, 모든 과목을 들은 학생이나 모든 상품을 구매한 고객을 찾는 문제에서 사용할 수 있다.
Divide 연산의 기본 개념
- R ÷ S는 R의 속성 중 S의 속성들과 일치하는 속성들을 기준으로 나눈다는 의미이다.
- R은 피제수(dividend)라고 하며, 이 관계는 전체 데이터가 포함되어 있다.
- S는 제수(divisor)라고 하며, 이 관계는 조건을 나타낸다.
R ÷ S
의 결과는 S에 있는 모든 값과 일치하는 R의 튜플들을 반환한다.
예시
- R(학생 이름, 과목): 학생이 수강한 과목 정보 릴레이션
- S(과목): 특정 과목들의 릴레이션 (예: {과목: 수학, 과학})
- 우리는 S에 있는 모든 과목을 들은 학생들을 찾고자 한다.
R | DIVIDED-BY | S | R÷S | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
÷ |
|
|
집계 및 그룹 함수[edit | edit source]
Aggregate Functions and Grouping
원래 그룹핑과 집계는 관계 대수에서 지원되지 않는다. 하지만 DB에서 흔하게 사용되는 SUM, AVERAGE, MAXIMUM, MINIMUM, COUNT 등을 표현하기 위해 후대에 생겨났다. 표현법은 아래와 같다.
<그루핑 속성> ℑ <집계 함수> (R)
예를 들어 SUM과 COUNT를 표현하려면 아래와 같이 할 수 있다.
SELECT SUM(RECORD) FROM EMP_PERFORM GROUP BY SSN -- 사람으로 묶여서 RECORD의 합을 구한다 SSN ℑ SUM RECORD (EMP_PERFORM)
SELECT COUNT(RECORD_NO) FROM EMP_PERFORM -- 특정 그룹핑 기준이 없을 경우 ℑ COUNT RECORD_NO (EMP_PERFORM)
현대 SQL에서의 GROUP BY와 같이 집계 결과와, 집계 기준이 되는 속성만 SELECT를 할 수 있다. 집계된 결과들은 그 자체로 속성 명이 없기 때문에 별도로 부여할 수 있다. 새롭게 정의하는 속성명으로 구성된 집합을 만드는 것이다.
ρR(Dno, No_of_employees, Average_sal) (Dno ℑ COUNT Ssn, AVERAGE Salary (EMPLOYEE))
예시[edit | edit source]
아래 두 릴레이션을 사용하여 몇 가지 관계 대수 연산의 예를 살펴본다.
1. EMPLOYEE 테이블
Ssn | Name | Age | Dept_no |
---|---|---|---|
123-45-6789 | Alice | 30 | 1 |
234-56-7890 | Bob | 40 | 2 |
345-67-8901 | Charlie | 35 | 1 |
456-78-9012 | David | 28 | 3 |
567-89-0123 | Eva | 50 | 2 |
2. DEPARTMENT 테이블
Dept_no | Dept_name |
---|---|
1 | HR |
2 | IT |
3 | Finance |
예시 1: 선택 조건 (Selection)
조건: 나이가 30세 이상인 직원의 정보를 선택한다.
관계 대수:
σ(Age ≥ 30)(EMPLOYEE)
결과:
Ssn | Name | Age | Dept_no |
---|---|---|---|
123-45-6789 | Alice | 30 | 1 |
234-56-7890 | Bob | 40 | 2 |
345-67-8901 | Charlie | 35 | 1 |
567-89-0123 | Eva | 50 | 2 |
예시 2: 속성 선택 (Projection)
- 쿼리: 직원의 이름과 나이만 선택한다.
- 관계 대수:
π(Name, Age)(EMPLOYEE)
- 결과:
Name | Age |
---|---|
Alice | 30 |
Bob | 40 |
Charlie | 35 |
David | 28 |
Eva | 50 |
예시 3: 선택 조건과 선택 속성 (Selection and Projection)
- 쿼리: 나이가 40세 이상인 직원의 이름만 선택한다.
- 조건을 먼저 정하고 선택된 결과 중 속성을 선택하는 것이 일반적이다.
- 관계 대수:
π(Name, Age)(σ(Age ≥ 40)(EMPLOYEE))
- 결과:
Name |
---|
Bob |
Eva |
예시 3: 조인 (Join)
- 쿼리: 각 직원의 이름과 소속 부서 이름을 함께 출력한다.
- 관계 대수:
EMPLOYEE ⨝ (EMPLOYEE.Dept_no = DEPARTMENT.Dept_no) DEPARTMENT
- 결과:
Ssn | Name | Age | Dept_no | Dept_name |
---|---|---|---|---|
123-45-6789 | Alice | 30 | 1 | HR |
234-56-7890 | Bob | 40 | 2 | IT |
345-67-8901 | Charlie | 35 | 1 | HR |
456-78-9012 | David | 28 | 3 | Finance |
567-89-0123 | Eva | 50 | 2 | IT |