"INNER JOIN"과 "OUTER JOIN"의 차이점은 무엇입니까?


4670

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


63
아래의 답변과 의견 및 참고 문헌 중 하나만이 실제로 벤 다이어그램이 연산자를 나타내는 방법을 설명합니다. 원 교차 영역은 A JOIN B의 행 집합을 나타냅니다. A JOIN B에 참여하지 않고 다른 테이블에 고유 한 열을 추가하는 테이블의 행은 모두 NULL로 설정됩니다. (그리고 대부분 A와 B에 대한 원의 모호한 통신을 제공합니다.)
philipxy

1
아래의 이론 기반 답변에서 실제 응용 프로그램으로 이동 : 프로세서 설계에 대한 벤치 마크를 실행하면서 실험 데이터로 작업하는 경우가 많습니다. 종종 두 개 이상의 하드웨어 옵션 간의 결과를 비교하고 싶습니다. INNER JOIN은 모든 실험에서 성공적으로 실행 된 벤치 마크 만 볼 수 있음을 의미합니다. 외부 참여는 일부 구성에서 실행되지 않은 실험을 포함하여 모든 실험을 볼 수 있음을 의미합니다. 그러한 실험에서 실패뿐만 아니라 성공을 보는 것이 중요합니다. 많은 RDBMS가 부족한 경우, 외부 조인을 얻기 위해 PerlSQL을 작성하기에 충분히 중요합니다.
Krazy Glew

4
많은 답변이 이미 제공되었지만이 자습서가 언급되지 않았습니다. 당신이 벤 다이어그램을 알고 있다면, 이것은 훌륭한 튜토리얼 : blog.codinghorror.com/a-visual-explanation-of-sql-joins 나를 위해, 그것은 빠른 읽기 될 간결 충분히이야하지만 여전히 전체 개념을 파악하고 모든 작동 아주 잘합니다. Venn 다이어그램이 무엇인지 모르는 경우 학습하십시오. 5-10 분이 소요되며 세트 작업을 시각화하고 세트 작업을 관리해야 할 때마다 도움이됩니다.
DanteTheSmith

14
@DanteTheSmith 아니오, 여기 다이어그램과 같은 문제가 있습니다. "제프는 자신의 블로그에서 댓글에 몇 페이지 아래로 답장을 보냅니다"라는 블로그 게시물에 대한 내 의견을 참조하십시오. 벤 다이어그램은 요소를 세트로 표시합니다. 이 다이어그램에서 집합이 무엇인지, 요소가 무엇인지 정확히 파악하십시오. 집합 테이블 이 아니며 요소 이 아닙니다 . 또한 두 개의 테이블을 조인 할 수 있으므로 PK 및 FK는 관련이 없습니다. 모든 가짜. 있어 - 당신은 다른 사람의 수천 짓을 단지 일을하는 막연한 느낌 이 (잘못) 가정 차종 감각.
philipxy

3
Chris 나는 datadata.com/…에 대한 기사를 읽고 당신이 선택한 답변 (현상이있는 사람에게)을 벤 다이어그램을 사용하지 않는 답변으로 바꾸는 것을 고려한다. 현재 인정되는 답변은 너무 많은 사람들을 오도하고 있습니다. 커뮤니티의 이익과 지식 기반의 질을 위해이 작업을 수행하시기 바랍니다.
Colm Bhandal

답변:


6112

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

  • 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

41
값이 4 인 테이블 B에 다른 행을 추가하여 예제를 보강하는 것이 좋습니다. 그러면 내부 조인이 행 수와 같을 필요는 없습니다.
softveda

472
그러나 A와 B의 외부 결합은 A 결합 B의 결과, 즉 벤 다이어그램 결합의 외부 부분을 제공합니다. 정확하게 표현되지 않았습니다. 외부 조인은 A (왼쪽 조인), B (오른쪽 조인) 또는 A와 B (완전 조인) 모두 중 하나에 추가하여 A 교차 B의 결과를 제공합니다. 이 마지막 시나리오 만이 실제로 A 노조 B입니다. 여전히 잘 쓰여진 설명입니다.
Thomas

11
FULL JOIN은 FULL OUTER JOIN의 별칭이고 LEFT JOIN은 LEFT OUTER JOIN의 별칭입니까?
Damian

3
예, 훌륭하고 훌륭한 설명입니다. 그러나 왜 b 열에서 값이 순서가 맞지 않습니까? 즉 5,6이 아닌 6,5입니까?
Ameer

7
@Ameer, 감사합니다. 조인이 주문을 보장하지는 않으므로 ORDER BY 절을 추가해야합니다.
Mark Harrison

732

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

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

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

  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에서 실시간으로 실행되는 이러한 예제를 참조하십시오 .


46
나는 이것이 Venn 다이어그램뿐만 아니라 나에게 거의 효과가 없지만 사람들이 다양하고 다르게 배우는 것에 감사하며 이것은 이전에 보았던 것과는 달리 잘 설명 된 설명이므로 @ypercube를 지원합니다. 보너스 포인트를 수여합니다. 또한 JOIN 절과 WHERE 절에 추가 조건을 두는 것의 차이점을 설명하는 좋은 연구. 마틴 스미스
Old Pro

22
@OldPro Venn 다이어그램은 내가 생각하는 한 괜찮지 만 교차 조인을 나타내는 방법이나 같은 조인 술어와 같은 조인 술어를 구별하는 방법에 대해서는 침묵합니다. 교차 조인 결과의 각 행에서 조인 술어를 평가 한 다음 외부 조인 인 경우 일치하지 않는 행을 다시 추가하고 최종적으로 나에게 더 적합한 위치를 평가하는 정신 모델.
Martin Smith

18
벤 다이어그램은 조합 및 교차점 및 차이를 나타내 기는하지만 조인에는 적합하지 않습니다. 매우 간단한 조인, 즉 조인 조건이 고유 한 열에있는 조인에 대한 교육 가치가 약간 있습니다.
ypercubeᵀᴹ

12
@Arth-아뇨. SQL Fiddle sqlfiddle.com/#!3/9eecb7db59d16c80417c72d1/5155 이것은 벤 다이어그램이 설명 할 수없는 것입니다.
Martin Smith

