세타 조인, 동등 조인 및 자연 조인의 차이점


92

세타 조인, 동등 조인 및 자연 조인과 관련하여 관계 대수를 이해하는 데 어려움을 겪고 있습니다. 누군가가 그것을 더 잘 이해하도록 도와 줄 수 있습니까? 세타 조인에서 = 기호를 사용하면 자연 조인을 사용하는 것과 정확히 동일합니까?


바운티에서 문제의 인용문을 되풀이하십시오 ... 그는 거기에서 Codd를 인용하는 것이 아니라 그의 주석이 아래에있는 내 대답에서 인용하고 있습니다.
heisenberg 2013 년

답변:


138

가입 세타 (예 ≥ 같은) 임의의 비교 관계를 허용한다.

동등 조인은 항등 연산자를 사용하여 가입 세타 A는.

가입 자연은 각 관계에서 같은 이름을 가진 속성에 동등 조인입니다.

또한 자연 조인은 동등성 비교와 관련된 중복 열을 제거하므로 비교 된 각 열 중 하나만 남습니다. 대략적인 관계형 대수 용어로 : ⋈ = πR,S-as ○ ⋈aR=aS


13
자연은 같은 이름의 열을 제거합니다 가입
보그 Gavril MSFT에게

2
전부 아니면 하나만 빼고요?
Christopher Shroba 2014 년

Equijoin은 두 테이블에 동일한 이름이있는 경우 동등 열도 제거합니다.
Vishal R

1
@outis, "theta join"의 "theta"는 무엇을 의미합니까?
Pacerier 2015

2
@Pacerier : 역사적으로 thetain theta 조인은 조인의 기준으로 사용되는 임의의 조건을 나타냅니다. (데이터베이스 시스템 : Garcia-Molina의 The Complete Book, Ullman, Widom, 2 장, Theta Join 참조)
Ram Rajamony 2017

55

정확한 차이점을 설명하는 답변은 괜찮지 만 관계형 대수가 SQL로 변환되는 방법과 3 개 개념의 실제 값이 무엇인지 보여주고 싶습니다.

질문의 핵심 개념은 조인 아이디어입니다. 조인을 이해하려면 데카르트 곱을 이해해야합니다 (이 예는 SQL을 기반으로하며 이에 상응하는 것을 onedaywhen 지적한대로 교차 조인이라고합니다).

이것은 실제로별로 유용하지 않습니다. 이 예를 고려하십시오.

Product(PName, Price)
====================
Laptop,   1500
Car,      20000
Airplane, 3000000


Component(PName, CName, Cost)
=============================
Laptop, CPU,    500
Laptop, hdd,    300
Laptop, case,   700
Car,    wheels, 1000

데카르트 곱 제품 x 구성 요소는 벨로우즈 또는 sql 바이올린 입니다. 12 개의 행 = 3 x 4가 있음을 알 수 있습니다. 분명히 "바퀴"가있는 "노트북"과 같은 행은 의미가 없습니다. 이것이 실제로 데카르트 곱이 거의 사용되지 않는 이유입니다.

|    PNAME |   PRICE |  CNAME | COST |
--------------------------------------
|   Laptop |    1500 |    CPU |  500 |
|   Laptop |    1500 |    hdd |  300 |
|   Laptop |    1500 |   case |  700 |
|   Laptop |    1500 | wheels | 1000 |
|      Car |   20000 |    CPU |  500 |
|      Car |   20000 |    hdd |  300 |
|      Car |   20000 |   case |  700 |
|      Car |   20000 | wheels | 1000 |
| Airplane | 3000000 |    CPU |  500 |
| Airplane | 3000000 |    hdd |  300 |
| Airplane | 3000000 |   case |  700 |
| Airplane | 3000000 | wheels | 1000 |

JOIN은 이러한 제품에 더 많은 가치를 추가하기 위해 여기에 있습니다. 우리가 정말로 원하는 것은 각 구성 요소가 제품에 속하기 때문에 관련 구성 요소와 제품을 "결합"하는 것입니다. 이를 수행하는 방법은 조인을 사용하는 것입니다.

Pname의 제품 JOIN 구성 요소

연관된 SQL 쿼리는 다음과 같습니다 ( 여기 에서 모든 예제를 사용할 수 있음 ).

SELECT *
FROM Product
JOIN Component
  ON Product.Pname = Component.Pname

결과 :

