내부 조인과 외부 조인의 차이점은 무엇입니까?


35

나는 SQL을 처음 사용하고 두 JOIN유형 의 차이점이 무엇인지 알고 싶 습니까?

SELECT * 
FROM user u
INNER JOIN telephone t ON t.user_id = u.id

SELECT * 
FROM user u
LEFT OUTER JOIN telephone t ON t.user_id = u.id

언제 하나를 사용해야합니까?


6
이것이 DBA 질문에 적합합니까? 이것은 나에게 더 코딩 문제인 것 같습니다.
BlackICE


사이트에 잘못되었다고 생각되면 @David VtC. 우리는 항상 다시 열 수 있습니다.
jcolebrand

3
나는 이것이 훌륭한 질문이며 사이트에 매우 적합하다고 생각합니다.
datagod

멍청한 DBA가 DB 성능을 미세 조정하기 위해 소매되지 않는 한, 이것은 DBA에서 제외되어야합니다. : P
AmDB

답변:


32
  • 내부 조인 에만 결합 된 키에 기록을 선택합니다 모두 지정된 테이블을.
  • 왼쪽 외부 조인 첫 번째 테이블의 모든 기록, 조인 키와 일치하는 두 번째 테이블의 모든 레코드를 선택합니다.
  • 오른쪽 외부 조인 두 번째 테이블의 모든 기록, 조인 키와 일치하는 첫 번째 테이블의 모든 레코드를 선택합니다.

첫 번째 예에서는 사용자에 대해 하나 이상의 전화 레코드가 존재하는 경우 사용자 및 전화 번호 목록 만 반환합니다.

두 번째 예에서는 모든 사용자 목록과 사용 가능한 경우 모든 전화 레코드를 반환합니다 (사용할 수없는 경우 NULL전화 값을 얻음 ).


13

누군가이 질문을 할 때마다 대답이 있습니다 : http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

이해하는데 도움이 되길 바랍니다.


3
저는 20 년 동안 조인 작업을 해왔고 그 다이어그램은 저에게 혼란스러워 보였습니다.
Hogan

3
나는 @Hogan에있다-ven 도표는 이것에 대한 최고의 설명이 아니다. 어떤 조합이 리턴 될지를 보여주는 격자가 더 나을 것이다.
Joe

모든 것은 벤 다이어그램을 이해하지 못한다는 것입니다. 조인 유형과 완벽하게 관련되어 있지만 조인을 처음 접하는 사람들을 이해하는 데 도움이되는 도구임을 명심하십시오. 이미 다른 개념을 염두에 두는 것을 배웠다면 익숙하지 않은 것처럼 보일 것입니다. 문제는 없지만 다이어그램의 유용성을 나타내는 좋은 지표는 아닙니다.
JamesRyan

@jamesryan 사실이 아닙니다. 완벽하게 관련이 없으며 조인은 교차 및 합집합이 아닌 세트의 데카르트 곱과 유사합니다. 벤 다이어그램 아날로그는 고유 키를 통해 결합하는 경우에만 작동합니다. 중복 키가 있으면 손실됩니다. 직교 곱 측면.

1
나는 벤 다이어그램이 이미 잘 정의 된 해석, 교차점 및 합집합을 가지고 있다고 강력히 동의하지 않는다. 고유하지 않은 키를 통해 결합 할 때는 결합이이 해석에 맞지 않습니다. 벤 다이어그램을 너무 광범위하게 해석한다고 생각합니다.
Will

8

내부 조인 결합 가입 기준에 따라 할 수있다 반환 행. 외부 조인 ... 수익률이 모든 행을    A의 첫 번째 테이블에서 ... 가입 왼쪽    A의 두 번째 테이블에서 ... 바로 가입    ... A의 두 테이블에서 전체 가입




어느 쪽을 사용할 것인지 선택하는 것은 필요한 데이터를 결정하는 문제입니다. 예를 들어 전화에서 user_ids가 user의 id와 일치하는 레코드 만 필요한 경우 내부 조인을 사용하십시오. 일치하는 전화 항목이없는 사용자의 행도 포함하려면 왼쪽 조인이 적합합니다.

자세한 내용은 StackOverflow에서이 질문을 참조하십시오 .


7

아래와 같은 2 개의 테이블이있는 경우 :

Table1 :   A1    B1          Table2  :    B2     C2 
           -     -                        -      -
           1     2                        1      1
           2     4                        2      4
           3     5                        5      2

Inner Join을 사용하면 다음과 같은 이점이 있습니다.

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2

전체 외부 조인을 사용하면 다음과 같은 이점이 있습니다.

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2
 2      4    NULL     NULL
NULL   NULL    1       1

Left Outer Join을 사용하면 다음과 같은 이점이 있습니다.

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2
 2      4    NULL     NULL

