왼쪽, 오른쪽, 외부 및 내부 조인의 차이점은 무엇입니까?


562

이 모든 조인을 차별화하는 방법이 궁금합니다 ...



3
또한 문서는 아무것도하지 않습니다 것을 당신 같은 사람에 대한 이해의 수준에 따라 달라집니다하지만 어쩌면 완전히 이해 조인하지 않는 사람을 꽤 명확하다
SQLMenace

6
이것은 stackoverflow.com/questions/419375/sql-join-differences 의 복제본이며 다른 사람도 의심의 여지가 없습니다 ...
cletus

1
이것은 나에게 많은 도움이되었습니다 ... 가장 쉬운 방법은 테스트 테이블을 만들고 함께하는 것입니다. = P
daGrevis 2016 년

답변:


797

간단한 예 : Students테이블과 테이블 이 있다고 가정 Lockers합니다. SQL에서 조인에 지정하는 첫 번째 테이블 StudentsLEFT 테이블이고 두 ​​번째 테이블 LockersRIGHT 테이블입니다.

각 학생은 사물함에 배정 될 수 있으므로 테이블에 LockerNumber열이 Student있습니다. 둘 이상의 학생이 잠재적으로 단일 사물함에있을 수 있지만 특히 학년도가 시작될 때 사물함이없는 신입생과 학생이 배정되지 않은 사물함이있을 수 있습니다.

이 예제를 위해 100 명의 학생이 있고 그 중 70 에 사물함이 있다고 가정 해 봅시다. 총 50 개의 사물함 이 있으며 그 중 40 명에는 최소 1 명의 학생이 있고 10 명의 사물함에는 학생이 없습니다.

INNER JOIN 은 " 사물함이있는 모든 학생을 보여줘 "와 같습니다 .
사물함이없는 학생 또는 학생이없는 사물함이 없습니다.
70 행을 반환

LEFT OUTER JOIN 은 " 모든 학생에게 해당 사물함이있는 경우 해당 사물함과 함께 표시 "입니다.
일반 학생 목록이거나 사물함이없는 학생을 식별하는 데 사용될 수 있습니다.
100 행을 반환

RIGHT OUTER JOIN 은 " 모든 사물함을 보여주고 학생들에게 할당 된 사물함 이 있다면" 보여줍니다 .
이는 학생이 배정되지 않은 사물함 또는 너무 많은 학생이있는 사물함을 식별하는 데 사용될 수 있습니다.
80 개의 행을 반환합니다 (40 개의 사물함에있는 70 명의 학생과 학생이없는 10 명의 사물함)

전체 외부 가입 은 어리 석고 아마도 많이 사용하지 않을 것입니다.
" 모든 학생과 모든 사물함을 보여주고 당신이 할 수있는 곳과 일치 시키세요 "
110 개의 줄을 돌려줍니다

이 시나리오에서는 CROSS JOIN 도 상당히 어리 석습니다. 학생 테이블에서
연결된 lockernumber필드를 사용하지 않으므로 기본적으로 실제로 존재하는지 여부에 관계없이 가능한 모든 학생 대 사물함 쌍의 거대한 목록으로 끝납니다.
5000 행 (100 명의 학생 x 50 개의 사물함)을 반환 합니다. 새로운 학생들과 빈 사물함을 일치시키는 출발점으로 유용 할 수 있습니다.


12
예를 사용하여 CROSS 결합은 사물함 지정을 작성하기위한 시작점으로 유용합니다. 가능한 모든 조합으로 시작한 후 다른 기준을 사용하여 목록에서 결과를 필터링하십시오.
Joel Coehoorn

1
좋은 대답입니다. 크로스 조인은 많은 수의 레코드가 필요할 때 몇 행에서 테스트 데이터를 생성하는 데 가장 자주 사용됩니다.
Eli