7
@MartinSmith 와우, 나는 완전히 틀렸다! 일대 다 작업에 너무 익숙합니다. 수정 해 주셔서 감사합니다.
Arth

187

조인 은 두 테이블의 데이터를 결합하는 데 사용되며 결과는 새로운 임시 테이블입니다. 결합은 술어라는 것을 기반으로 수행되며, 결합을 수행하기 위해 사용할 조건을 지정합니다. 내부 조인과 외부 조인의 차이점은 내부 조인은 조인 조건자를 기준으로 실제로 일치하는 행만 반환한다는 것입니다. 예를 들어, 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 조인 작업


3
지금까지 가장 좋은 대답, 대체 구문-그것이 내가 찾던 것입니다, 감사합니다!
Joey

1
벤 다이어그램의 레이블이 잘못되었습니다. 질문 및 기타 답변에 대한 내 의견을 참조하십시오. 또한이 언어의 대부분은 가난합니다. 예 : "NULL이 아닌 값을 일치시켜 결합 술어가 만족되면 직원과 위치의 일치하는 각 행 쌍의 열 값이 결과 행으로 결합됩니다." "NULL이 아닌 값을 일치시켜 결합 술어가 만족되는 경우"가 아닙니다. 행의 값은 전체 조건이 참인지 거짓인지와는 상관이 없습니다. 실제 조건에서는 일부 값이 NULL 일 수도 있습니다.
philipxy 2018

명시 적으로 언급되지 않았지만이 다이어그램은 벤 다이어그램입니다. 벤 다이어그램은 일반적으로 조인의 올바른 수학적 특성이 아닙니다. 벤 다이어그램을 제거하는 것이 좋습니다.
Colm Bhandal

@ColmBhandal : 제거 된 벤 다이어그램
ajitksharma

표 및 ERD를 포함한 텍스트에는 이미지 / 링크가 아닌 텍스트를 사용 하십시오 . 텍스트로 표현할 수 없거나 텍스트를 보강 할 수없는 이미지에만 이미지를 사용하십시오. 이미지를 검색하거나 잘라내어 붙여 넣을 수 없습니다. 이미지와 함께 범례 / 키 및 설명을 포함합니다.
philipxy

132

내부 조인

일치하는 행만 검색하십시오 (즉,) 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

참고 문헌


14
도구의 이름은 무엇입니까? 행과 벤 다이어그램의 수를 보여 주므로 흥미 롭습니다
Grijesh Chauhan

2
@GrijeshChauhan Yeah하지만 와인 을 사용하여 실행할 수 있습니다 .
Tushar Gupta-curioustushar

2
오! 그래 난 .. 난 와인을 사용하여 SQLyog에 사용 ..도있다 PlayOnLinux
Grijesh 차우

1
텍스트가 명확하지 않고 잘못되었습니다. "일치 된 행만"은 A & B의 교차 결합의 행이며 검색된 항목 (A 내부 결합 B)은 A 교차 B가 아니라 (A 왼쪽 결합 B) 교차 (A 오른쪽 결합 B)입니다. "선택된"행은 A & B가 아니며 A 교차 조인 B에서
왔으며

@ TusharGupta-curioustushar 당신은 "SQL 예제에 사용 된 테이블"을 포함해야합니다
Manuel Jordan

111

간단히 말해서 :

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

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

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

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

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


1
@nomen이 답변이 해결하는 것은 아니지만 , 왼쪽 및 오른쪽 세트 / 원에 (각각) 왼쪽 및 오른쪽 조인 행이 포함 된 경우 INNER JOIN은 교차점이며 FULL OUTER JOIN은 해당 UNION 입니다. PS이 답변은 입력과 출력의 행에 대해 명확하지 않습니다. "왼쪽 / 오른쪽 테이블에 있음"과 "왼쪽 / 오른쪽에 왼쪽 / 오른쪽 부분이 있음"을 혼동하고 "일치 된 행"대 "모두"를 사용하여 다른 테이블에서 행으로 확장 된 행을 Null로 의미합니다.
philipxy

103

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

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


81

내부 조인을 수행하려면 조인 된 테이블에 관련 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.


1
간단하지만 현실적인 예를 들어 주셔서 감사합니다. 나는 같은 요청을 변경 SELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c, categories_description cd WHERE c.id = cd.categories_id AND c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASCSELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c INNER JOIN categories_description cd ON c.id = cd.categories_id WHERE c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASC성공 (MySQL의). 나는 추가 조건에 대해 확신하지 못했습니다, 그들은 잘 섞입니다 ...
PhiLho

68

간단한 말로 :

내부 조인 -> 상위 및 하위 테이블에서 공통 레코드 만 가져옵니다. 상위 테이블의 기본 키가 하위 테이블의 외래 키와 일치하는 경우.

왼쪽 조인 ->

의사 코드

1.Take All records from left Table
2.for(each record in right table,) {
    if(Records from left & right table matching on primary & foreign key){
       use their values as it is as result of join at the right side for 2nd table.
    } else {
       put value NULL values in that particular record as result of join at the right side for 2nd table.
    }
  }

오른쪽 조인 : 왼쪽 조인과 정확히 반대입니다. Right join에서 오른쪽의 LEFT JOIN에 테이블 이름을 입력하면 LEFT JOIN과 동일한 출력이 표시됩니다.

외부 조인 : 두 테이블의 모든 레코드를 표시합니다 No matter what. 왼쪽 테이블의 레코드가 기본 Forieign 키를 기준으로 오른쪽 테이블과 일치하지 않으면 조인 결과로 NULL 값을 사용하십시오.

예 :

예

이제 2 개의 테이블에 대해 가정하겠습니다

1.employees , 2.phone_numbers_employees

employees : id , name 

phone_numbers_employees : id , phone_num , emp_id   

여기에서 직원 테이블은 마스터 테이블이고 phone_numbers_employees는 자식 테이블입니다 (자식 테이블 emp_id과 연결되는 외래 키를 포함 employee.id합니다).

내부 조인

2 개의 테이블 레코드 만 사용 하십시오. 직원 테이블의 기본 키 (id)는 하위 테이블의 foreign key와 일치합니다. phone_numbers_employees (emp_id) .

따라서 쿼리는 다음과 같습니다.

SELECT e.id , e.name , p.phone_num FROM employees AS e INNER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

