태그 보관물: outer-join

outer-join

“INNER JOIN”과 “OUTER JOIN”의 차이점은 무엇입니까? чем различия между INNER JOIN и OUTER

또한 수행하는 방법 LEFT JOIN, RIGHT JOIN그리고 FULL JOIN에 적합?



답변

중복이없는 열을 결합한다고 가정하면 매우 일반적인 경우입니다.

  • A와 B의 내부 결합은 A가 B를 교차 한 결과, 즉 벤 다이어그램 교차 의 내부 부분을 제공 합니다.

  • A와 B의 외부 결합은 A 결합 B의 결과, 즉 벤 다이어그램 결합의 외부 부분을 제공합니다.

각각 단일 열이있는 두 개의 테이블과 다음과 같은 데이터가 있다고 가정합니다.

A    B
-    -
1    3
2    4
3    5
4    6

(1,2)는 A에 고유하고 (3,4)는 공통이며 (5,6)은 B에 고유합니다.

내부 가입

동등한 쿼리 중 하나를 사용하는 내부 조인은 두 테이블, 즉 공통된 두 행의 교차를 제공합니다.

select * from a INNER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b;

a | b
--+--
3 | 3
4 | 4

왼쪽 외부 조인

왼쪽 외부 조인은 A의 모든 행과 B의 모든 공통 행을 제공합니다.

select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b(+);

a |  b
--+-----
1 | null
2 | null
3 |    3
4 |    4

오른쪽 외부 조인

오른쪽 외부 조인은 B의 모든 행과 A의 공통 행을 제공합니다.

select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a(+) = b.b;

a    |  b
-----+----
3    |  3
4    |  4
null |  5
null |  6

완전 외부 조인

완전 외부 조인은 A와 B, 즉 A의 모든 행과 B의 모든 행을 결합합니다. A의 항목에 B에 해당 데이텀이없는 경우 B 부분은 null입니다. 반대로.

select * from a FULL OUTER JOIN b on a.a = b.b;

 a   |  b
-----+-----
   1 | null
   2 | null
   3 |    3
   4 |    4
null |    6
null |    5


답변

벤 다이어그램은 실제로 나를 위해하지 않습니다.

예를 들어, 크로스 조인과 내부 조인 간의 차이를 나타내지 않거나보다 일반적으로 다른 유형의 조인 술어 간의 차이를 나타내거나 작동 방식에 대한 추론을위한 프레임 워크를 제공합니다.

논리적 처리를 이해하는 대용은 없으며 어쨌든 파악하는 것이 비교적 간단합니다.

  1. 크로스 조인을 상상해보십시오.
  2. on술어가 평가되는 행을 유지하면서 1 단계의 모든 행에 대해 절을 평가하십시오.true
  3. (외부 조인에만 해당) 2 단계에서 손실 된 외부 행을 다시 추가하십시오.

(NB : 실제로 쿼리 최적화 프로그램은 위의 논리적 설명보다 더 효율적인 쿼리 실행 방법을 찾을 수 있지만 최종 결과는 동일해야합니다)

전체 외부 조인 의 애니메이션 버전부터 시작하겠습니다 . 자세한 설명은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오


설명

소스 테이블

여기에 링크 설명을 입력하십시오

먼저 CROSS JOIN(AKA 직교 곱)으로 시작하십시오. 여기에는 ON절이 없으며 단순히 두 테이블에서 모든 행 조합을 반환합니다.

A. 컬러, B. 컬러에서 선택

여기에 링크 설명을 입력하십시오

