[mysql] MySQL : 조인 유형의 빠른 분석
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
변경 일을.
조인의 작동 방식을 이미 알고 있으며 다른 유형의 조인이 있는지 또는 동일한 결과를 얻는 다른 방법인지 알고 싶습니다.
답변
또는 좋은 개요를 보려면 다음 링크를 참조하십시오.
http://www.khankennels.com/blog/index.php/archives/2007/04/20/getting-joins/
http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
답변
귀하의 의견을 바탕으로, 각각의 간단한 정의는 최고의 발견 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. 브라운의 웹 사이트를 그 또한 꽤 좋은 조인에 대한 자세한 내용은.
나는 이것이 당신에게 도움이되기를 바랍니다
답변
나는 이와 같은 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_a
LEFT 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 조인 유형의 예입니다 )
답변
전체 외부 조인은 mysql에 존재하지 않으므로 왼쪽 및 오른쪽 조인 조합을 사용해야 할 수도 있습니다.