위에서 설명한 것처럼 기본 키 = 외래 키에서 일치하는 행만 가져옵니다. 여기서 기본 키 = 외래 키의 일치하지 않는 행은 조인 결과로 건너 뜁니다.

왼쪽 조인 :

왼쪽 조인은 오른쪽 테이블에 일치하는 행이 있는지 여부에 관계없이 왼쪽 테이블의 모든 행을 유지합니다.

SELECT e.id , e.name , p.phone_num FROM employees AS e LEFT JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

외부 조인 :

SELECT e.id , e.name , p.phone_num FROM employees AS e OUTER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

도식적으로 다음과 같습니다.

도표


4
결과는 기본 / 고유 / 후보 키 및 외래 키와 아무런 관련이 없습니다. 바비 어는 그것들을 참조하지 않고 설명 할 수 있으며 설명해야합니다. 교차 조인이 계산 된 다음 ON 조건과 일치하지 않는 행이 필터링됩니다. 또한 외부 조인 행의 경우 필터링 /
일치하지

SQL 조인이 항상 기본 / 외국 키와 일치한다고 가정하면 Venn 다이어그램이 잘못 사용됩니다. 이에 따라 답변을 수정하십시오.
Colm Bhandal

58

너는 사용한다 INNER JOIN일치하는 두 테이블에서 모든 행을 리턴 데 합니다. 즉, 결과 테이블에서 모든 행과 열에 값이 있습니다.

에서 OUTER JOIN결과 테이블 빈 열이있을 수 있습니다. 외부 조인은 LEFT또는 중 하나 일 수 있습니다 RIGHT.

LEFT OUTER JOIN 두 번째 테이블에 일치하는 항목이 없더라도 첫 번째 테이블의 모든 행을 반환합니다.

RIGHT OUTER JOIN 첫 번째 테이블에 일치하는 항목이 없더라도 두 번째 테이블의 모든 행을 반환합니다.



54

INNER JOIN두 테이블을 비교할 때 최소한 일치하는 것이 필요합니다. 예를 들어, 표 A와 표 B는 A ٨ B (A 교차점 B)를 의미합니다.

LEFT OUTER JOINLEFT JOIN 동일합니다. 테이블과 왼쪽 테이블의 모든 가능성에서 일치하는 모든 레코드를 제공합니다.

마찬가지로, RIGHT OUTER JOINRIGHT JOIN동일하다. 테이블과 오른쪽 테이블의 모든 가능성에서 일치하는 모든 레코드를 제공합니다.

FULL JOIN의 조합 LEFT OUTER JOINRIGHT OUTER JOIN중복없이.


43

그 결과는 각각의 의미에 있습니다.

참고 :
에서 SQLite더 없다 RIGHT OUTER JOIN거나 FULL OUTER JOIN.
그리고 또한 MySQL없습니다 FULL OUTER JOIN.

내 대답은 위의 참고 사항을 기반으로 합니다.

다음과 같은 두 개의 테이블이있는 경우 :

--[table1]               --[table2]
id | name                id | name
---+-------              ---+-------
1  | a1                  1  | a2
2  | b1                  3  | b2

CROSS JOIN / OUTER JOIN : 다음 과 같이 또는
함께 테이블 데이터를 모두 가질 수 있습니다 .CROSS JOIN,

SELECT * FROM table1, table2
--[OR]
SELECT * FROM table1 CROSS JOIN table2

--[Results:]
id | name | id | name 
---+------+----+------
1  | a1   | 1  | a2
1  | a1   | 3  | b2
2  | b1   | 1  | a2
2  | b1   | 3  | b2

INNER JOIN : 다음
과 같은 관계에 따라 위의 결과에 필터를 추가하려는 table1.id = table2.id경우 INNER JOIN:

SELECT * FROM table1, table2 WHERE table1.id = table2.id
--[OR]
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id

--[Results:]
id | name | id | name 
---+------+----+------
1  | a1   | 1  | a2

LEFT [OUTER] JOIN :
위의 결과에서 테이블 중 하나의 모든 행을 동일한 관계로 사용하려면 LEFT JOIN다음 을 사용할 수 있습니다 .
( RIGHT JOIN 의 경우 테이블 위치 만 변경)

SELECT * FROM table1, table2 WHERE table1.id = table2.id 
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
--[OR]
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id

--[Results:]
id | name | id   | name 
---+------+------+------
1  | a1   | 1    | a2
2  | b1   | Null | Null

전체 외부 조인 :
결과에 다른 테이블의 모든 행을 추가하려는 경우 FULL OUTER JOIN다음을 사용할 수 있습니다 .

SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
UNION ALL
SELECT Null, Null, * FROM table2 WHERE Not table2.id In (SELECT id FROM table1)
--[OR] (recommended for SQLite)
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION ALL
SELECT * FROM table2 LEFT JOIN table1 ON table2.id = table1.id
WHERE table1.id IS NULL
--[OR]
SELECT * FROM table1 FULL OUTER JOIN table2 On table1.id = table2.id

--[Results:]
id   | name | id   | name 
-----+------+------+------
1    | a1   | 1    | a2
2    | b1   | Null | Null
Null | Null | 3    | b2

글쎄, 당신의 필요로 당신은 당신의 필요를 다루는 각각을 선택합니다;).


full outer joinMySQL 에는 없다고 덧붙일 수 있습니다 .
potashin

35

내부 조인.

조인은 두 테이블의 행을 결합합니다. 내부 조인 쿼리에서 지정한 기준에 따라 두 개의 테이블을 일치하는 시도를하고 만 일치하는 행을 반환합니다. 조인의 첫 번째 테이블 행이 두 번째 테이블의 두 행과 일치하면 결과에 두 개의 행이 반환됩니다. 첫 번째 테이블에 두 번째 행과 일치하지 않는 행이 있으면 반환되지 않습니다. 마찬가지로 두 번째 테이블에 첫 번째 행과 일치하지 않는 행이 있으면 반환되지 않습니다.

외부 조인.

A는 가입 왼쪽 두 번째 테이블의 행에 대한 첫 번째 테이블에서 행을 일치 찾을 시도. 일치하는 항목을 찾을 수 없으면 첫 번째 테이블에서 열을 반환하고 두 번째 테이블의 열을 비워 둡니다 (널).