내부 및 외부 조인에는 “ON”절 조건자가 있습니다.

  • 내부 가입. 교차 결합 결과의 모든 행에 대해 “ON”절의 조건을 평가하십시오. 참이면 결합 된 행을 반환합니다. 그렇지 않으면 버립니다.
  • 왼쪽 외부 조인. 왼쪽 테이블에서 오른쪽 테이블 열에 대해 NULL 값을 가진 출력과 일치하는 행에 대해 내부 조인과 동일합니다.
  • 오른쪽 외부 조인. 오른쪽 테이블의 모든 행에 대해 내부 조인과 동일하지만 왼쪽 테이블 열의 NULL 값이 출력과 일치하지 않습니다.
  • 완전 외부 조인. 내부 조인과 동일하며 왼쪽 외부 조인에서와 같이 왼쪽 일치하지 않는 행을 유지하고 오른쪽 외부 조 인당 오른쪽 일치하지 않는 행을 유지합니다.

몇 가지 예

A. 컬러, B. 컬러 A의 내부 참여 B에서 A. 컬러 = B. 컬러

위는 클래식 동등 조인입니다.

내부 조인

애니메이션 버전

여기에 이미지 설명을 입력하십시오

A.Colour, B.A. 내부의 B에서 A. B. A.COLour NOT IN ( ‘Green’, ‘Blue’)

내부 조인 조건은 반드시 동등 조건 일 필요는 없으며 두 테이블 (또는 둘 다)의 열을 참조 할 필요는 없습니다. A.Colour NOT IN ('Green','Blue')교차 결합 리턴의 각 행에서 평가 합니다.

내부 2

내부 이너 조인 B에서 1 ​​= 1의 A. 컬러, B. 컬러를 선택하십시오.

교차 조인 결과의 모든 행에 대해 조인 조건이 true로 평가되므로 교차 조인과 동일합니다. 나는 16 행의 그림을 다시 반복하지 않을 것이다.

A. 컬러, B. 컬러 A 왼쪽 바깥 쪽 참여 B에서 A. 컬러 = B. 컬러

외부 조인은 왼쪽 테이블의 행 (왼쪽 조인의 경우)이 오른쪽 테이블의 행과 전혀 조인되지 않는 경우 결과에 NULL값 이 유지되는 것을 제외하고 내부 조인과 동일한 방식으로 논리적으로 평가됩니다 . 오른쪽 열.

LOJ

A. 컬러, B. 컬러 A 왼쪽 외부 조인 B에서 A. 컬러 = B. 컬러 B. 컬러가 NULL 인 경우

이것은 단순히 이전 결과를 where 행만 반환하도록 제한합니다 B.Colour IS NULL. 이 경우 오른쪽 테이블에서 일치하지 않았으므로 보존 된 행이되고 쿼리는 테이블에서 일치하지 않는 단일 빨간색 행을 반환합니다 B. 이것을 반 세미 조인이라고합니다.

이 패턴이 올바르게 작동하고 값 이있는 행을 다시 가져 오지 않도록하기 위해 IS NULL널 입력 가능하지 않거나 결합 조건이 NULL값이 제외 되도록 보장 하기 위해 열을 선택하는 것이 중요 NULL합니다. 일치하지 않는 행 외에도 열.

loj가 null

A. 컬러, B. 컬러 오른쪽 외부에서 참여 A. 컬러 = B. 컬러

오른쪽 외부 조인은 오른쪽 테이블에서 일치하지 않는 행을 유지하고 왼쪽 열을 널 확장한다는 점을 제외하고 왼쪽 외부 조인과 유사하게 작동합니다.

ROJ

A.Colour = B.Colour에서 A.Colour, B.Colour를 선택하십시오.

완전 외부 조인은 왼쪽 및 오른쪽 조인의 동작을 결합하고 왼쪽 및 오른쪽 테이블 모두에서 일치하지 않는 행을 보존합니다.

FOJ

A. 컬러, B. 컬러 전체 외부 조인 B에서 1 ​​= 0

교차 결합의 행이 1=0술어 와 일치하지 않습니다 . 양쪽의 모든 행은 반대쪽 테이블의 열에 NULL이있는 일반 외부 조인 규칙을 사용하여 유지됩니다.

FOJ 2

전체 외부에서 색상으로 색상 선택 (A.Colour, B.Colour) 1 = 0

앞의 쿼리를 약간 수정 UNION ALL하면 두 테이블 중 하나를 시뮬레이션 할 수 있습니다.

