왼쪽 가입보다 오른쪽 가입을 선호하는 이유


18

내가 올바르게 이해하면 모든 RIGHT JOIN:

SELECT Persons.*, Orders.*
FROM Orders
RIGHT JOIN Persons ON Orders.PersonID = Persons.ID

로 표현 될 수있다 LEFT JOIN:

SELECT Persons.*, Orders.*
FROM Persons
LEFT JOIN Orders ON Persons.ID = Orders.PersonID

내 개인적인 의견은 진술의 의도입니다.

  • 먼저 Persons
  • 그런 다음 Persons필요에 따라 확장 / 반복 하여Orders

Persons LEFT JOIN Orders역순보다 순서대로 표현하는 것이 좋습니다 Orders RIGHT JOIN Persons( RIGHT JOIN결과로 사용하지 않습니다 ).

RIGHT JOIN선호 하는 상황 이 있습니까? 아니면 할 수없는 RIGHT JOIN일을 LEFT JOIN할 수 있는 사용 사례가 있습니까?


12
올바른 조인을 원했던 사례를 기억할 수 없습니다. 쿼리의 실행 계획이 성능상의 이유로 왼쪽 조인을 오른쪽 조인으로 뒤집은 경우가 있습니다. 그러나 순수한 코드 작성 관점에서 볼 때, 올바른 조인을 작성하는 것을 기억하지 못합니다.
Brandon

2
이것을 "코드 설명, 작성 또는 디버깅"에 대한 질문으로 보지 않습니다. 언어에 실제로 동일한 기능을하는 두 가지 기능이있는 이유, 실제로 언어간에 차이가있는 경우와 "명백하지 않은"언어가 선호되는 경우를 묻는 것입니다.
Philip Kendall

1
아니요, 왼쪽 조인은 거의 항상 간결하게 필요한 내용을 캡처하므로 추론하기가 더 쉽습니다. 내 직장에서는 실제로 필요한 경우가 없기 때문에 올바른 조인을 방지 할 수있는 표준이 있습니다 (즉, 항상 반대쪽 왼쪽 조인으로 대체 할 수 있음).
mgw854

8
마감 투표를 재설정했습니다. 조인 간의 차이를 이해하면 소프트웨어 디자인에 영향을 미치기 때문에이 질문에 대한 주제가 여기에 있습니다 (데이터베이스 디자인은 데이터베이스를 쿼리 할 수있는 알고리즘과 마찬가지로 소프트웨어 디자인의 일부입니다). 데이터베이스 관리자 에서도 주제가 있을 수 있으며 중복 된 항목 도 있을 수 있습니다.
토마스 오웬스

1
그것이 RIGHT JOIN권장 되는지 또는 더 일반적인지 제안하는 지 확실하지 않습니다 . 그것이 당신의 전제라면 틀린 것입니다. 코드 나 예제에서 올바른 조인이 사용 된 것을 본 적이 없습니다. 그건 JOINLEFT OUTER JOIN. 드문 경우지만을 볼 수 있습니다 FULL OUTER JOIN.
JimmyJames

답변:


12

그것은 당신이 성취하려는 요구 사항에 달려 있습니다.

"모든 사람과 해당 주문을 주문하십시오" 라고 말하는 것은 동일하지 않습니다. 특히 해당하는 사람is null 과 일치하지 않는 행을 가져 오는 데 사용 하려는 경우 "해당 사람과 함께 모든 주문을 원합니다 "라고 말합니다 . 이것이 바로 "주요 테이블"이라고 부르는 것인데, 조인의 다른쪽에 해당 행이 없는지 여부에 관계없이 행을 가져오고 자하는 테이블입니다.

이 이미지를 보면 동일하지 않다는 것을 알 수 있습니다.

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

이미지의 출처는이 훌륭한 기사 입니다.

그러나 조인에서 테이블의 순서를 반전시키는 조인으로 두 요구 사항을 모두 충족시킬 수 있습니다.

그러나 왼쪽에서 오른쪽으로 쓰는 데 익숙한 서양인의 경우 오른쪽 조인보다 왼쪽 조인을 사용하는 것이 더 자연 스럽습니다. . 왜냐하면 조인이 selected 열과 동일한 방향 또는 동일한 순서로 있기를 원하기 때문 입니다.

따라서 올바른 조인을 선호하는 가능한 이유는 문화에서 오른쪽에서 왼쪽으로 (아랍어 또는 히브리어 쓰기 시스템에서와 같이) 쓰고 그렇게 생각하는 경향이 있기 때문입니다. 아마도 두뇌 텍스트 정보에서 오른쪽에서 왼쪽으로 흐를 수 있습니다. .

