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

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



답변

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

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

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

또한 자연 조인은 동등성 비교와 관련된 중복 열을 제거하므로 비교 된 각 열 중 하나만 남습니다. 대략적인 관계형 대수 용어로 :

⋈ = πR,S-as ○ ⋈aR=aS


답변

정확한 차이점을 설명하는 답변은 괜찮지 만 관계형 대수가 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 “데이터베이스 소개”를 완료 했으므로 감히 관계형 대수를 염두에두고 있습니다.


답변

@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 테이블 표현식도 아닙니다. 나는 그것을 결과 세트라고 부릅니다.


답변

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

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

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

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


답변

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 | 부서명 |
| | | |


답변

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

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

두 테이블의 동등 조인은 다른 테이블의 값과 일치하는 튜플 만 표시하도록합니다. 예를 들어 : 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이라고합니다.


답변

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

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

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