6

외부 조인은 결과적으로 널을 생성하도록 명시 적으로 설계되었으므로 일반적으로 피해야합니다. 관계 적으로 말하자면, 일종의 산탄 총 결혼입니다. 문제의 테이블이 일반적인 유니온 요구 사항을 준수하지 않더라도 테이블을 일종의 유니온으로 만듭니다. 실제로 통합을 수행하기 전에 테이블 중 하나 또는 둘 다를 null로 채우면 결국 일반적인 요구 사항을 준수하게됩니다. 그러나이 예제에서와 같이 패딩이 null 대신 적절한 값으로 수행되지 않아야하는 이유는 없습니다.

SELECT SNO , PNO 
FROM   SP 
UNION  
SELECT SNO , 'nil' AS PNO 
FROM   S 
WHERE  SNO NOT IN ( SELECT SNO FROM SP )

또는 다음과 COALESCE같이 와 함께 SQL 외부 조인 연산자를 사용하여 동일한 결과를 얻을 수 있습니다 .

SELECT SNO , COALESCE ( PNO , 'nil' ) AS PNO 
FROM ( S NATURAL LEFT OUTER JOIN SP ) AS TEMP

CJ Date의 "SQL 및 관계 이론 : 정확한 SQL 코드 작성 방법"에서 외부 조인 (4.6)에 대한 설명


5

내부 조인은 키가 두 테이블 모두에있는 결과 만 표시되는 조인입니다. 외부 조인은 한 테이블의 모든 키에 대한 결과를 표시합니다 (첫 번째의 왼쪽 조인 및 두 번째의 오른쪽 조인). 예를 들면 다음과 같습니다.

table1에 (1, a), (2, b), (3, c) 기본 키와 데이터 쌍이 있다고 가정합니다.

또한 table2에 (1, fun), (3, can), (4, 일어날 수있는) 기본 키와 데이터 쌍이 있다고 가정 해 봅시다.

따라서 기본 키에서 table1과 table2의 내부 조인은 다음과 같은 결과 삼중 항을 생성합니다 (공통 기본 키, 첫 번째 테이블의 두 번째 항목 두 번째 및 두 번째 테이블의 두 번째 항목 세 번째) : (1, a, fun), ( 3, c, 캔)

기본 키에서 table1과 table2의 왼쪽 외부 조인은 다음과 같은 결과 트리플렛을 생성합니다 (위와 동일한 형식) : (1, a, fun), (2, b, NULL), (3, c, can)

기본 키에서 table1과 table2의 오른쪽 외부 조인은 다음과 같은 결과 삼중 항을 생성합니다 (위와 동일한 형식) : (1, a, fun), (3, c, can), (4, NULL, 발생)

이것이 개념을 잘 설명하기를 바랍니다.


4

좀 더 직관적으로 설명하겠습니다.

내부 참여는 전화 번호와 함께 하나 이상의 전화를 가진 사용자를 보여줍니다.

왼쪽 외부 조인에는 전화가없는 '사용자'가 추가로 나열됩니다.


4

언제 무엇을 사용할 것인지 물었으므로 여기에 쿼리 시나리오가 있습니다. 요구 사항에 따라 사용할 것을 선택하십시오.

데이터:

테이블 사용자에는 10 개의 레코드가 있습니다. 표 Phoneno에는 6 개의 레코드가 있습니다 (1 : 1 관계로 PhoneNo의 항목은 사용자의 한 항목 만 참조하고 PhoneNo의 한 항목 만 사용자의 특정 항목을 참조 할 수 있음).

요구 사항 1 : 모든 사용자에게 전화 번호를 표시하십시오. 전화 번호가없는 사용자는 무시하십시오.

질문:

SELECT u.uid, u.name, p.phonno 
  FROM user u 
INNER JOIN phones p ON p.uid = u.uid

결과 : 전화 번호를 가진 6 명의 사용자를 표시합니다

요구 사항 2 : 모든 사용자에게 전화 번호를 표시하십시오. 사용자에게 전화 디스플레이 'N / A'가없는 경우 (사용할 수 없음)

질문:

SELECT u.uid, u.name, ifnull(p.phonno,'N/A') 
  FROM user u 
LEFT OUTER JOIN phones p ON p.uid = u.uid

결과:

10 개의 레코드를 모두 표시

참고 : ifnull은 null 값을 변환하는 MySql 구문입니다. phonno가 null 일 때이 기능을 사용하여 DB 엔진에 'N / A'를 표시했습니다. 다른 DBMS를 사용하는 경우 적절한 기능을 찾으십시오. SQL Server에서는 CASE명령문 을 사용해야합니다 .

이게 도움이 되길 바란다.

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