일부 언어 학자들은 당신의 언어가 당신의 사고 방식에 영향을 미친다고 생각합니다 : https://www.edge.org/conversation/lera_boroditsky-how-does-our-language-shape-the-way-we-think


1
나는이 선들을 따라 생각하기 시작했지만 그것이 옳다고 생각하지는 않는다. 나는 히브리어로 SQL을 작성하는 것을 상상하기 시작했다. 확인 : 오른쪽 정렬, 오른쪽에서 왼쪽, 위에서 아래로. 테이블 A를 먼저 언급 한 다음 테이블 B를 언급 할 것입니다. 올바른 조인을 사용하면 먼저 언급 된 대부분 또는 모든 테이블을 제외시킵니다 (특히 널 (NULL)의 경우). 나는 인간의 마음을 연결하는 경향이 있다고 생각 첫째가장 중요한 . 쓰기 방향에 관계없이 발생합니다. "FIRST JOIN"과 "SECOND JOIN"이라고 부를 수 있으며이 편차는 여전히 발생합니다.
Mike는 Monica를 지원합니다.

아래에 표시된 이미지에 대한 링크를 포함 시켰습니다.
Jon Raynor

@Mike 나는 사람들이 아랍어 나 히브리어로 SQL을 쓰라고 제안하지 않는다. 아마도 모국어의 방향이 오른쪽 조인을 선호하는 이유 일 수 있습니다. 그러나 그것은 단지 가능성입니다. 왼쪽 조인이 더 자연 스럽습니다.
Tulains Córdova

이제 이미지의 제작자에게 적법한 크레딧을주었습니다. 몇 년 동안 HD로 사용해 왔으며 어디에서 왔는지 기억이 나지 않습니다.
Tulains Córdova

나는 히브리어에 능통하며 여전히 LEFT JOIN더 자연 스러워 보입니다 .
Zev Spitz 2016

3

왼쪽 조인으로는 수행 할 수없는 오른쪽 조인으로 수행 할 수있는 항목 (내가 아는 것)이 없습니다. 그러나 때로는 왼쪽 조인이있는 구문이 더 나쁩니다. 다음 테이블이 있다고 가정 해 봅시다.

Persons
ID | Name

Orders
ID | CustomerId | other unimportant stuff

SpecialOrderDetails
ID | OrderId | other stuff

데이터베이스에있는 모든 사람과 특별 주문 세부 정보가있는 주문 목록을 가져와야한다고 가정합니다 (모든 주문에 특별 주문 세부 정보가있는 것은 아닙니다). 따라서 일반적으로 사람들에서 주문으로 왼쪽 조인을 수행합니다. 그러나 특별 주문 세부 사항에 참여해야합니다. 내부 조인을 사용하면 사람들에서 주문으로 왼쪽 조인을 효과적으로 내부 조인으로 만들 수 있습니다. IE : 이것은 당신이하고 싶지만 작동하지 않습니다 (특별한 주문을하지 않은 사람은 제외) :

select p.*, o.*, d.*
from Persons p
left join Orders o on o.CustomerId = p.Id
inner join SpecialOrderDetails d on d.OrderId = o.Id

따라서 다음과 같이 다시 작성할 수 있습니다.

--get all the people without a special order
select p.*, NULL, NULL, ... --NULLs placeholders for all the fields from OrderDetails and SpecialOrderDetails
from Persons p
left join Orders o on o.CustomerId = p.Id
left join SpecialOrderDetails d on d.OrderId = o.Id
where o.Id is null 

union

--get all the people with a special order
select p.*, o.*, d.*
from Persons p
inner join Orders o on o.CustomerId = p.Id
inner join SpecialOrderDetails d on d.OrderId = o.Id

명확하지는 않지만 (의견이 없다고 가정) 작업을 수행합니다. 올바른 조인을 사용하여 일회성 이상인 경우 (예 : 누군가 다시 와서 언젠가 유지해야하는 것) 의도가 무엇인지 더 명확하게 만들 수 있습니다.

select p.*, o.*, d.*
from Orders o
inner join SpecialOrderDetails d on d.OrderId = o.Id
right join Persons p on p.Id = o.CustomerId

어느 것이 더 간결하고 명확합니다 (그러나 읽는 사람이 올바른 조인을 이해하는 경우에만). 왼쪽 조인으로 작성할 수 있지만 중첩 조인이 필요합니다 (오른쪽 조인보다 친숙하지 않은 사람).

