태그 보관물: database-design

database-design

왼쪽 가입보다 오른쪽 가입을 선호하는 이유 표현 될 수있다 LEFT JOIN: SELECT

내가 올바르게 이해하면 모든 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할 수 있는 사용 사례가 있습니까?



답변

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

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

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

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

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

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

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

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

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


답변

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

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

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

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


답변

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


답변

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

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에서는 오른쪽에 결합됩니다.

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


답변

이 선호 할 이유는 결코 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.


답변