SQL Server에서 왼쪽 조인과 오른쪽 조인의 차이점


225

SQL Server의 조인에 대해 알고 있습니다.

예를 들어. Table1, Table2의 두 테이블이 있습니다.

그들의 테이블 구조는 다음과 같습니다.

create table Table1 (id int, Name varchar (10))

create table Table2 (id int, Name varchar (10))

다음과 같은 Table1 데이터 :

    Id     Name     
    -------------
    1      A        
    2      B    

다음과 같은 Table2 데이터 :

    Id     Name     
    -------------
    1      A        
    2      B 
    3      C

아래 언급 된 SQL 문을 모두 실행하면 두 출력이 동일합니다.

select *
from Table1
  left join Table2 on Table1.id = Table2.id

select *
from Table2
  right join Table1 on Table1.id = Table2.id

위의 SQL 문에서 왼쪽과 오른쪽 조인의 차이점을 설명하십시오.

답변:


73
Select * from Table1 left join Table2 ...

Select * from Table2 right join Table1 ...

실제로 완전히 호환됩니다. 그러나 차이점을 보려면 Table2 left join Table1(또는 동일한 쌍 Table1 right join Table2)을 시도 하십시오. Table2에는 Table1에없는 id를 가진 행이 있으므로이 쿼리는 더 많은 행을 제공해야합니다.


17
그렇다면 RIGHT JOIN원하는 결과를 얻을 수 있다면 왜 LEFT JOIN필요한가? : P
user1857492 5

1
@SilapAliyev 사실 아주 좋은 질문입니다. 누구나 대답 할 수 있습니까? : D
Ian Chu Te

21
Select * from Table1 left join Table 2표 1의 Select * from Table1 right join Table 2모든 레코드와 표 2의 일치 레코드를 모두 리턴합니다 . 반대의 경우 표 2의 모든 레코드와 표 1의 일치 레코드를 리턴합니다.
Programador Adagal

3
2 개 이상의 테이블을 사용하는 경우, 오른쪽 조인을 사용하는 것이 의미 있고 읽을 수 있습니다.
ʞɔıɥʇɹɐʞ ouɐɯ

1
@MarkusMeskanen 당신은 7 단어의 간단한 문장을 변경하고 있습니다. 여러 문장으로 된 356 줄의 문장이 있고 Left Right의 논리를 바꿔야 할 때 한 단어로만 바꾸는 것이 궁금합니다.
Programador Adagal

1014

Codeproject에는 다음과 같은 SQL 조인의 간단한 기본 사항을 설명하는이 이미지가 있습니다. http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx SQL 조인 설명


64
거기에는 '세부 사항'이별로 없습니다. 크레딧은 실제로 나 대신 코드 프로젝트 페이지로 이동해야합니다. 그러나 나는 물론주의를 신경 쓰지 않는다 :-)
Daan Timmer

6
@Daan Timmer 아니오, 당신에게도 신용이 있어야합니다! 특정 및 특정 수요를 충족시키기 위해 재 포장 및 재판매합니다. 소매 업체들은 $$ 수십억 같은 일을 얻을
BKSpurgeon

"조인 제외"의 마지막 그림의 where 절에서 "AND"조건이 필요할 수 있다고 생각합니다. I 쿼리 요구를 선택하도록 업데이트 느낌 <select_list> Table_A 완전 외부 FROM A.Key B.Key = ON Table_B B 가입 WHERE A.Key IS NULL AND B.Key가 null
vinsinraw

@vinsinraw는 필요하지 않습니다. 그것은 이미 조건에 의해 커버되기 때문에 : JOIN Table_B b ON A.Key = B.Key. OR 조건은 잘 작동합니다.
Daan Timmer

이것은 벤 다이어그램의 일반적인 남용입니다. 원 A와 B 는 테이블 A와 B를 나타내지 않으며 , 원 A는 A 왼쪽 조인 B이고 cirlce B는 A 오른쪽 조인 B입니다. 또한 ON 조건이 무엇인지 및 키가 관련이 없으며 모든 것이 작동하지 않는 곳도 중요하지 않습니다. 케이스. 내 의견 및 답변을 참조하십시오 이 페이지재 벤 다이어그램이 섹션 .
philipxy

37

데이터를 가져 오는 테이블은 'LEFT'입니다.
가입하려는 테이블이 'RIGHT'입니다.
왼쪽 가입 : 왼쪽 테이블에서 모든 항목을 가져오고 오른쪽 테이블에서 일치하는 항목 만 가져옵니다.
RIGHT JOIN : 오른쪽 테이블에서 모든 항목을 가져오고 왼쪽 테이블에서 일치하는 항목 만 가져옵니다.
그래서:

Select * from Table1 left join Table2 on Table1.id = Table2.id  

제공합니다 :

Id     Name       
-------------  
1      A          
2      B      

그러나:

Select * from Table1 right join Table2 on Table1.id = Table2.id

제공합니다 :

Id     Name       
-------------  
1      A          
2      B   
3      C  

당신은 바로 더 행이 테이블에 적은 행이 테이블에 합류했다

더 많은 행과 함께 테이블에 적은 행이 테이블에 합류 왼쪽, 다시
시도하십시오

 If Table1.Rows.Count > Table2.Rows.Count Then  
    ' Left Join  
 Else  
    ' Right Join  
 End If  

22

(INNER) JOIN : 두 테이블에서 일치하는 값을 가진 레코드를 반환합니다.

LEFT (OUTER) JOIN : 왼쪽 테이블에서 모든 레코드를 반환하고 오른쪽 테이블에서 일치하는 레코드를 반환합니다.

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

FULL (OUTER) JOIN : 왼쪽 또는 오른쪽 테이블에 일치하는 항목이 있으면 모든 레코드를 반환합니다

예를 들어 다음과 같은 레코드가있는 두 개의 테이블이 있다고 가정합니다.

표 A

id   firstname   lastname
___________________________
1     Ram         Thapa
2     sam         Koirala
3     abc         xyz
6    sruthy       abc

표 B

id2   place
_____________
1      Nepal
2      USA
3      Lumbini
5      Kathmandu

내부 조인

참고 : 두 테이블의 교차점을 제공합니다.

내부 조인

통사론

SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

샘플 테이블에 적용하십시오.

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA INNER JOIN TableB ON TableA.id = TableB.id2;

결과는 다음과 같습니다.

firstName       lastName       Place
_____________________________________
  Ram         Thapa             Nepal
  sam         Koirala            USA
  abc         xyz              Lumbini

왼쪽 조인

참고 : TableA에서 선택한 모든 행과 TableB에서 선택한 모든 일반 행을 제공합니다.

왼쪽 조인

SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;

샘플 테이블에 적용하십시오

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA LEFT JOIN TableB ON TableA.id = TableB.id2;

결과는 다음과 같습니다.

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null

바로 가입

참고 : TableB에서 선택한 모든 행과 TableA에서 선택한 모든 공통 행을 제공합니다.

바로 가입

통사론:

SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;

samole 테이블에 적용하십시오.

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA RIGHT JOIN TableB ON TableA.id = TableB.id2;

결과는 bw입니다.

firstName   lastName     Place
______________________________
Ram         Thapa         Nepal
sam         Koirala       USA
abc         xyz           Lumbini
Null        Null          Kathmandu

전체 가입

참고 : 통합 연산과 동일하며 두 테이블에서 선택한 모든 값을 반환합니다.

완전 가입

통사론:

SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;

