MySQL : 조인 유형의 빠른 분석


157

MySQL 조인 유형에 대한 빠른 분석을 원합니다. 나는 이것들을 알고 나머지는 그들이 무엇을 의미하는지 잘 모르겠습니다.

  • 쉼표로 구분 (이것이 정확히 무엇 을 의미합니까?) :SELECT * FROM a, b WHERE b.id = a.beeId AND ...
  • b에 일치하는 항목이 없더라도 a의 정보를 표시합니다. SELECT * FROM a LEFT OUTER JOIN b ON b.id = a.beeId WHERE ...

본인은 조인을 볼 수 있지만 다른, 무엇인지하게 알고 싶어 한 INNER/ OUTER추가 않는 LEFT변경 일을.

조인의 작동 방식을 이미 알고 있으며 다른 유형의 조인이 있는지 또는 동일한 결과를 얻는 다른 방법인지 알고 싶습니다.


이것이 귀하의 질문에 대답합니까? "INNER JOIN"과 "OUTER JOIN"의 차이점은 무엇입니까?
philipxy

답변:


463

3
+1이지만 둘 다 누락 cross join되어 직교 곱을 수행합니다.
Denis de Bernardy

11
@denis : codinghorror.com 링크를 자세히 살펴보십시오.There's also a cartesian product or cross join, which as far as I can tell, can't be expressed as a Venn diagram:
Rufinus

1
이 다이어그램을 인쇄하여 내 사무실 벽에 올려 놓는 것에 놀랐습니다. 넌 내 인생을 바꿨어!
yossico

41
문제는 구체적으로 MySQL에 관한 것입니다. MySQL은 FULL OUTER 조인을 지원하지 않습니다.
Mike Baranczak

4
물론 이것은 grafic을 게시하지 않는 이유 여야합니다. 한숨
Rufinus

27

귀하의 의견을 바탕으로, 각각의 간단한 정의는 최고의 발견 W3 스쿨 각 유형의 첫 번째 줄은 유형 가입에 대한 간략한 설명을 제공합니다

  • JOIN : 두 테이블에 하나 이상의 일치 항목이 있으면 행을 반환합니다.
  • LEFT JOIN : 오른쪽 테이블에 일치하는 항목이 없더라도 왼쪽 테이블에서 모든 행을 반환합니다.
  • RIGHT JOIN : 왼쪽 테이블에 일치하는 항목이 없더라도 오른쪽 테이블의 모든 행을 반환합니다.
  • FULL JOIN : 테이블 중 하나에 일치하는 행을 반환

편집 종료

간단히 말해, 쉼표로 구분 된 예제는

SELECT * FROM a, b WHERE b.id = a.beeId AND ...

테이블을 구분하는 쉼표로 테이블 a와 b에서 모든 레코드를 선택하는 것입니다.

SELECT a.beeName,b.* FROM a, b WHERE b.id = a.beeId AND ...

그런 다음 b.id 열과 a.beeId 열이 예제에서 일치하는 행에 지시 정보를 가져옵니다. 따라서 귀하의 예에서는 b.id가 a.beeId와 같은 테이블 a와 b에서 모든 정보를 얻습니다. 이 예에서는 b.id가 a.beeId와 같을 때 b 테이블의 모든 정보와 a.beeName 열의 정보 만 가져옵니다. AND 절도 있으므로 결과를 구체화하는 데 도움이됩니다.

mySQL 조인 및 왼쪽 조인에 대한 간단한 자습서 및 설명은 Tizag의 mySQL 자습서를 살펴보십시오. 당신은 또한 확인하실 수 있습니다 키스 J. 브라운의 웹 사이트를 그 또한 꽤 좋은 조인에 대한 자세한 내용은.

나는 이것이 당신에게 도움이되기를 바랍니다


나는 이미 모든 것을 알고 있습니다. 실제로 존재하는 조인 유형을 찾고있었습니다. 내가 알고있는 것에 대해 잘 모르겠습니다. 그러나 빠른 요약을 얻기 위해 긴 문서를 찾지 않았습니다.
Bryan Field

대답에서 또 다른 언급은 ... 당신이 원하는 것을 더 많이 할 수 있습니다.
Ryan

해당 수정 사항에 +1 나는 일부 사람들처럼 W3Schools에 대해 편견이 없습니다. 아마도 나는 나쁜면을 많이 보지 못했을 수도 있고 아니면 단지 "거룩한 전쟁"일 수도 있습니다. 또한 W3Schools의 내용을 편집했지만 마음에 들지 않기를 바랍니다.하지만 원하는대로 편집 할 수 있습니다. 허용 된 답변의 모든 시각 자료는 훌륭하지만 실제로는 동일한 조인의 변형입니다. 이것은 좋은 대안입니다.
Bryan Field

고마워 George, 나는 편집이 정확하다는 것을 전혀 신경 쓰지 않는다! 나는 사람들이 자신에게 적합한 출처, 더 많거나 적은 정보, 많은 예 또는 아무것도 찾을 필요가 없다고 믿는다. W3Schools는 정확하고 간결하며 Tizag도 비슷합니다. 쉽게 배우자
Ryan

1
mysql에는 FULL JOIN이 없으므로 이러한 링크는별로 유용하지 않습니다.
Ether

13

나는 이와 같은 2 개의 테이블을 가지고있다 :

> SELECT * FROM table_a;
+------+------+
| id   | name |
+------+------+
|    1 | row1 |
|    2 | row2 |
+------+------+