UNION ALL

A. 컬러, B. 컬러 A 왼쪽 외부에서 B. A. 컬러 = B. 컬러 어디서 B. 컬러 = ‘녹색’

참고는 것을 WHERE절 (있는 경우) 논리적으로 가입 한 후 실행합니다. 하나의 일반적인 오류는 왼쪽 외부 조인을 수행 한 다음 일치하지 않는 행을 제외시키는 오른쪽 테이블에 조건이있는 WHERE 절을 포함시키는 것입니다. 위의 결과는 외부 조인을 수행합니다.

LOJ

… 그리고 “Where”절이 실행됩니다. NULL= 'Green'외부 조인에 의해 보존 된 행은 (파란색과 함께) 폐기되어 결국 내부 조인으로 효과적으로 변환됩니다.

LOJtoInner

의도가 색상이 녹색 인 B의 행만 포함하고 올바른 구문에 관계없이 A의 모든 행을 포함하려는 경우

A. 컬러, B. 컬러 A에서 왼쪽 외부 조인 B의 A. 컬러 = B. 컬러 및 B. 컬러 = ‘녹색’

여기에 이미지 설명을 입력하십시오

SQL 바이올린

SQLFiddle.com에서 실시간으로 실행되는 이러한 예제를 참조하십시오 .


답변

조인 은 두 테이블의 데이터를 결합하는 데 사용되며 결과는 새로운 임시 테이블입니다. 결합은 술어라는 것을 기반으로 수행되며, 결합을 수행하기 위해 사용할 조건을 지정합니다. 내부 조인과 외부 조인의 차이점은 내부 조인은 조인 조건자를 기준으로 실제로 일치하는 행만 반환한다는 것입니다. 예를 들어, Employee 및 Location 테이블을 고려하십시오.

여기에 이미지 설명을 입력하십시오

내부 조인 :-
내부 조인은조인 조건 자에 따라두 테이블 ( Employee Location )의 열 값을 결합하여 새 결과 테이블을 만듭니다. 쿼리는 Employee의 각 행을 Location의 각 행과비교하여 join-predicate를 만족시키는 모든 행 쌍을 찾습니다. NULL이 아닌 값을 일치시켜 결합 술어가 충족되면 직원 위치 의 일치하는 각 행 쌍의 열 값이 결과 행으로 결합됩니다. 내부 조인에 대한 SQL은 다음과 같습니다.

select  * from employee inner join location on employee.empID = location.empID
OR
select  * from employee, location where employee.empID = location.empID

이제 SQL 실행 결과는 다음과 같습니다.
여기에 이미지 설명을 입력하십시오

외부 조인 :-
외부 조인은 두 조인 된 테이블의 각 레코드가 일치하는 레코드를 갖도록 요구하지 않습니다. 조인 된 테이블은 일치하는 다른 레코드가 없더라도 각 레코드를 유지합니다. 외부 조인은 유지되는 테이블 행 (왼쪽 또는 오른쪽)에 따라 왼쪽 외부 조인과 오른쪽 외부 조인으로 세분화됩니다.

왼쪽 외부 조인 :- 직원 위치
테이블에 대한 왼쪽 외부 조인 (또는 단순히 왼쪽 조인)의 결과는 조인 조건에서 일치하는 레코드를 찾을 수없는 경우에도항상 “왼쪽”테이블 ( Employee )의 모든 레코드를 포함합니다. “오른쪽”테이블 ( Location ). 위의 표를 사용하여 왼쪽 외부 조인에 대한 SQL은 다음과 같습니다.

select  * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional

이제이 SQL을 실행 한 결과는 다음과 같습니다.
여기에 이미지 설명을 입력하십시오

오른쪽 외부 조인 :-
오른쪽 외부 조인 (또는 오른쪽 조인)은 테이블 처리가 반대 인 경우를 제외하고 왼쪽 외부 조인과 매우 유사합니다. “오른쪽”테이블 ( Location )의 모든 행은 조인 된 테이블에 적어도 한 번 나타납니다. “왼쪽”테이블 ( Employee )에서 일치하는 행이 존재하지 않으면 Location 에서 일치하지 않는 레코드에 대해 Employee 열에 NULL이 나타납니다. 이것은 SQL의 모습입니다 :

