source

LEFT JOIN을 사용할 때와 INNER JOIN을 사용할 때?

manycodes 2023. 8. 29. 20:44
반응형

LEFT JOIN을 사용할 때와 INNER JOIN을 사용할 때?

저는 항상 사용법을 배운 것 같습니다.LEFT JOIN그리고 나는 종종 그것들이 섞이는 것을 봅니다.INNER다른 페이지에서 동일한 작업을 수행해야 하는 여러 코드 조각에 걸쳐 동일한 유형의 쿼리를 수행합니다.다음과 같습니다.

SELECT ac.reac, pt.pt_name, soc.soc_name, pt.pt_soc_code
FROM
  AECounts ac
  INNER JOIN 1_low_level_term llt on ac.reac = llt.llt_name
  LEFT JOIN 1_pref_term pt ON llt.pt_code = pt.pt_code
  LEFT JOIN 1_soc_term soc ON pt.pt_soc_code = soc.soc_code
LIMIT 100,10000

제가 연구하고 있는 것입니다.

다음과 같은 것이 많이 보입니다.

SELECT COUNT(DISTINCT p.`case`) as count
FROM FDA_CaseReports cr
  INNER JOIN ae_indi i ON i.isr = cr.isr
  LEFT JOIN ae_case_profile p ON cr.isr = p.isr

이것은 좌파가 내부에 있는 것처럼 보입니다. 뭔가 포착할 수 있는 것이 있습니까?

뭔가 잡히는 게 있나요?네, 왼쪽 조인은 바깥쪽 조인의 한 형태인 반면, 안쪽 조인은 안쪽 조인의 한 형태입니다.

여기 그 차이를 보여주는 예가 있습니다.기본 데이터부터 시작하겠습니다.

mysql> select * from j1;
+----+------------+
| id | thing      |
+----+------------+
|  1 | hi         |
|  2 | hello      |
|  3 | guten tag  |
|  4 | ciao       |
|  5 | buongiorno |
+----+------------+

mysql> select * from j2;
+----+-----------+
| id | thing     |
+----+-----------+
|  1 | bye       |
|  3 | tschau    |
|  4 | au revoir |
|  6 | so long   |
|  7 | tschuessi |
+----+-----------+

다음은 내부 조인과 왼쪽 조인의 차이점입니다.

mysql> select * from j1 inner join j2 on j1.id = j2.id;
+----+-----------+----+-----------+
| id | thing     | id | thing     |
+----+-----------+----+-----------+
|  1 | hi        |  1 | bye       |
|  3 | guten tag |  3 | tschau    |
|  4 | ciao      |  4 | au revoir |
+----+-----------+----+-----------+

음, 3줄.

mysql> select * from j1 left join j2 on j1.id = j2.id;
+----+------------+------+-----------+
| id | thing      | id   | thing     |
+----+------------+------+-----------+
|  1 | hi         |    1 | bye       |
|  2 | hello      | NULL | NULL      |
|  3 | guten tag  |    3 | tschau    |
|  4 | ciao       |    4 | au revoir |
|  5 | buongiorno | NULL | NULL      |
+----+------------+------+-----------+

와, 5열!무슨 일입니까?

다음과 같은 외부 결합left join일치하지 않는 행 유지 - ID가 2 및 5인 행은 왼쪽 조인 쿼리에 의해 유지됩니다.나머지 열은 NULL로 채워집니다.

즉, 왼쪽과 안쪽 조인은 서로 교환할 수 없습니다.

여기 대략적인 대답이 있습니다. 그것이 제가 조인에 대해 생각하는 방식입니다.앞에서 언급한 수학 문제로 인해 매우 정확한 답보다 이것이 더 도움이 되기를 바랍니다... ;-)

내부 조인은 행 반환 집합을 좁힙니다.외부 조인(왼쪽 또는 오른쪽)은 반환되는 행 수를 변경하지 않고 가능한 경우 추가 열을 "픽업"하기만 하면 됩니다.

첫 번째 예제에서 결과는 다음 행이 됩니다.AECounts에 지정된 조건과 일치하는 경우1_low_level_term테이블. 그런 다음 해당 행에 대해 결합을 시도합니다.1_pref_term그리고.1_soc_term그러나 일치하는 항목이 없으면 행이 남아 있고 결합된 열은 null입니다.

내부 조인은 두 테이블에 일치하는 값이 있는 행만 반환하는 반면, 왼쪽 조인은 오른쪽 테이블에 일치하는 행이 없더라도 왼쪽 테이블의 모든 행을 반환합니다.

간단한 예

TableA
ID   Value
1    TableA.Value1
2    TableA.Value2
3    TableA.Value3

TableB
ID   Value
2    TableB.ValueB
3    TableB.ValueC

이너 조인은 다음을 생성합니다.

SELECT a.ID,a.Value,b.ID,b.Value 
FROM TableA a INNER JOIN TableB b ON b.ID = a.ID

a.ID    a.Value            b.ID    b.Value
2       TableA.Value2      2       TableB.ValueB
3       TableA.Value3      3       TableB.ValueC

왼쪽 조인은 다음을 생성합니다.

SELECT a.ID,a.Value,b.ID,b.Value 
FROM TableA a LEFT JOIN TableB b ON b.ID = a.ID

a.ID    a.Value            b.ID    b.Value
1       TableA.Value1      NULL    NULL
2       TableA.Value2      2       TableB.ValueB
3       TableA.Value3      3       TableB.ValueC

표 B에 일치하는 행이 없는 경우에도 표 B에 ID = 1인 LEFT JOIN에는 표 A의 행이 포함되어 있지만 표 B에 일치하는 행이 없기 때문에 특히 INER JOIN에는 해당 행이 제외됩니다.

HTH

두 테이블 모두에 조인 조건과 일치하는 결과만 표시하려면 내부 조인을 사용합니다.

표 A의 모든 결과를 원할 때는 왼쪽 조인을 사용하지만 표 B에 표 A의 일부 레코드와 관련된 데이터가 있는 경우 동일한 쿼리에서도 해당 데이터를 사용할 수 있습니다.

두 표의 모든 결과를 원하는 경우 전체 조인을 사용합니다.

초보자들에게는, 제가 어렸을 때 도움이 되었기 때문입니다. 이너 조인은 항상 왼쪽 또는 오른쪽 조인의 하위 집합이며, 이 모든 것은 항상 전체 조인의 하위 집합입니다.그것은 기본적인 생각을 이해하는 데 도움이 되었습니다.

언급URL : https://stackoverflow.com/questions/9798020/when-to-use-left-join-and-when-to-use-inner-join

반응형