|  PNAME | PRICE |  CNAME | COST |
----------------------------------
| Laptop |  1500 |    CPU |  500 |
| Laptop |  1500 |    hdd |  300 |
| Laptop |  1500 |   case |  700 |
|    Car | 20000 | wheels | 1000 |

랩탑에는 3 개의 구성 요소가 있고, 자동차에는 1 개, 비행기에는 없음이 있으므로 결과에는 4 개의 행만 있습니다. 이것은 훨씬 더 유용합니다.

질문으로 돌아가서, 질문하는 모든 조인은 방금 보여준 JOIN의 변형입니다.

Natural Join = 조인 (ON 절)이 동일한 이름을 가진 모든 열에 만들어집니다. 다른 모든 조인과는 반대로 결과에서 중복 열을 제거합니다. 대부분의 DBMS (Microsoft의 SQL Server, Oracle의 MySQL 등과 같은 다양한 공급 업체에서 만든 데이터베이스 시스템)는이를 지원하는데도 신경 쓰지 않으며, 이는 나쁜 습관 일뿐입니다 (또는 일부러 구현하지 않기로 선택). 개발자가 와서 Product의 두 번째 열 이름을 Price에서 Cost로 변경한다고 상상해보십시오. 그런 다음 모든 자연 조인이 PName 및 Cost에서 수행되어 일치하는 숫자가 없으므로 행이 0 개가됩니다.

Theta Join = 조건 (SQL의 ON 절)을 지정할 수 있기 때문에 누구나 사용하는 일반적인 조인입니다. 예를 들어 처음 두 글자가 비슷하거나 가격이 다른 제품과 같이 원하는 거의 모든 조건에 가입 할 수 있습니다. 실제로는 드물게 발생합니다. 95 %의 경우 평등 조건으로 가입하게되며 다음과 같은 결과가 발생합니다.

Equi Join = 실제로 사용되는 가장 일반적인 것. 위의 예는 동등 조인입니다. 데이터베이스는 이러한 유형의 조인에 최적화되어 있습니다! 동등 조인의 반대는 동일하지 않은 조인입니다. 즉, "="이외의 조건으로 조인 할 때입니다. 데이터베이스는이를 위해 최적화되지 않았습니다! 둘 다 일반 세타 조인의 하위 집합입니다. 자연 조인도 세타 조인이지만 조건 (세타)은 암시 적입니다.

정보 출처 : 대학 + 공인 SQL Server 개발자 + 최근 스탠포드에서 MOO "데이터베이스 소개"를 완료 했으므로 감히 관계형 대수를 염두에두고 있습니다.


1
'직교 곱'이라는 용어를 다소 느슨하게 사용합니다. 관계 연산자 곱은 관계를 생성합니다 (모든 관계 연산자와 공통입니다!). CROSS JOINSQL 의 연산은 테이블 표현식 (열의 행)을 생성합니다. 집합 연산 데카르트 곱은 쌍 집합을 생성합니다.
onedaywhen

1
"데이터베이스"라는 말은 실제로 "개념"을 다룰 때 중요한 차이점 인 "DBMS"를 의미합니다.
onedaywhen

2
onedaywhen-모든 유용한 의견에 감사드립니다! 코드 리뷰처럼 느껴집니다 :). 데카르트 곱과 DBMS 문제를 수정했습니다. 자연 조인은 학문적 관심사 일 뿐이며 SQL Server와 같은 중요한 DBMS는이를 고의로 구현하지 않는다고 생각합니다. 조건을 추가하면 명시 적으로 코드 이해 및 유지 관리가 향상됩니다. 관련 질문 : stackoverflow.com/questions/4826613/natural-join-in-sql-server
Bogdan Gavril MSFT

1
@HLGEM : 비슷한 주장을 SELECT * FROM...할 수 있습니다. 그러나 그것은 언어로, 모든 SQL 구현에 있으며 자주 사용합니다 (그리고 당신도 그렇게 할 것입니다!) 힌트 모든 코드가 프로덕션 코드는 아닙니다.
onedaywhen

1
"자연스러운"조인 열의 실제 문제는 이름을 변경하는 것이 아니라 시스템의 모든 조인 된 테이블간에 충돌하지 않아야하는 새 이름을 추가하는 것입니다. "이름", "설명", ...과 같은 매우 일반적인 열을 사용합니다. "자연 조인"을 사용하면 조인되는 반면 말도 안되며 비즈니스 논리에 위배되며 오류가 발생합니다. 네, "자연 결합"은 위험합니다. (기본 / 외래) 키 열을 제외하고 고유 한 이름을 갖게되며 "이름 간격"을 잃게됩니다.
LoganMzz