select * from employee right outer join location  on employee.empID = location.empID;
//Use of outer keyword is optional

위의 표를 사용하여 오른쪽 외부 조인의 결과 집합이 어떻게 표시되는지 확인할 수 있습니다.

여기에 이미지 설명을 입력하십시오

완전 외부 조인 :-
완전 외부 조인 또는 완전 조인은 조인 결과에 일치하지 않는 행을 포함시켜 일치하지 않는 정보를 유지하려면 완전 외부 조인을 사용하십시오. 다른 테이블의 값이 일치하는지 여부에 관계없이 두 테이블의 모든 행을 포함합니다.

이미지 소스

MySQL 8.0 레퍼런스 매뉴얼-Join Syntax

Oracle 조인 작업


답변

내부 조인

일치하는 행만 검색하십시오 (즉,) A intersect B.

여기에 이미지 설명을 입력하십시오

SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

왼쪽 외부 조인

첫 번째 테이블의 모든 레코드와 두 번째 테이블의 조인 된 키와 일치하는 모든 레코드를 선택하십시오.

여기에 이미지 설명을 입력하십시오

SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

완전 외부 조인

두 번째 테이블의 모든 레코드와 첫 번째 테이블의 조인 된 키와 일치하는 모든 레코드를 선택하십시오.

여기에 이미지 설명을 입력하십시오

SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

참고 문헌


답변

간단히 말해서 :

내부 조인 일치하는 행만을 검색 할 수 있습니다.

외부 조인 은 한 테이블에서 일치하는 행과 다른 테이블의 모든 행을 검색 하지만 결과는 사용중인 행에 따라 다릅니다.

  • 왼쪽 : 오른쪽 테이블의 일치하는 행과 왼쪽 테이블의 모든 행

  • 오른쪽 : 왼쪽 테이블의 일치하는 행과 오른쪽 테이블의 모든 행 또는

  • 전체 : 모든 테이블의 모든 행. 일치 여부는 중요하지 않습니다


답변

내부 조인은 조인의 다른 쪽 (오른쪽)에 일치하는 레코드가있는 경우에만 행을 표시합니다.

조인의 다른 (오른쪽)에 일치하는 행이없는 경우에도 (왼쪽) 외부 조인은 왼쪽의 각 레코드에 대한 행을 표시합니다. 일치하는 행이 없으면 다른 쪽 (오른쪽)의 열에 NULL이 표시됩니다.


답변

내부 조인을 수행하려면 조인 된 테이블에 관련 ID가있는 레코드가 있어야합니다.

외부 조인은 오른쪽에 아무것도없는 경우에도 왼쪽에 대한 레코드를 반환합니다.

예를 들어 Orders 및 OrderDetails 테이블이 있습니다. “OrderID”와 관련이 있습니다.

명령

  • 주문 아이디
  • 고객 이름

주문 세부 사항

  • OrderDetailID
  • 주문 아이디
  • 상품명
  • 수량
  • 가격

요청

SELECT Orders.OrderID, Orders.CustomerName
  FROM Orders
 INNER JOIN OrderDetails
    ON Orders.OrderID = OrderDetails.OrderID

OrderDetails 테이블에 무언가가있는 Orders 만 반환합니다.

외부 왼쪽 조인으로 변경하면

SELECT Orders.OrderID, Orders.CustomerName
  FROM Orders
  LEFT JOIN OrderDetails
    ON Orders.OrderID = OrderDetails.OrderID

OrderDetails 레코드가없는 경우에도 Orders 테이블에서 레코드를 반환합니다.

where 절을 추가하여 고아 주문을 나타내는 OrderDetails가없는 주문을 찾을 수 있습니다 WHERE OrderDetails.OrderID IS NULL.