6
완전 외부 조인은 분리 된 데이터를 검색하거나 동일한 데이터 세트의 다른 버전을 비교할 때 유용 할 수 있습니다.
Lara Dougan

3
크로스 일명 직교 제품에 가입
JavaRocky

3
쿼리를 시작하는 방법이 조인 유형의 결과에 영향을 미친다고 생각합니다. 예를 SELECT * FROM students RIGHT OUTER JOIN lockers...들어와 다른 결과가 나타납니다 SELECT * FROM lockers RIGHT OUTER JOIN students.... 멋진 대답은,하지만이 완료 업데이트보고 싶어요 SQL쿼리
jbmilgrom의

141

세 가지 기본 결합 유형이 있습니다.

  • INNERjoin은 두 테이블을 비교하고 일치하는 결과 만 반환합니다. 첫 번째 테이블의 레코드는 두 번째의 여러 결과와 일치 할 때 복제됩니다. INNER 조인은 결과 집합을 더 작게 만드는 경향이 있지만 레코드를 복제 할 수 있기 때문에 이것이 보장되지는 않습니다.
  • CROSSjoin은 두 테이블을 비교하고 두 테이블에서 가능한 모든 행 조합을 리턴합니다. 이러한 종류의 조인으로 인해 의미가 없을 수도있는 많은 결과를 얻을 수 있으므로주의해서 사용하십시오.
  • OUTER조인은 두 테이블을 비교하고 일치하는 항목이 있으면 데이터를 반환하고 그렇지 않으면 NULL 값을 반환합니다. INNER 조인과 마찬가지로 다른 테이블의 여러 레코드와 일치 할 때 한 테이블의 행을 복제합니다. OUTER 조인은 결과 집합이 자체적으로 집합에서 레코드를 제거하지 않기 때문에 결과 집합을 더 크게 만드는 경향이 있습니다. 또한 NULL 값을 추가 할시기와 위치를 판별하려면 OUTER 결합을 규정해야합니다.
    • LEFT 의미 무엇이든 상관없이 첫 번째 테이블의 모든 레코드를 유지하고 두 번째 테이블이 일치하지 않을 때 NULL 값을 삽입합니다.
    • RIGHT 반대의 의미 : 무슨 일이 있어도 두 번째 테이블의 모든 레코드를 유지하고 첫 번째 테이블이 일치하지 않으면 NULL 값을 삽입
    • FULL 즉, 두 테이블의 모든 레코드를 유지하고 일치하지 않으면 두 테이블에 NULL 값을 삽입합니다.

OUTER구문에서 키워드가 생략되는 경우 가 종종 있습니다 . 대신 "LEFT JOIN", "RIGHT JOIN"또는 "FULL JOIN"이됩니다. INNER 및 CROSS 조인은 LEFT, RIGHT 또는 FULL과 관련하여 의미가 없으므로 외부 조인을 명확하게 나타내기에 충분합니다.

다음은 각 유형을 사용하려는 경우의 예입니다.

  • INNER: "송장"테이블의 모든 레코드와 해당 "InvoiceLines"를 반환하려고합니다. 이것은 모든 유효한 송장에 최소한 한 줄이 있다고 가정합니다.
  • OUTER: 특정 송장에 대한 모든 "InvoiceLines"레코드와 해당 "InventoryItem"레코드를 반환하려고합니다. 이것은 모든 InvoiceLine이 IventoryItem을 갖지 않도록 서비스를 판매하는 비즈니스입니다.
  • CROSS: 10 개의 행이있는 숫자 표가 있으며 각 값은 '0'- '9'입니다. 결합 할 날짜 범위 테이블을 작성하여 범위 내에서 매일 하나의 레코드로 끝나도록합니다. 이 테이블을 반복적으로 결합하여 필요한만큼 연속 정수를 만들 수 있습니다 (10에서 1의 거듭 제곱에서 시작하면 각 조인은 지수에 1을 더함). 그런 다음 DATEADD () 함수를 사용하여 해당 값을 범위의 기본 날짜에 추가하십시오.