28

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

  • INNER JOIN둘 이상의 테이블에 대한 가장 일반적인 조인입니다. 테이블 ON 기본 키와 forignkey 관계 모두에서 데이터 일치를 리턴합니다.
  • OUTER JOIN와 동일 INNER JOIN하지만 NULLResultSet의 데이터 도 포함 합니다.
    • LEFT JOIN= INNER JOIN+ 오른쪽 테이블과 Null일치하는 왼쪽 테이블 의 일치하지 않는 데이터 .
    • RIGHT JOIN= INNER JOIN+ 왼쪽 테이블 과 일치하는 오른쪽 테이블 의 일치하지 않는 데이터 Null.
    • FULL JOIN= INNER JOIN+ 일치 하는 오른쪽 및 왼쪽 테이블의 일치하지 않는 데이터 Null.
  • 자체 조인은 테이블 자체가 데이터를 참조 할 때 자체 조인으로 알려진 SQL의 키워드가 아닙니다. 사용 INNER JOIN하고 OUTER JOIN자체 조인 쿼리를 작성할 수 있습니다.

예를 들면 다음과 같습니다.

SELECT * 
FROM   tablea a 
       INNER JOIN tableb b 
               ON a.primary_key = b.foreign_key 
       INNER JOIN tablec c 
               ON b.primary_key = c.foreign_key 

27

다른 답변에서 성능 및 최적화에 대한 자세한 내용을 보지 못했습니다.

때로는 그 사실 만 아는 것이 좋습니다 INNER JOIN 연관성 즉, 옵티마이 저가 가장 많은 옵션을 가지고 있음을 의미합니다. 동일한 결과를 더 빨리 유지하기 위해 결합 순서를 재정렬 할 수 있습니다. 옵티마이 저는 가장 많은 결합 모드를 사용할 수 있습니다.

일반적으로 INNER JOIN다른 종류의 조인 대신 사용하는 것이 좋습니다 . (물론 예상되는 결과 세트를 고려할 수 있다면)

이 이상한 연관 행동에 대한 몇 가지 좋은 예와 설명이 있습니다.


4
한 유형의 조인을 다른 유형보다 사용하는 것은 "우수 사례"일 수 없습니다. 사용하는 조인에 따라 원하는 데이터가 결정됩니다. 다른 것을 사용하면 틀린 것입니다. 또한 오라클에서는 적어도이 답변은 완전히 잘못되었습니다. 모든 것이 완전히 잘못 들리며 증거가 없습니다. 증거가 있습니까?
Ben

1. 사용 하려고 합니다. LEFT OUTER 조인을 사용하는 많은 사람들이 아무런 이유없이 어디서나 참여했습니다. 조인 된 열은 'null이 아니 었습니다.'이러한 경우 INNER 조인을 사용하는 것이 좋습니다. 2. 비 연관적인 동작을 설명 할 수있는 링크를 추가했습니다.
Lajos Veres

내가 아는 것처럼 대부분의 경우 INNER JOIN보다 느리고 LEFT JOIN사람들은 예기치 않은 결과 를 제거 하기 위해 를 추가하는 LEFT JOIN대신 사용할 수 있습니다 .). INNER JOINWHERENULL
shA.t

이 의견은 저를 조금 불확실하게 만들었습니다. 왜 INNER느리다고 생각 합니까?
Lajos Veres

엔진에 따라 다릅니다. gnu 조인, 조인 키, DB2, MySQL. 타이핑이 느슨하거나 명시 적 캐스트와 같은 성능 트랩이 풍부합니다.
mckenzm

26

많이 사랑받는 붉은 그늘의 벤 다이어그램을 비난하면서 나는 내 자신의 시도를 게시하는 것이 공정하다고 생각했습니다.

@Martin Smith의 대답이 먼 길 에서이 묶음 중 최고이지만, 각 테이블의 키 열만 표시하지만 키가 아닌 열도 표시해야한다고 생각합니다.

반 시간 동안 내가 할 수있는 최선을 다했지만 여전히 키 값이 없기 때문에 null이 TableB있거나 OUTER JOIN실제로 조인이 아닌 합집합이라는 것이 적절하게 표시되지 않는다고 생각합니다 .

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


2
질문은 INNER와 OUTER 조인의 차이점을 요구하지만 반드시 외부 조인을
남길

@LearnByReading : 오른쪽에 내 사진이있는 오른쪽 외부 즉 조인 교체 TableA a LEFT OUTER JOIN TableB b와 함께TableB B RIGHT OUTER JOIN TableA a
onedaywhen

26

에 대한 정확한 알고리즘은 INNER JOIN, LEFT/RIGHT OUTER JOIN다음과 같습니다 :

  1. 첫 번째 테이블에서 각 행을 가져옵니다. a
  2. 옆에있는 두 번째 테이블의 모든 행을 고려하십시오. (a, b[i])
  3. ON ...각 쌍에 대해 절을 평가하십시오 .ON( a, b[i] ) = true/false?
    • 조건이로 평가되면 true결합 된 행을 반환합니다 (a, b[i]).
    • 일치하지 않고 두 번째 테이블의 끝에 도달하면 다른 테이블의 모든 열을 사용하여 (가상)Outer Join을 반환 합니다. LEFT 외부 조인 또는 RIGHT 외부 조인. 이는 첫 번째 테이블의 모든 행이 최종 결과에 존재하도록하기위한 것입니다.Null(a, Null)(Null, b)

참고 :ON 절에 지정된 조건은 무엇이든 될 수 있으며 기본 키 를 사용할 필요는 없습니다 (두 테이블의 열을 항상 참조 할 필요는 없습니다)! 예를 들면 다음과 같습니다.

내부 조인 대 왼쪽 외부 조인


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

참고 : 왼쪽 조인 = 왼쪽 외부 조인, 오른쪽 조인 = 오른쪽 외부 조인


20

가장 간단한 정의

내부 조인 : 두 테이블에서 일치하는 레코드 를 반환 합니다.

완전 외부 가입 : 반환 일치와 타의 추종을 불허하는 기록 에서 타의 추종을 불허하는 기록을 위해 널 (null)와 두 테이블에서 두 테이블 .

왼쪽 외부 조인 : 왼쪽의 테이블에서만 일치 및 일치하지 않는 레코드를 반환합니다 .