14

@outis의 대답은 좋습니다. 관계에 대해 간결하고 정확합니다.

그러나 상황은 SQL과 관련하여 약간 더 복잡합니다.

일반적인 공급자 및 부품 데이터베이스를 고려 하지만 SQL로 구현됩니다.

SELECT * FROM S NATURAL JOIN SP;

열이있는 결과 집합 **을 반환합니다.

SNO, SNAME, STATUS, CITY, PNO, QTY

조인은 두 테이블에서 동일한 이름을 가진 열에 대해 수행됩니다 SNO. 결과 집합에는 6 개의 열이 있으며에 대한 열은 하나만 포함됩니다 SNO.

이제 조인에 대한 열 이름을 명시 적으로 지정해야하는 세타 eqijoin을 고려하십시오 (범위 변수 SSP필수).

SELECT * FROM S JOIN SP ON S.SNO = SP.SNO;

결과 집합에는에 대한 2 개의 열을 포함하여 7 개의 열이 SNO있습니다. 결과 집합의 이름은 SQL 표준에서 "구현에 따라 다름"이라고 부르는 이름이지만 다음과 같을 수 있습니다.

SNO, SNAME, STATUS, CITY, SNO, PNO, QTY

또는 아마도 이것은

S.SNO, SNAME, STATUS, CITY, SP.SNO, PNO, QTY

즉, NATURAL JOINSQL에서 결과 집합에서 중복 된 이름을 가진 열을 제거하는 것으로 간주 될 수있다 (- 당신이 변화에 기억해야하지만 슬프게도 중복 행을 제거하지 않습니다 SELECTSELECT DISTINCT자신).


** 결과가 무엇인지 잘 모르겠습니다 SELECT * FROM table_expression;. 다른 이유 중에서 이름이 중복되거나 이름이없는 열이있을 수 있기 때문에 관계가 아니라는 것을 알고 있습니다. 다른 이유 중에서도 열 순서가 중요하기 때문에 세트가 아니라는 것을 알고 있습니다. SQL 테이블이나 SQL 테이블 표현식도 아닙니다. 나는 그것을 결과 세트라고 부릅니다.


동일은 간다 JOIN ... USING(...).
Benoit

왜 말을합니까 "나는 확실히 어떤 결과를 모르는 SELECT * FROM table_expression;입니다" ?
Pacerier 2015-04-18

@Pacerier : 음, 나는 그것이 무엇인지 모르기 때문에! 지난번에 SQL 표준은 그것이 무엇인지 정의하는 것을 피했습니다. 나는 그것이 무엇인지 압니다 (관계가 아니라 집합이 아니라 테이블이 아니라 테이블 표현식). 그래서 쉽게 참조 할 수 있도록 'resultset'이라는 용어를 사용했습니다. 관계형 모델에서 두 관계를 포함하는 연산의 결과는 관계입니다. SQL AFAIK에 대해 동등한 명령문을 작성할 수 없습니다.
onedaywhen April

11

Natural은 Theta의 하위 집합 인 Equi의 하위 집합입니다.

세타 조인에 = 기호를 사용하면 자연 조인을 사용하는 것과 정확히 동일합니까 ???

반드시 그런 것은 아니지만 Equi 일 것입니다. Natural은 이름이 비슷한 모든 열에서 일치한다는 것을 의미하고 Equi는 '='만 독점적으로 사용하고 있음을 의미합니다 ( '보다 작음'등이 아님).

이것은 순수한 학계이지만 수년간 관계형 데이터베이스로 작업 할 수 있으며 누구도 이러한 용어를 사용하는 것을 듣지 못했습니다.


"관계형 데이터베이스"라고 말할 때 "SQL"과 같은 다른 것을 의미한다고 생각합니다.
onedaywhen

SQL이 아닌 관계형 데이터베이스를 사용하는 학계가 아닌 작업? 그렇다면 어떤 제품을 의미합니까?
onedaywhen