1
좋은. 'JOIN'만 쓰면 일반적으로 INNER JOIN을 의미한다고 덧붙입니다.
matpop

47

4 가지 종류 만 있습니다 :

  1. 내부 조인 : 가장 일반적인 유형입니다. 결합 조건과 일치하는 모든 입력 행 쌍에 대해 출력 행이 생성됩니다.
  2. 왼쪽 외부 조인 : 오른쪽에 테이블에 일치하는 행이 발견 될 수있는 임의의 행이 있다면 내부와 동일한 것을 제외 조인하는 행과 왼쪽 테이블의 값을 포함하는 출력이며, NULL각각은 오른쪽 표의 값. 즉, 왼쪽 테이블의 모든 행이 출력에 한 번 이상 나타납니다.
  3. 오른쪽 외부 조인 : 테이블의 역할이 바뀐 점을 제외하고 왼쪽 외부 조인과 동일합니다.
  4. 완전 외부 조인 : 왼쪽 및 오른쪽 외부 조인의 조합. 두 테이블의 모든 행이 출력에 한 번 이상 나타납니다.

"교차 조인"또는 "카테 시안 조인"은 조인 조건이 지정되지 않은 모든 내부 쌍을 출력하는 내부 조인입니다.

FULL 조인을 지적 해 주신 RusselH에게 감사드립니다.


1
완전 외부 조인 및 교차 조인 (카티지 곱)은 어떻습니까?
SQLMenace

full은 실제로 두 개의 외부 조인에 해당합니다
RussellH

25
내부 조인을 망칠 때 얻을 수있는 것은 무엇입니까? 그리고 "N 대신 N ^ 2 행을 얻는 이유는 무엇입니까?" 그러면 모두가 당신을 십자가에 못 박습니다.
Paul Tomblin

24

SQL JOINS 차이점 :

기억하기 매우 간단합니다.

INNER JOIN 두 테이블에 공통 인 레코드 만 표시합니다.

OUTER JOIN 두 테이블의 모든 내용이 일치하는지 여부에 따라 병합됩니다.

LEFT JOIN로 동일합니다 LEFT OUTER JOIN- (. 바로 테이블 레코드와 일치하는 첫 번째 (가장 왼쪽) 테이블에서 레코드를 선택)

RIGHT JOINRIGHT OUTER JOIN-(왼쪽 테이블 레코드와 일치하는 두 번째 (가장 오른쪽) 테이블에서 레코드 선택 )와 동일 합니다.

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


벤 다이어그램 원에 레이블을 지정하는 올 바르고 적절한 방법이 있지만 그렇지 않습니다. 원은 입력 테이블이 아닙니다. 또한 결과 행은 입력 행이 아니므로 설명이 잘못되었습니다. 또한 이것은 명확하지 않습니다. "모두 공통", "일치", "병합"에 대해서는 설명하지 않습니다.
philipxy

9

Wikipedia 에서 Join (SQL) 확인

  • 내부 조인-두 개의 테이블이 주어지면 내부 조인은 두 테이블에 존재하는 모든 행을 리턴합니다.
  • 왼쪽 / 오른쪽 (외부) 조인-주어진 두 테이블은 조인의 왼쪽 또는 오른쪽 테이블에 존재하는 모든 행을 반환하며, 조인 절이 일치하면 다른 쪽의 행이 반환되거나에 대한 null이 반환됩니다. 그 열

  • 전체 외부-두 테이블이 주어지면 모든 행을 반환하고 왼쪽 또는 오른쪽 열이 없으면 null을 반환합니다.

  • 교차 조인-직교 조인이므로주의해서 사용하지 않으면 위험 할 수 있습니다


6

더 잘 보이게하면 도움이 될 수 있습니다. 한 가지 예 :

1 번 테이블:

ID_STUDENT STUDENT_NAME

1               Raony
2               Diogo
3               Eduardo
4               Luiz

표 2 :

ID_STUDENT 로커

3               l1
4               l2
5               l3

내가 할 때 얻는 것 :

-Inner join of Table 1 and Table 2: 

    - Inner join returns both tables merged only when the key 
      (ID_STUDENT) exists in both tables

    ID_STUDENT       STUDENT_NAME      LOCKER   

        3               Eduardo          l1
        4               Luiz             l2

-Left join of Table 1 and Table 2:

    - Left join merges both tables with all records form table 1, in 
      other words, there might be non-populated fields from table 2

    ID_ESTUDANTE    NOME_ESTUDANTE     LOCKER   

        1               Raony            -
        2               Diogo            -
        3               Eduardo          l1
        4               Luiz             l2

-Right join of table 1 and table 2:

    - Right join merges both tables with all records from table 2, in 
      other words, there might be non-populated fields from table 1

    ID_STUDENT        STUDENT_NAME     LOCKER   

        3               Eduardo          l1
        4               Luiz             l2
        5               -                l3

-Outter join of table 1 and table 2:

    - Returns all records from both tables, in other words, there
      might be non-populated fields either from table 1 or 2.

    ID_STUDENT        STUDENT_NAME     LOCKER   
        1               Raony            -
        2               Diogo            -
        3               Eduardo          l1
        4               Luiz             l2
        5               -                l3

4

LEFT JOIN그리고 RIGHT JOIN유형입니다 OUTER JOIN.

INNER JOIN 기본값입니다. 두 테이블의 행이 결합 조건과 일치해야합니다.


5
나는이 답변이 얼마나 많은 공감대를 가지고 있으며 동시에 너무 불완전하다는 것을 믿을 수 없다.
nbro

나는 그것이 원래 질문에 대한 더 나은 대답이라고 생각합니다.
RussellH

3

내부 조인 : 두 테이블의 데이터가있을 때만 행을 표시합니다.

외부 조인 : (왼쪽 / 오른쪽) :로부터 모든 결과보기 왼쪽 / 오른쪽 쌍 행 (테이블 는 경우) 존재 여부.


2

처음에 조인은 무엇을 이해해야합니까? 여러 테이블을 연결하고 조인 된 테이블에서 특정 결과를 얻습니다. 가장 간단한 방법은 크로스 조인입니다. 입니다.

tableA에 두 개의 열 A와 B가 있고 tableB에 세 개의 열 C와 D가 있다고 가정합니다. 교차 결합을 적용하면 의미없는 행이 많이 생성됩니다. 그런 다음 실제 데이터를 얻으려면 기본 키를 사용하여 일치시켜야합니다.

왼쪽 : 왼쪽 테이블의 모든 레코드와 오른쪽 테이블의 일치하는 레코드를 반환합니다.

오른쪽 : 왼쪽 조인과 반대로 돌아갑니다. 오른쪽 테이블의 모든 레코드와 왼쪽 테이블의 일치하는 레코드를 반환합니다.

내부 : 이것은 교차점과 같습니다. 두 테이블에서 일치하는 레코드 만 반환합니다.

외부 : 그리고 이것은 노동 조합과 같습니다. 두 테이블에서 사용 가능한 모든 레코드를 반환합니다.

때로는 모든 데이터가 필요하지 않으며 일반적인 데이터 나 레코드 만 있으면됩니다. 이러한 조인 방법을 사용하여 쉽게 얻을 수 있습니다. 왼쪽 및 오른쪽 조인은 외부 조인이기도합니다.

교차 조인을 사용하여 모든 레코드를 얻을 수 있습니다. 그러나 수백만 개의 레코드에 관해서는 비용이 많이들 수 있습니다. 따라서 왼쪽, 오른쪽, 내부 또는 외부 조인을 사용하여 간단하게 만드십시오.

감사

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