Right Outer Join : Right Side의 테이블에서만 일치하고 일치하지 않는 레코드를 반환합니다 .

짧은

일치 + 왼쪽 일치하지 않음 + 오른쪽 일치하지 않음 = 완전 외부 조인

일치 + 왼쪽 일치하지 않음 = 왼쪽 외부 결합

일치 + 오른쪽 불일치 = 오른쪽 외부 조인

일치 = 내부 조인


1
이것은 훌륭하며 시계열 인덱스에 대해 조인이 예상대로 작동하지 않는 이유를 설명합니다. 1 초 간격으로 타임 스탬프가 일치하지 않습니다.
yeliabsalohcin

1
@yeliabsalohcin 귀하는 질문에 대한 귀하의 의견에 "예상 된 것"또는 "작동하는 것"을 설명하지 않습니다. 다른 사람들이 이상하게 기대할 수있는 설명 할 수없는 개인적인 오해 일뿐입니다. 여기서 글을 쓸 때와 같이 책을 읽을 때 (명확한 글을 잘못 해석하거나 불명확 한 글을 받아들이지 않음) 잘못 단어를 취급하면 오해가있을 수 있습니다. 사실 여기에있는 대부분의 대답은 명확하지 않으며 잘못되었습니다. 입력 열 집합이 다르면 "내부 조인 : 두 테이블에서 일치하는 레코드를 반환합니다"가 잘못되었습니다. 그건 노력 특정 뭔가 말을하지만, 하지 않습니다 . (내 답변을 참조하십시오.)
philipxy

9

간단히 말해서

1. 내부 가입 또는 동등 가입 : 두 테이블의 조건 만 일치하는 결과 집합을 반환합니다.

2. 외부 가입 : 조건 일치 여부에 관계없이 두 테이블에서 모든 값의 결과 집합을 반환합니다.

3. 왼쪽 가입 : 왼쪽 테이블의 모든 값과 오른쪽 테이블의 조건과 일치하는 행의 결과 집합을 반환합니다.

4. 오른쪽 가입 : 오른쪽 테이블의 모든 값과 왼쪽 테이블의 조건과 일치하는 행의 결과 집합을 반환합니다.

5. FULL JOIN : 전체 조인과 전체 외부 조인이 동일합니다.


5

SQL에는 주로 2 가지 주요 유형의 JOIN이 있습니다. [INNER 및 OUTER]


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

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

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



  • (내부) 가입 :

INNER JOIN 키워드는 조건이 만족되는 한 두 테이블에서 모든 행을 선택합니다. 이 키워드는 조건이 만족되는 조건 (예 : 공통 필드 값)이 동일한 두 테이블의 모든 행을 결합하여 결과 집합을 만듭니다.

내부 가입

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


  • 왼쪽 (외부) 가입 :

이 조인은 조인의 왼쪽에있는 테이블의 모든 행과 조인의 오른쪽에있는 테이블에 대한 일치하는 행을 반환합니다. 오른쪽에 일치하는 행이없는 행에는 결과 집합에 null이 포함됩니다. LEFT JOIN은로도 알려져 있습니다 LEFT OUTER JOIN.

왼쪽 가입 / 왼쪽 외부 가입

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
7 | null
8 | null


  • RIGHT (OUTER) JOIN : 오른쪽 테이블의 모든 레코드와 왼쪽 테이블의 일치하는 레코드를 반환합니다

오른쪽 가입 / 오른쪽 외부 가입

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


  • 전체 (외부) 가입 :

    FULL JOIN은 LEFT JOIN과 RIGHT JOIN의 결과를 결합하여 결과 집합을 만듭니다. 결과 집합에는 두 테이블의 모든 행이 포함됩니다. 일치하지 않는 행은 결과 집합에 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
   7 | null
   8 | null

1
벤 다이어그램은 일반적인 경우 SQL 조인을 설명하기에 충분하지 않습니다. SQL 조인은 테이블 간 행을 일대일로 일치시킬 필요는 없습니다 (예 : 외래 키 대 기본 키 사용).
Colm Bhandal

행과 일치하지 않고 2 개의 테이블을 어떻게 결합합니까? 조인을 수행하려면 열 기본 또는 외래 키 또는 일부 공통 필드가 필요합니다. 왜 당신이이 답을 내리는 지 궁금합니다. 벤 다이어그램은 SQL JOIN 작동 방식을 설명하는 소스입니다. 조인을 나타내는 더 좋은 예가 있습니까? 그렇지 않은 경우 사람들이 더 나은 솔루션을 얻을 수 있도록 투표하십시오. 감사합니다.
Mayur

당신은 게시물에 다이어그램을 넣는 사람입니다. 다이어그램의 범례는 무엇입니까?-각 집합의 요소는 무엇입니까? 그리고 테이블이 가방이 아니라는 사실은 어떻습니까? 당신은 말하지 않습니다. 그들이 설정하지 않은 한 가지는 레이블 당 A & B 행입니다. 이 페이지의 게시물에 대한 내 의견을 참조하십시오. 이 게시물은 다른 곳에서 보았지만 이해하거나 질문하지 않은 잘못된 사용법을 맹목적으로 반복합니다. 또한 여기에 텍스트로 말한 내용은 명확하지 않으며 잘못되었습니다. 또한 이미 여기에 많은 답변에 아무것도 추가하지 않습니다. (거의 모든 것이 매우 좋지는 않지만) PS 주석이 아닌 편집을 통해 명확히하십시오.
philipxy

FK는 가입하거나 쿼리 할 필요가 없습니다. 제약 조건, 트리거 또는 어설 션에 관계없이 열과 관련된 모든 조건에서 2 개의 테이블을 조인 할 수 있습니다.
philipxy

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

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

  • 완전 외부 조인 - 완전 외부 조인 은 A와 B, 즉 A의 모든 행과 B의 모든 행을 통합합니다. A의 항목에 B에 해당 데이텀이없는 경우 B 부분은 다음과 같습니다. null 및 그 반대


1
이것은 틀리고 불분명합니다. 테이블에 동일한 열 이 없으면 조인은 교차점 이 아닙니다 . 외부 조인에는 동일한 열이 없으면 A 또는 B의 행이 없습니다.이 경우 널이 추가되지 않습니다. 당신은 무언가를 말하려고하지만 당신은 그것을 말하지 않습니다. 정확하게 또는 명확하게 설명하고 있지 않습니다.
philipxy