> SELECT * FROM table_b;
+------+------+------+
| id   | name | aid  |
+------+------+------+
|    3 | row3 |    1 |
|    4 | row4 |    1 |
|    5 | row5 | NULL |
+------+------+------+

INNER JOIN은 두 테이블을 모두 걱정합니다.

INNER JOIN은 두 테이블을 모두 관리하므로 두 테이블에 하나만있는 경우에만 행을 얻습니다. 일치하는 쌍이 둘 이상 있으면 여러 행이 나타납니다.

> SELECT * FROM table_a a INNER JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | id   | name | aid  |
+------+------+------+------+------+
|    1 | row1 |    3 | row3 | 1    |
|    1 | row1 |    4 | row4 | 1    |
+------+------+------+------+------+

순서를 반대로해도 두 테이블에 모두 관심이 있기 때문에 INNER JOIN과 아무런 차이가 없습니다.

> SELECT * FROM table_b b INNER JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    4 | row4 | 1    |    1 | row1 |
+------+------+------+------+------+

동일한 행을 얻지 만 다른 순서로 테이블을 언급했기 때문에 열의 순서가 다릅니다.

LEFT JOIN은 첫 번째 테이블에만 관심이 있습니다.

LEFT JOIN은 첫 번째 테이블에 관심이 있고 두 번째 테이블에 대해서는별로 신경 쓰지 않으므로 두 번째 테이블에 해당하는 행이없는 경우에도 항상 첫 번째 테이블에서 행을 가져옵니다.

> SELECT * FROM table_a a LEFT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | id   | name | aid  |
+------+------+------+------+------+
|    1 | row1 |    3 | row3 | 1    |
|    1 | row1 |    4 | row4 | 1    |
|    2 | row2 | NULL | NULL | NULL |
+------+------+------+------+------+

위에서 table_a의 모든 행을 볼 수 있지만 일부는 테이블 b의 내용과 일치하지 않지만 table_b의 모든 행은 아닙니다-table_a의 내용과 일치하는 행만 볼 수 있습니다.

테이블 순서를 반대로 바꾸면 LEFT JOIN은 다르게 동작합니다.

> SELECT * FROM table_b b LEFT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    4 | row4 | 1    |    1 | row1 |
|    5 | row5 | NULL | NULL | NULL |
+------+------+------+------+------+

이제 table_b의 모든 행을 얻지 만 table_a의 일치하는 행만 가져옵니다.

RIGHT JOIN은 두 번째 테이블에만 관심이 있습니다.

a RIGHT JOIN b와 정확히 같은 행을 가져옵니다 b LEFT JOIN a. 유일한 차이점은 열의 기본 순서입니다.

> SELECT * FROM table_a a RIGHT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | id   | name | aid  |
+------+------+------+------+------+
|    1 | row1 |    3 | row3 | 1    |
|    1 | row1 |    4 | row4 | 1    |
| NULL | NULL |    5 | row5 | NULL |
+------+------+------+------+------+

이것은 table_b LEFT JOIN table_aLEFT JOIN 섹션에서 보았던 것과 같은 행 입니다.

비슷하게:

> SELECT * FROM table_b b RIGHT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    4 | row4 | 1    |    1 | row1 |
| NULL | NULL | NULL |    2 | row2 |
+------+------+------+------+------+

와 같은 행 table_a LEFT JOIN table_b입니다.

전혀 참여하지 않아도 모든 사본이 제공됩니다.

Join 절 없음 : JOIN 절을 전혀 사용하지 않고 쉼표로 구분하여 테이블을 작성하면 첫 번째 테이블의 모든 행이 두 번째 테이블의 모든 행 옆에 가능한 모든 조합으로 작성됩니다.

> SELECT * FROM table_b, table_a;        
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    3 | row3 | 1    |    2 | row2 |
|    4 | row4 | 1    |    1 | row1 |
|    4 | row4 | 1    |    2 | row2 |
|    5 | row5 | NULL |    1 | row1 |
|    5 | row5 | NULL |    2 | row2 |
+------+------+------+------+------+

(이것은 내 블로그 게시물 에서 SQL 조인 유형의 예입니다 )


@Anu 평판이 낮다는 것은 다른 사람들이 편집 내용을 검토해야한다는 의미 일 때 사소한 편집을하지 마십시오. 시간을 낭비하고 있습니다. 그 수정 사항은 차이가 없었으므로 거부되었습니다. 변경 한 코드가 실제로 잘못되지 않았으며 주석을 달 수 있습니다.
philipxy

@philipxy 좋아. 그 점에 주목하십시오. 설명을 이해하려고 시도하는 동안 나는 오타를 보았으므로 더 명확하게 편집했습니다. 실제로 이것은 좋은 대답이며 내 의도는 더 잘 유지하는 것이 었습니다.
Anu

@Anu이 답변은 대부분의 답변과 동일하게 조각난 불완전한 설명을 가지고 있습니다. 실제로 출력이 입력의 함수로 무엇인지 말하지 않습니다. 두 페이지의 제안 된 사본 및 내 의견에 대한 거의 모든 답변도 참조하십시오. 내 답변도 참조하십시오. 추신 : 나는 어제 다시 편집 크기를 재검토 하여 이것을 보았습니다 (물론 Meta Stack Overflow & Meta Stack Exchange에 더 많은 관련 게시물이 있습니다.)
philipxy

11

전체 외부 조인은 mysql에 존재하지 않으므로 왼쪽 및 오른쪽 조인 조합을 사용해야 할 수도 있습니다.

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