select p.*, o.*, d.*
from Persons p
left join Orders o 
    inner join SpecialOrderDetails d on d.OrderId = o.Id
on o.CustomerId = p.Id

이 시점에서 가장 명확한 내용과 대부분의 사람들이 이해할 내용을 선택합니다 (내포 된 조인이라고하는 것을 모르는 경우 해당 구문을 구글하는 방법을 알고 있습니까?).

요컨대, 올바른 조인이 꼭 필요한 것은 아니지만 쉽게 읽을 수 있습니다.


아마 당신은 오른 손잡이 인 것 같아요.
Robert Harvey

이 경우 여러 개의 왼쪽 조인을 작성할 수없는 이유는 다음과 같습니다 SELECT p.*, o.*, d.* FROM Persons p LEFT JOIN Orders o ON o.CustomerID = p.ID LEFT JOIN SpecialOrders d ON o.Id = d.OrderID.
Zev Spitz

@RobertHarvey 저는 그렇습니다. 그러나 그것과 어떤 관련이 있는지 잘 모르겠습니다.
Becuzz

@ZevSpitz 어쩌면 내가 쓴 내용이 명확하지 않았지만 특별한 주문 세부 정보 레코드가있는 경우에만 주문의 필드를 원한다는 생각이 들었습니다. 한 쌍이 존재하는 경우에만 왼쪽으로 조인하십시오.
Becuzz

-1

RIGHT JOIN이 복제 / 병합 목적으로 사용되는 것을 볼 수 있습니다. 두 개의 테이블 A와 B가 있다고 가정 해 봅시다. A는 왼쪽에 있고 B는 오른쪽에 있습니다. 이 두 테이블간에 데이터를 복제하여 동일하게 만들려고한다고 가정하겠습니다.

A에 있지만 B에는없는 모든 데이터를 표시하려면 왼쪽 조인이됩니다. A에없는 B의 모든 데이터를 표시하려면 오른쪽 조인이됩니다.

따라서 데이터를 병합하고 복제 할 때 LEFT 및 RIGHT가 유용한 경우가 있습니다.

그 외에도 테이블을 정렬하거나 시각화하는 방법에 따라 모든 RIGHT 조인을 LEFT 조인으로 변환하거나 그 반대로 모든 LEFT 조인을 RIGHT 조인으로 변환 할 수 있으므로 RIGHT 조인을 사용하는 다른 이유는 없습니다. 따라서 다른 경우에는 선호의 문제입니다.

다음은 SQL 조인을 시각화하는 좋은 링크입니다.

http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins


-1

왼쪽 조인은 오른쪽 조인의 반대가 아닙니다. 다른 결과를 제공하는 다음 경우를 확인하십시오.

select * from 
(select 1 as x  where 1=1) a left join 
(select 1 as x  where 1=0) b on a.x=b.x inner join 
(select 1 as x  where 1=1) c on b.x=c.x

select * from 
(select 1 as x where 1=1) c inner join 
(select 1 as x where 1=0) b on c.x=b.x right join 
(select 1 as x where 1=1) a on b.x=a.x

표 b anc c는 항상 내부 결합이지만 첫 번째 a에서는 다른 a에 결합되어 있고 두 번째 a에서는 오른쪽에 결합됩니다.

왼쪽 조인은 행을 반환하지 않지만 오른쪽 조인은 행을 반환합니다.


이것은 접선 주석처럼 읽습니다. 답변 방법
gnat

-2

이 선호 할 이유는 결코 RIGHT JOIN, 그리고 LEFT JOIN훨씬 명확 :

Persons. *, Orders. *를 선택하십시오. Persons에서 왼쪽으로 Join Persons on Persons.ID = Orders.PersonID

쿼리중인 테이블을 즉시 확인할 수 있습니다. 반면 RIGHT JOIN:

SELECT 사람. * 주문. * 주문 FROM 바로 사람 가입 Orders.PersonID = Persons.ID ON을

첫 번째 테이블은 JOIN.

내 경험상, 나는 본 적이 없다 RIGHT JOIN.


1
이것이 질문에 무엇을 추가합니까? 문제는 차이점이 무엇입니까? ; 문제는 왜 사용해야 RIGHT JOIN합니까? .
Zev Spitz

@ZevSpitz 당신은 어떤 것을 선호하는 이유를 묻습니다, 나는 당신에게 이유를줍니다. 어떤 유스 케이스는 맛의 문제이기 때문에 중요하지 않습니다.
kirie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.