@philipxy : 명세서에 동의하지 않습니다. Join is not an intersection unless the tables have the same columns원하는 열을 결합 할 수 있으며 값이 일치하면 서로 결합됩니다.
자살 Sheep

그 의견은 당신의 대답만큼 명확하지 않습니다. (결과의 공통 열에 대한 하위 행 값 집합이 각 입력의 공통 열에 대한 하위 행 값 집합의 교집합과 같은 것으로 생각할 수 있지만 그게 당신이 쓴 것이 아닙니다. 취소되지 않음).
philipxy

내 말은 조인은 동일한 열을 가진 입력의 자연스러운 내부 조인일 때 입력의 교집합이라는 것입니다. "교차로"및 "연합"이라는 단어를 잘못 사용하고 있습니다.
philipxy

3

1. 내부 조인 : 조인 이라고도합니다. 일치하는 경우 에만 왼쪽 테이블과 오른쪽 테이블 모두에 존재하는 행을 리턴합니다 . 그렇지 않으면 레코드 0을 반환합니다.

예:

SELECT
  e1.emp_name,
  e2.emp_salary    
FROM emp1 e1
INNER JOIN emp2 e2
  ON e1.emp_id = e2.emp_id

출력 1

2. 전체 외부 조인 : 전체 조인이라고도합니다. 왼쪽 테이블과 오른쪽 테이블 모두에있는 모든 행을 반환 합니다.

예:

SELECT
  e1.emp_name,
  e2.emp_salary    
FROM emp1 e1
FULL OUTER JOIN emp2 e2
  ON e1.emp_id = e2.emp_id

출력 2

3. 왼쪽 외부 조인 : 또는 간단히 왼쪽 조인이라고합니다. 왼쪽 테이블에있는 모든 행과 오른쪽 테이블 (있는 경우)의 일치하는 행을 반환합니다.

4. 오른쪽 외부 조인 : 오른쪽 조인이라고도합니다. 왼쪽 테이블 (있는 경우)과 오른쪽 테이블에있는 모든 행에서 일치하는 행을 반환합니다.

조인

조인의 장점

  1. 더 빨리 실행됩니다.

2
이는 테이블에 동일한 열 세트가있는 경우에만 유효합니다. (내부 조인과 교차 및 조인과의 완전 조인을 혼동합니다.) "일치"도 정의되어 있지 않습니다. 다른 의견을 읽으십시오.
philipxy

2

아래 2 개의 테이블을 고려하십시오.

EMP

empid   name    dept_id salary
1       Rob     1       100
2       Mark    1       300
3       John    2       100
4       Mary    2       300
5       Bill    3       700
6       Jose    6       400

학과

deptid  name
1       IT
2       Accounts
3       Security
4       HR
5       R&D

내부 조인 :

대부분 SQL 쿼리에서 JOIN 으로 작성되었습니다 . 테이블간에 일치하는 레코드 만 리턴합니다.

모든 직원과 부서 이름을 찾으십시오.

Select a.empid, a.name, b.name as dept_name
FROM emp a
JOIN department b
ON a.dept_id = b.deptid
;

empid   name    dept_name
1       Rob     IT
2       Mark    IT
3       John    Accounts
4       Mary    Accounts
5       Bill    Security

위에서 볼 수 있듯이 dept_id 가 Department 테이블에서 일치하는 항목을 찾지 못 하므로 출력의 EMP 에서 Jose인쇄 되지 않습니다. 이와 유사하게, 그리고 행은에서 인쇄되지 않은 부서 가 EMP 테이블에서 일치하는 항목을 찾을 수 없습니다로 테이블.6HRR&D

따라서 INNER JOIN 또는 단지 JOIN은 일치하는 행만 반환합니다.

왼쪽 가입 :

LEFT 테이블의 모든 레코드와 RIGHT 테이블의 일치하는 레코드 만 리턴합니다.

Select a.empid, a.name, b.name as dept_name
FROM emp a
LEFT JOIN department b
ON a.dept_id = b.deptid
;

empid   name    dept_name
1       Rob     IT
2       Mark    IT
3       John    Accounts
4       Mary    Accounts
5       Bill    Security
6       Jose    

따라서 위의 출력을 관찰하면 LEFT 테이블 (Emp)의 모든 레코드가 RIGHT 테이블의 일치하는 레코드와 함께 인쇄됩니다.

HRR&D행에서 인쇄되지 않습니다 부서 가 DEPT_ID에 EMP 테이블에서 일치하는 항목을 찾을 수 없습니다로 테이블.

따라서 LEFT JOIN은 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행만 반환합니다.

여기서 DEMO를 확인할 수도 있습니다 .


2

일반적인 아이디어

참조하십시오 대답 하여 마틴 스미스를 다른 포함한 사이, 특히 차이, 조인의 더 나은 illustations 및 설명을 위해 FULL OUTER JOIN, RIGHT OUTER JOIN그리고 LEFT OUTER JOIN.

이 두 표는 JOIN아래의 표를 나타내는 기초를 형성 합니다.

기초

크로스 가입

크로스 조인

SELECT *
  FROM citizen
 CROSS JOIN postalcode

결과는 모든 조합의 카티 전 곱이됩니다. JOIN조건이 필요 하지 않습니다 :

CrossJoinResult

내부 가입

INNER JOIN 단순히 다음과 같습니다. JOIN

이너 조인

SELECT *
  FROM citizen    c
  JOIN postalcode p ON c.postal = p.postal

결과는 필요한 JOIN조건 을 만족시키는 조합입니다 .

InnerJoinResult

왼쪽 외부 조인

LEFT OUTER JOIN 와 같다 LEFT JOIN

LeftJoin

SELECT *
  FROM citizen         c
  LEFT JOIN postalcode p ON c.postal = p.postal

citizen일치하는 항목이 없더라도 결과는 모든 것 입니다 postalcode. 다시 JOIN조건이 필요합니다.

LeftJoinResult

연주용 데이터

모든 예제는 Oracle 18c에서 실행되었습니다. dbfiddle.uk 에서 구할 수 있으며 테이블의 스크린 샷도 있습니다.