3
Codd의 원래 대수에서 자연 조인은 기본적인 조인 유형 인 반면 등가 또는 세타 "조인"은 NJ (예 : 교차 곱)에 대한 속기이며 제한이 뒤 따릅니다. "Natural은 Theta의 부분 집합 인 Equi의 부분 집합입니다." 이것이 의미하는 것은 모든 NJ가 EJ 또는 TJ로도 표현 될 수 있다는 것을 의미합니다. σ 1 = 1 (A x B)이 동등 조인으로 계산되면 사실이라고 생각합니다.이 경우 관계형 대수의 모든 연산은 해당 형식의 동등 조인으로 표현 될 수 있습니다. 여기서 모호한 점은 RA에 대해 하나 이상의 가능한 기본 연산자 집합이 있다는 것입니다.
nvogel

2
@EricFail : sqlvogel은 Codd의 어떤 것도 아닌 kekekela의 대답을 인용하고 있습니다. 조인 (θ 또는 기타)에 대한 Codd의 저작에 대해 더 알고 싶다면 "The Relational Model for Database Management"를 시도하거나 그의 참고 문헌을 통해 작업 할 수 있습니다.
outis

1
... 당신이 연결하는 질문은 당신이 찾고있는 것에 가까운 대답을 가지고있을 것입니다. 데이터베이스 하위 언어의 관계형 완전성에 연결됩니다 . P. 10은 θ, =와 자연 결합 사이의 연결을 설명합니다 (자연은 Codd의 공식에서 엄격하게 =의 하위 집합이 아니라 = 결합의 투영 임).
outis

7

Theta 조인 : 연산자 (예 : =, <,>,> = 등)를 사용하여 조인에 대한 쿼리를 만들면 해당 조인 쿼리가 Theta 조인 아래에 있습니다. 동등 조인

: 동등 연산자 만 사용하여 조인에 대한 쿼리를 만들면 해당 조인 쿼리가 동등 조인에 속합니다.

예:

> SELECT * FROM Emp JOIN Dept ON Emp.DeptID = Dept.DeptID;
> SELECT * FROM Emp INNER JOIN Dept USING (DeptID)
다음이 표시됩니다.
 _________________________________________________
| Emp.Name | Emp.DeptID | 부서명 | 부서 부서 ID |
| | | | |

참고 : Equi 조인도 세타 조인입니다!

Natural Join : 두 테이블의 모든 동일한 이름 열을 비교하여 암시 적으로 발생하는 Equi Join 유형입니다.

참고 : 여기에서 조인 결과에는 동일한 명명 된 열의 각 쌍에 대해 하나의 열만 있습니다.

 Emp NATURAL JOIN 부서에서 * 선택
다음이 표시됩니다.
 _______________________________
| DeptID | Emp.Name | 부서명 |
| | | |

1

두 테이블의 데카르트 곱은 수학 예제와 같이 가능한 모든 튜플 조합에 두 세트의 외적을 제공합니다. 여러 번 메모리에서 불필요한 공간을 차지하는 정크 값이 있기 때문에 여기에서 필요하고 의미있는 속성 값의 조합 만 제공하는 조인이 구출됩니다.

내부 조인은 테이블의 반복 된 필드를 두 번 제공하는 반면 자연 조인은 반복되는 열을 필터링하고 한 번만 표시하여 문제를 해결합니다. 그렇지 않으면 둘 다 동일하게 작동합니다. 자연 조인은 메모리를 보존하므로 더 효율적입니다. 또한 자연 조인에서는 중복이 제거됩니다.

두 테이블의 동등 조인은 다른 테이블의 값과 일치하는 튜플 만 표시하도록합니다. 예를 들어 : new1과 new2를 두 개의 테이블이되도록합니다. sql query select * from new1 join new2 on new1.id = new.id (id is the same column in two tables) then start from new2 table and join which match which the id in second table. 게다가 동등하지 않은 조인에는 <,> 및 between operator가있는 같음 연산자가 없습니다.

theta 조인은 같음 및 기타 <,> 비교 연산자를 포함한 모든 비교 연산자로 구성됩니다. equality (=) 연산자를 사용할 때 equi join이라고합니다.


0

자연 결합 : 두 관계에 공통 속성이 하나 이상있을 때 자연 결합이 가능합니다.

세타 조인 : 두 사람이 특정 조건에서 작동 할 때 세타 조인이 가능합니다.

Equi Join : Equi는 두 사람이 형평성 조건에서 행동 할 때 가능할 수 있습니다. 세타 조인의 한 유형입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.