samp [le 테이블에 적용하십시오 :

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA FULL JOIN TableB ON TableA.id = TableB.id2;

결과는 다음과 같습니다.

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null
 Null         Null      Kathmandu

몇 가지 사실

INNER 조인의 경우 주문은 중요하지 않습니다

(왼쪽, 오른쪽 또는 전체) 외부 조인의 경우 순서가 중요합니다.

w3schools 에서 더 찾기


12
select fields 
from tableA --left
left join tableB --right
on tableA.key = tableB.key

의 테이블 from이 예제에서는 tableA, 관계의 왼쪽에있다.

tableA <- tableB
[left]------[right]

따라서 왼쪽 테이블 ( tableA) 에서 모든 행을 가져 오려면 오른쪽 테이블 ( tableB)에 일치하는 항목이 없더라도 "왼쪽 조인"을 사용합니다.

오른쪽 테이블 ( tableB) 에서 모든 행을 가져 오려면 왼쪽 테이블 ( tableA)에 일치하는 항목이 없더라도을 사용합니다 right join.

따라서 다음 쿼리는 위에서 사용한 것과 동일합니다.

select fields
from tableB 
right join tableA on tableB.key = tableA.key

10

" RIGHT OUTER JOIN사용하는 LEFT OUTER JOIN구문을 다시 작성할 수 있다면 왜 RIGHT OUTER JOIN구문이 있는가?" 라고 묻는 것 같습니다. 이 질문에 대한 답은 언어 디자이너가 사용자에게 그러한 제한을두기를 원하지 않았기 때문에 (그리고 그들이 비판을 받았다고 생각하기 때문에) 사용자가 테이블 순서를 변경하도록 강요했기 때문이라고 생각합니다 에 FROM어떤 상황에서 절 단지가 조인 유형을 변경하는 경우.


때때로 왼쪽 및 오른쪽 외부 조인이 완전히 호환 가능합니까?
아 렉스

4
@Alex : 실제로 왼쪽 및 오른쪽 외부 조인은 항상 호환됩니다.
onedaywhen

8

두 진술은 동일합니다.

대부분의 사람들 LEFT JOIN은 더 직관적 인 것처럼 보이기 때문에 사용 하고 보편적 인 구문이기 때문에 모든 RDBMS를 지원한다고 생각하지는 않습니다 RIGHT JOIN.


"모든 RDBMS가 RIGHT JOIN을 지원하는 것은 아니라고 생각합니다."-모든 RDBMS가 SQL을 지원하는 것은 아닙니다. 그러나 일부 SQL 제품이 지원 LEFT하지만 지원 하지 않는 것을 암시하는 경우 어떤 제품이 지원 RIGHT되는지 표시하십시오.
onedaywhen

10
예를 들어 @onedaywhen, SQLite는 3 구현하지 않습니다 RIGHTFULL OUTER JOIN : sqlite.org/omitted.html
Mac_Cain13

0

나는 우리가 원하는 결과를 얻도록 마지막 그림의 절에 AND조건 이 필요할 수 있다고 생각 합니다. 검색어를 업데이트해야한다고 생각합니다.whereOuter Excluding JOINA Union B Minus A Interaction B

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL AND B.Key IS NULL

를 사용 OR하면 모든 결과를 얻을 수 있습니다.A Union B


0

Table1.id = Table2.id의 Table1 왼쪽 조인 Table2에서 *를 선택하십시오.

첫 번째 쿼리에서 왼쪽 조인왼쪽 테이블 table1오른쪽 테이블 table2를 비교 합니다.

table1의 모든 속성 이 표시되는 반면 table2 에는 조건이 true 인 속성 만 표시됩니다.

Table1.id = Table2.id의 Table2 오른쪽 조인 Table1에서 *를 선택하십시오.

첫 번째 쿼리에서 오른쪽 조인오른쪽 테이블 table1왼쪽 테이블 table2를 비교 합니다.

table1의 모든 속성 이 표시되는 반면 table2 에는 조건이 true 인 속성 만 표시됩니다.

쿼리에 테이블 선언의 순서가 다르기 때문에 두 쿼리는 동일한 결과를 줄 것이다 당신이 선언되어 같은 표 1표 2좌우 각각의 첫번째 왼쪽 조인 쿼리를, 또한 선언 표 1표 2 에서 오른쪽과 왼쪽 에 각각 가입 번째 권리 질문.

이것이 두 쿼리에서 동일한 결과를 얻는 이유입니다. 따라서 다른 결과를 원하면이 두 쿼리를 각각 실행하십시오.

Table1.id = Table2.id의 Table1 왼쪽 조인 Table2에서 *를 선택하십시오.

Table1.id = Table2.id의 Table1 오른쪽 조인 Table2에서 *를 선택하십시오.


0

Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id 정의 : 왼쪽 조인은 "on"키워드 다음의 기준과 일치하는 표 1의 "select"키워드로 언급 된 모든 열과 표 2의 열을 선택합니다.

마찬가지로 정의에 의해 : 오른쪽 조인은 "on"키워드 뒤의 기준과 일치하는 표 2의 "select"키워드로 언급 된 모든 열과 표 1의 열을 선택합니다.

귀하의 질문을 참조하면, 두 테이블의 id는 출력에 던져지는 데 필요한 모든 열과 비교됩니다. 따라서 id 1과 2는 두 테이블에서 공통적이며 결과적으로 첫 번째두 번째 테이블의 idname 열 이있는 네 개의 열이 순서대로 표시됩니다.

*select * from Table1 left join Table2 on Table1.id = Table2.id

위의 표현식은 표 1의 모든 레코드 (행)와 표 1 및 표 2 의 ID 가 일치하는 열을 표 2에서 가져옵니다.

select * from Table2 right join Table1 on Table1.id = Table2.id**

위의 식과 마찬가지로 표 1과 표 2 일치하는 ID 와 표 2 일치하는 테이블 1과 열의 모든 레코드 (행)를 가져옵니다 . (이것은 올바른 조인이므로 table2의 모든 열은 그렇지 않습니다. table1에서 고려됩니다).

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