CREATE TABLE citizen (id      NUMBER,
                      name    VARCHAR2(20),
                      postal  NUMBER,  -- <-- could do with a redesign to postalcode.id instead.
                      leader  NUMBER);

CREATE TABLE postalcode (id      NUMBER,
                         postal  NUMBER,
                         city    VARCHAR2(20),
                         area    VARCHAR2(20));

INSERT INTO citizen (id, name, postal, leader)
              SELECT 1, 'Smith', 2200,  null FROM DUAL
        UNION SELECT 2, 'Green', 31006, 1    FROM DUAL
        UNION SELECT 3, 'Jensen', 623,  1    FROM DUAL;

INSERT INTO postalcode (id, postal, city, area)
                 SELECT 1, 2200,     'BigCity',         'Geancy'  FROM DUAL
           UNION SELECT 2, 31006,    'SmallTown',       'Snizkim' FROM DUAL
           UNION SELECT 3, 31006,    'Settlement',      'Moon'    FROM DUAL  -- <-- Uuh-uhh.
           UNION SELECT 4, 78567390, 'LookoutTowerX89', 'Space'   FROM DUAL;

흐릿한 경계 때와 재생 JOINWHERE

크로스 가입

CROSS JOIN일반 아이디어 / INNER JOIN:

SELECT *
  FROM citizen          c
  CROSS JOIN postalcode p
 WHERE c.postal = p.postal -- < -- The WHERE condition is limiting the resulting rows

를 사용 CROSS JOIN하여 행을 LEFT OUTER JOIN추가하는 것과 같은 트릭 이 필요합니다 NULL. 생략되었습니다.

내부 가입

INNER JOIN직교 제품이됩니다. 그것은 일반적인 아이디어와 동일합니다 CROSS JOIN:

SELECT *
  FROM citizen    c
  JOIN postalcode p ON 1 = 1  -- < -- The ON condition makes it a CROSS JOIN

내부 조인이 실제로 교차 조인으로 간주되어 결과가 제거 된 조건과 일치하지 않는 경우입니다. 여기서는 결과 행이 제거되지 않습니다.

를 사용 INNER JOIN하여 결과를 얻으 LEFT OUTER JOIN려면 트릭이 필요합니다. 생략되었습니다.

왼쪽 외부 조인

LEFT JOIN일반 아이디어 / CROSS JOIN:

SELECT *
  FROM citizen         c
  LEFT JOIN postalcode p ON 1 = 1 -- < -- The ON condition makes it a CROSS JOIN

LEFT JOIN일반 아이디어 / INNER JOIN:

SELECT *
  FROM citizen         c
  LEFT JOIN postalcode p ON c.postal = p.postal
 WHERE p.postal IS NOT NULL -- < -- removed the row where there's no mathcing result from postalcode

벤 다이어그램의 문제점

"sql join cross inner outer"의 이미지 인터넷 검색은 다수의 벤 다이어그램을 보여줍니다. 나는 책상에 사본을 인쇄했었다. 그러나 표현에는 문제가 있습니다.

벤 다이어그램은 요소가 하나 또는 두 세트에있을 수있는 세트 이론에 탁월합니다. 그러나 데이터베이스의 경우 하나의 "세트"에있는 요소가 테이블의 행인 것처럼 보이므로 다른 테이블에도 존재하지 않습니다. 여러 테이블에 하나의 행이 존재하지 않습니다. 행은 테이블에 고유합니다.

자체 조인은 각 요소가 실제로 두 세트에서 동일한 코너 케이스입니다. 그러나 여전히 아래 문제가 없습니다.

이 세트 A는 아래에서 왼쪽 ( citizen테이블)의 세트 B를 나타내고 세트는 오른쪽 ( postalcode테이블) 의 세트를 나타냅니다 .

크로스 가입

두 세트의 모든 요소가 다른 세트의 모든 요소와 일치 하므로이 데카르트 곱을 제대로 나타내려면 모든 요소의 양과 A모든 B요소의 양이 필요합니다 . 세트 이론은 세트의 여러 동일한 요소에 대해 만들어지지 않았으므로 벤 다이어그램이 비실용적이거나 불가능한 것을 올바르게 나타내는 것으로 나타났습니다. 그런 것 같지 않아BAUNION .

행은 구별됩니다. 는 UNION총 7 행이다. 그러나 공통 SQL결과 집합과 호환되지 않습니다 . 그리고 이것은 전혀 CROSS JOIN작동 방식이 아닙니다 .

CrossJoinUnion1

다음과 같이 표현하려고합니다.

CrossJoinUnion2 크로싱

..하지만 지금은 단지처럼 보이는 INTERSECTION그것은 확실히이다하는, 하지 . 또한 INTERSECTION실제로 두 개의 다른 세트에있는 요소가 없습니다 . 그러나 다음과 유사한 검색 가능한 결과와 매우 유사합니다.

CrossJoinUnionUnion3

참고로 CROSS JOINs에 대한 하나의 검색 가능한 결과 는 Tutorialgateway . 이 INTERSECTION것과 마찬가지로는 비어 있습니다.

내부 가입

요소의 값은 JOIN조건에 따라 다릅니다 . 모든 행이 해당 조건에 고유하게되는 조건에서이를 나타낼 수 있습니다. 행에 id=x대해서만 의미 가 있습니다. 테이블의 행이되면 ( ) 테이블의 여러 행과 일치 ( 세 이하) 조건, 결과는 같은 문제가 행이 여러 번 표현해야하고, 집합 이론은 정말 위해 만든되지 않습니다. 고유성 조건에서는 다이어그램이 작동 할 수 있지만 조건에 따라 다이어그램에서 요소의 위치가 결정됩니다. 타기 위해 나머지 행과 함께 조건 의 값만 살펴보십시오 .AcitizenBpostalcodeJOINCROSS JOINJOINJOIN

InnerJoinIntersection-채워짐

이 표현은 을로 만드는 조건 에서 INNER JOINwith를 사용할 때 완전히 분리됩니다 .ON 1 = 1CROSS JOIN

자기 -로 JOIN, 행은 두 테이블에서 사실 idential 요소에 있지만, 모두 같은 테이블을 표현 A하고하는 것은 B매우 적합하지 않습니다. 예를 들어 일반적인 자기 JOIN의 요소를 만드는 조건이 A일치하는 될 다른 B의 요소가된다 ON A.parent = B.child에서 일치하기 AB별도의 요소. 다음 SQL과 같은 예에서 :

SELECT *
  FROM citizen c1
  JOIN citizen c2 ON c1.id = c2.leader

SelfJoinResult

의미 Smith는 Green과 Jensen의 리더입니다.

외부 가입

한 행에 다른 테이블의 행과 여러 개의 일치가 있으면 문제가 다시 시작됩니다. OUTER JOIN빈 세트와 일치 할 수 있기 때문에 이것은 더 복잡 합니다. 그러나 세트 이론에서 모든 세트 C와 빈 세트 의 결합 은 항상 단지 C입니다. 빈 세트는 아무것도 추가하지 않습니다. 이것에 대한 표현 LEFT OUTER JOIN은 일반적으로 일치 여부에 관계없이 AA이 선택 되었음을 나타내는 모든 것을 보여줍니다 B. 그러나 "일치하는 요소"에는 위의 그림과 같은 문제가 있습니다. 조건에 따라 다릅니다. 그리고 빈 세트는 방황 한 것처럼 보입니다 A.

LeftJoinIntersection-채워짐

WHERE 절-이해하기

CROSS JOIN달에 Smith와 우편 번호 가있는 모든 행 찾기 :

SELECT *
  FROM citizen          c
 CROSS JOIN postalcode  p
 WHERE c.name = 'Smith'
   AND p.area = 'Moon';

어디에-결과

이제 벤 다이어그램은을 반영하는 데 사용되지 않습니다 JOIN. 다음 절 에만 사용 됩니다WHERE .

어디

.. 그리고 말이 되네요.

INTERSECT와 UNION이 의미가있을 때

상호 작용

설명 된 것처럼 INNER JOIN실제로는 아닙니다 INTERSECT. 그러나 INTERSECT별도의 쿼리 결과에는 s를 사용할 수 있습니다. 별도의 쿼리의 요소가 실제로 결과 중 하나 또는 둘 다에 속하는 행이기 때문에 Venn 다이어그램이 의미가 있습니다. 교차는 두 행 모두에 행이있는 경우에만 결과를 반환합니다. 이는 SQL상술 된 것과 동일한 행 될 것이다 WHERE및 벤 다이어그램은 동일하다 :

SELECT *
  FROM citizen          c
 CROSS JOIN postalcode  p
 WHERE c.name = 'Smith'
INTERSECT
SELECT *
  FROM citizen          c
 CROSS JOIN postalcode  p
 WHERE p.area = 'Moon';

노동 조합

OUTER JOIN하지 않은 것입니다 UNION. 그러나 UNION와 동일한 조건에서 작업하면 INTERSECT두 가지를 모두 결합하여 모든 결과가 반환됩니다 SELECT.

SELECT *
  FROM citizen          c
 CROSS JOIN postalcode  p
 WHERE c.name = 'Smith'
UNION
SELECT *
  FROM citizen          c
 CROSS JOIN postalcode  p
 WHERE p.area = 'Moon';

이는 다음과 같습니다.

SELECT *
  FROM citizen          c
 CROSS JOIN postalcode  p
 WHERE c.name = 'Smith'
   OR p.area = 'Moon';

.. 그리고 결과를 제공합니다 :

연합-결과

또한 Venn 다이어그램이 의미가 있습니다.

노동 조합

적용되지 않을 때

중요한 점은 이러한에만 작동 두 SELECT의의 결과의 구조가 비교 또는 조합을 가능하게 같을 때이다. 이 두 가지 결과는 다음을 가능하게하지 않습니다.

SELECT *
  FROM citizen
 WHERE name = 'Smith'
SELECT *
  FROM postalcode
 WHERE area = 'Moon';

.. 결과와 결합하려고 UNION하면

ORA-01790: expression must have same datatype as corresponding expression

더 관심을 읽을 들어 설명하면서 때 벤 다이어그램에 말 NO를 조인SQL은 벤 다이어그램으로 조인 . 둘 다 커버 EXCEPT.


1

여기에는 매우 정확한 관계형 대수 예제 와 함께 많은 좋은 답변이 있습니다 . 다음은 SQL 코딩 딜레마가있는 아마추어 또는 초보자 코더에게 도움이 될 수있는 매우 간단한 답변입니다.

기본적으로 쿼리 JOIN는 두 가지 경우로 분류됩니다.

SELECT데이터 의 하위 집합 A:

  • 사용 INNER JOIN관련 데이터를 때 B당신이 찾고있는 MUST은 데이터베이스 설계에 따라 존재;
  • 데이터베이스 디자인별로 MIGHT 또는 MIGHT NOT을 찾고 LEFT JOIN있는 관련 데이터가있을 때 사용 하십시오 .B

1

의 차이 inner join와는 outer join다음과 같다 :

  1. Inner join일치하는 튜플을 기반으로 테이블을 결합한 조인이지만 일치하는 튜플 outer join과 일치하지 않는 튜플을 기반으로 테이블을 결합한 조인입니다.
  2. Inner join일치하지 않는 행이 생략 된 두 테이블에서 일치하는 행을 병합하는 반면, 두 테이블의 행을 병합하면 일치하지 않는 행은 outer join널값으로 채워집니다.
  3. Inner join교차 연산 outer join과 같지만 통합 연산과 같습니다.
  4. Inner join두 가지 유형이지만 outer join세 가지 유형입니다.
  5. outer join보다 빠릅니다 inner join.

1
외부 조인 결과는 내부 조인과 동일하지만 몇 가지 추가 행이 있으므로 외부 조인이 더 빠를 것이라고 생각하지 않습니다. 또한 이러한 "두 가지 유형"의 내부 결합은 무엇입니까? 나는 당신이 바깥쪽에 대해 전체, 왼쪽 및 오른쪽을 참조한다고 가정합니까?
마틴 스미스

1
@ M.achaibou 불필요한 형식 변경을 위해 편집하지 마십시오. 연산자 이름은 코드에서 사용되지 않는 한 코드가 아닙니다. 게시물 의미를 변경하지 말고 작성자에게 의견을 게시하십시오. 담당자가 없으면 할 때까지 기다리십시오. 포스터가이를 승인했지만 수정하지 마십시오. PS 외부 조인은 내부 조인보다 빠르지 않습니다.
philipxy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.