차이 - sql right join




"INNER JOIN"과 "OUTER JOIN"의 차이점은 무엇입니까? (20)

또한 어떻게 LEFT JOIN , RIGHT JOINFULL JOIN 적합합니까?


"INNER JOIN"과 "OUTER JOIN"의 차이점은 무엇입니까?

그것들은 SQL에서 가장 일반적으로 사용되는 존재 연산자이며, INNER JOIN'존재'에 사용되고 '존재 LEFT OUTER JOIN하지 않습니다'에 사용됩니다.

다음 쿼리를 고려하십시오.

users who have posted and have votes
users who have posted but have no badges

세트 기반 솔루션 (산업 용어)을 찾는 사람들은 각 쿼리를 다음과 같이 인식합니다.

users who have posted INTERSECT users who have votes
users who have posted MINUS users who have badges

표준 SQL로 변환 :

SELECT UserId FROM Posts
INTERSECT 
SELECT UserId FROM Votes;

SELECT UserId FROM Posts
EXCEPT 
SELECT UserId FROM Badges;

다른 사람들은 유사한 집합의 집합을 생각할 것입니다.

users who have posted and IN the set of users who have votes
users who have posted and NOT IN the set of users who have badges

표준 SQL로 변환 :

SELECT UserId 
  FROM Posts
 WHERE UserId IN ( SELECT UserId FROM Votes );

SELECT UserId 
  FROM Posts
 WHERE UserId NOT IN ( SELECT UserId FROM Badges );

어떤 사람들은 세트 안에서 '존재'의 관점에서 생각할 것입니다.

users who have posted and EXIST in the set of users who have votes
users who have posted and do NOT EXIST in the set of users who have badges

표준 SQL (우리가 지금 즉, 범위 변수를 사용할 필요가주의로 이러한 번역 p, v, b) :

SELECT p.UserId 
  FROM Posts p
 WHERE EXISTS ( SELECT *
                  FROM Votes v
                 WHERE v.UserId = p.UserId );

SELECT p.UserId 
  FROM Posts p
 WHERE NOT EXISTS ( SELECT *
                      FROM Badges b
                     WHERE b.UserId = p.UserId );

그러나 "업계 표준"방식은 배타적으로 조인을 사용하는 것으로 나타났습니다. 나는 생각이 무엇인지 모르겠다. ( 악기의 법칙 ? 조기 최적화 ?), 나는 곧 문법으로 간다.

SELECT p.UserId 
  FROM Posts p
       INNER JOIN Votes v ON v.UserId = p.UserId;

SELECT p.UserId 
  FROM Posts p
       LEFT JOIN Badges b ON b.UserId = p.UserId
 WHERE b.UserId IS NULL;

주의 사항 :

  • 유일한 투영에서입니다 Users하지만 우리는 여전히 모든 범위 변수 (필요 p, v, b검색 조건을).
  • UserId IS NULL검색 조건에 '속'하여 OUTER JOIN만 쿼리에 연결된다.
  • LEFT업계 표준입니다 : 전문가가 사용하지 않도록 쿼리를 다시 작성합니다 RIGHT!
  • 에서 OUTER키워드 LEFT OUTER JOIN는 생략됩니다.

맺음말:

가 {조인은 값이 존재하는지 또는 다른 세트에 존재하지 않는지 여부만을 판별하기 위해 조회에서 사용되는 경우가 있습니다. 예상되는 애트리뷰트 (조의 컬럼)를 조심스럽게 살펴 보는 법을 배운다 SELECT. 조인 된 테이블이 없으면 단순히 실존 연산자로 사용된다. 또한 외부 조인의 <key_column> IS NULL경우 WHERE절 에있는 인스턴스를 찾습니다 .


내부 결합

일치하는 행만 검색합니다 (즉, A intersect B .

SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

왼쪽 외부 조인

첫 번째 테이블의 모든 레코드와 조인 된 키와 일치하는 두 번째 테이블의 레코드를 선택하십시오.

SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

전체 외부 조인

두 번째 테이블의 모든 레코드와 조인 된 키와 일치하는 첫 번째 테이블의 레코드를 선택하십시오.

SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

참고 문헌


간단한 단어로 :

내부 조인 은 일치하는 행만을 검색합니다.

외부 조인 은 한 테이블에서 일치하는 행을 검색하고 다른 테이블에서는 모든 행을 검색하는 반면 결과는 사용중인 테이블에 따라 다릅니다.

  • 왼쪽 : 오른쪽 테이블의 행과 왼쪽 테이블의 모든 행

  • 오른쪽 : 왼쪽 테이블의 행과 오른쪽 테이블의 모든 행 또는

  • 전체 : 모든 테이블의 모든 행. 경기가 있는지 여부는 중요하지 않습니다.


내부 조인은 조인 된 테이블에 관련 ID가있는 레코드가 있어야합니다.

외부 조인은 오른쪽에 아무것도 없더라도 왼쪽에 대한 레코드를 반환합니다.

예를 들어 Orders 및 OrderDetails 테이블이 있습니다. 그것들은 "OrderID"와 관련이있다.

명령

  • 주문 아이디
  • 고객 이름

주문 세부 정보

  • OrderDetailID
  • 주문 아이디
  • 상품명
  • 수량
  • 가격

요청

SELECT Orders.OrderID, Orders.CustomerName
  FROM Orders 
 INNER JOIN OrderDetails
    ON Orders.OrderID = OrderDetails.OrderID

OrderDetails 테이블에 항목이있는 Orders 만 반환합니다.

OUTER LEFT JOIN으로 변경하면

SELECT Orders.OrderID, Orders.CustomerName
  FROM Orders 
  LEFT JOIN OrderDetails
    ON Orders.OrderID = OrderDetails.OrderID

OrderDetails 레코드가없는 경우에도 Orders 테이블의 레코드를 리턴합니다.

이를 사용하여 WHERE OrderDetails.OrderID IS NULL 과 같은 where 절을 추가하여 고아가 된 순서를 나타내는 OrderDetails가없는 Order를 찾을 수 있습니다.


다음은 Graham Ellis의 기사 " MySQL - LEFT JOIN 및 RIGHT JOIN, INNER JOIN 및 OUTER JOIN "에서 그의 블로그 Horse 's Mouth에서 가져온 것입니다.

MySQL과 같은 데이터베이스에서 데이터는 다수의 테이블로 나누어지고, 여러 테이블에서 레코드를 읽는 SELECT 명령에서 JOIN 에 의해 함께 연결 ( Joined )됩니다. 이 예제를 읽고 어떻게 작동하는지 확인하십시오.

첫째, 몇 가지 샘플 데이터 :

people
    mysql> select * from people;
    +------------+--------------+------+
    | name       | phone        | pid  |
    +------------+--------------+------+
    | Mr Brown   | 01225 708225 |    1 |
    | Miss Smith | 01225 899360 |    2 |
    | Mr Pullen  | 01380 724040 |    3 |
    +------------+--------------+------+
    3 rows in set (0.00 sec)

property
    mysql> select * from property;
    +------+------+----------------------+
    | pid  | spid | selling              |
    +------+------+----------------------+
    |    1 |    1 | Old House Farm       |
    |    3 |    2 | The Willows          |
    |    3 |    3 | Tall Trees           |
    |    3 |    4 | The Melksham Florist |
    |    4 |    5 | Dun Roamin           |
    +------+------+----------------------+
    5 rows in set (0.00 sec)

REGULAR JOIN

정규 JOIN (INNER, OUTER, LEFT 또는 RIGHT 키워드 없음)을 수행하면 두 테이블의 적절한 방식으로 일치하는 모든 레코드를 가져오고 일치하지 않는 들어오는 테이블의 레코드는보고되지 않습니다 :

mysql> select name, phone, selling 
from people join property 
on people.pid = property.pid;
+-----------+--------------+----------------------+
| name      | phone        | selling              |
+-----------+--------------+----------------------+
| Mr Brown  | 01225 708225 | Old House Farm       |
| Mr Pullen | 01380 724040 | The Willows          |
| Mr Pullen | 01380 724040 | Tall Trees           |
| Mr Pullen | 01380 724040 | The Melksham Florist |
+-----------+--------------+----------------------+
4 rows in set (0.01 sec)

LEFT JOIN

LEFT JOIN을 수행하면 같은 방식으로 일치하는 모든 레코드를 얻습니다. 추가적으로 조인의 왼쪽 테이블에있는 각 일치하지 않는 레코드에 대해 추가 레코드를 얻습니다. 따라서 모든 PERSON이 언급을 얻도록합니다 (이 예제에서). :

   mysql> select name, phone, selling 
    from people left join property 
    on people.pid = property.pid; 
    +------------+--------------+----------------------+
    | name       | phone        | selling              |
    +------------+--------------+----------------------+
    | Mr Brown   | 01225 708225 | Old House Farm       |
    | Miss Smith | 01225 899360 | NULL <<-- unmatch    |
    | Mr Pullen  | 01380 724040 | The Willows          |
    | Mr Pullen  | 01380 724040 | Tall Trees           |
    | Mr Pullen  | 01380 724040 | The Melksham Florist |
    +------------+--------------+----------------------+
    5 rows in set (0.00 sec)

오른쪽 조인

RIGHT JOIN을 수행하면 일치하는 모든 레코드를 가져오고 ADOTION은 조인의 오른쪽 테이블에있는 각 일치하지 않는 레코드에 대한 추가 레코드를 얻습니다. 예를 들어, 우리는 그렇지 않은 경우에도 각 속성이 언급을 얻는다는 것을 의미합니다 판매자 세부 정보 :

mysql> select name, phone, selling 
from people right join property 
on people.pid = property.pid;
+-----------+--------------+----------------------+
| name      | phone        | selling              |
+-----------+--------------+----------------------+
| Mr Brown  | 01225 708225 | Old House Farm       |
| Mr Pullen | 01380 724040 | The Willows          |
| Mr Pullen | 01380 724040 | Tall Trees           |
| Mr Pullen | 01380 724040 | The Melksham Florist |
| NULL      | NULL         | Dun Roamin           |
+-----------+--------------+----------------------+
5 rows in set (0.00 sec)

INNER JOIN은 첫 번째 예와 마찬가지로 전체 조인을 수행하며, OUTER라는 단어는 마지막 두 예제에서 LEFT 또는 RIGHT 단어 뒤에 추가 될 수 있습니다. 이는 ODBC 호환성을 위해 제공되며 추가 기능을 추가하지 않습니다.



벤 다이어그램은 실제로 나를 위해 그것을하지 않습니다.

예를 들어, 십자가 조인과 내부 조인간에 구분을 나타내지 않거나,보다 일반적으로 다른 유형의 조인 술어간에 어떤 구별을 나타내거나 조인 술어의 작동 방식에 대한 추론을위한 프레임 워크를 제공합니다.

논리적 처리를 이해할 수있는 대체물이 없으며 어쨌든 이해하기가 상대적으로 쉽습니다.

  1. 교차 결합을 상상해보십시오.
  2. 조건절이 true 평가되는 행을 유지하면서 1 단계의 모든 행에 대해 on 절을 평가 true
  3. 외부 조인의 경우에만 2 단계에서 손실 된 외부 행을 다시 추가하십시오.

(주의 : 실제로 쿼리 최적화 프로그램은 위의 순전히 논리적 인 설명보다 쿼리를 실행하는 데 더 효율적인 방법을 찾을 수 있지만 최종 결과는 동일해야합니다.)

전체 외부 조인 의 애니메이션 버전부터 시작하겠습니다. 추가 설명은 다음과 같습니다.

설명

소스 테이블

먼저 CROSS JOIN (일명 Cartesian Product)으로 시작하십시오. 이것은 ON 절이없고 단순히 두 테이블의 모든 행 조합을 반환합니다.

Select A.Colour, B.Colour 교차 결합 B

내부 조인과 외부 조인에는 "ON"절이 있습니다.

  • 내부 결합. 교차 조인 결과의 모든 행에 대해 "ON"절의 조건을 평가합니다. true의 경우, 결합 된 행을 돌려줍니다. 그렇지 않으면 버립니다.
  • 왼쪽 외부 조인. 왼쪽 테이블에서 아무 것도 일치하지 않는 행에 대해 내부 조인과 동일하며, 오른쪽 테이블 열에 NULL 값을 출력합니다.
  • 오른쪽 외부 조인. 오른쪽 테이블에서 아무 것도 일치하지 않는 행에 대해 내부 조인과 동일하며 왼쪽 테이블 열에 NULL 값을 출력합니다.
  • 전체 외부 조인. 내부 조인과 동일하게 왼쪽 외부 조인에서 왼쪽 비 일치 행을 유지하고 오른쪽 외부 조인에서 오른쪽 비 일치 행을 보존합니다.

몇 가지 예

A. A.Colour, B.Colour A. 내츄럴 바이올렛 A.Colour = B.Colour

위의 것은 전형적인 equi join입니다.

애니메이션 버전

A. A.Colour, B.Colour Inner JOIN B에서 A.Colour가 아닌 ( 'Green', 'Blue')

내부 조인 조건은 반드시 평등 조건 일 필요는 없으며 테이블의 양쪽에서 (또는 심지어 어느 한쪽에서) 열을 참조 할 필요가 없습니다. 교차 결합의 각 행에서 A.Colour NOT IN ('Green','Blue') 을 평가 A.Colour NOT IN ('Green','Blue') 결과가 반환됩니다.

SELECT A.Colour, B. 내부 조인 B에서의 색상 1 = 1

교차 조인 결과의 모든 행에 대해 조인 조건이 true로 평가되므로 교차 조인과 동일합니다. 나는 16 열의 그림을 다시는 반복하지 않을 것이다.

A. A.Colour, B.Colour 왼쪽 외부에서 A.Colour = B.Colour로 B에 가입하십시오.

외부 조인은 내부 조인과 같은 방식으로 논리적으로 평가됩니다. 단, 왼쪽 조인 (왼쪽 조인)의 행이 오른쪽 테이블의 모든 행과 조인되지 않으면 결과에 NULL 값이 보존됩니다 오른쪽 열.

선택 A.Colour, B.Colour 왼쪽 외부에서 가입 A.Colour = B.Courour B.Colour는 NULL입니다.

이것은 단순히 이전 결과가 B.Colour IS NULL 행만 반환하도록 제한합니다. 이 특별한 경우에는 오른손 테이블에 일치 항목이 없으므로 보존 된 행이되며 쿼리는 테이블 B 와 일치하지 않는 단일 빨간색 행을 반환합니다. 이를 안티 세미 조인이라고합니다.

null 가능하지 않은 IS NULL 테스트 용 열을 선택하는 것이 중요합니다. 그렇지 않으면 조인 조건에 의해이 패턴이 올바르게 작동하도록 NULL 값이 제외되도록 보장되어서 발생하는 행을 다시 가져 오지 않도록하는 것이 중요합니다. 일치하지 않는 행 이외에 해당 열에 대한 NULL 값.

A. A.Colour, B.Colour 오른쪽 바깥 쪽에서 A.Colour = B.Colour를 선택하십시오.

오른쪽 바깥 쪽 조인은 오른쪽 테이블에서 일치하지 않는 행을 보존하고 왼쪽 열을 null로 확장한다는 점을 제외하면 왼쪽 외부 조인과 유사하게 작동합니다.

A. A.Colour, B.Colour B.A.Colour = B.Colour.

완전 외부 조인은 왼쪽 조인과 오른쪽 조인의 비헤이비어를 결합하고 왼쪽 테이블과 오른쪽 테이블 모두에서 일치하지 않는 행을 보존합니다.

SELECT A.Colour, B.Colour 전체 외부 조인 B에서 1 ​​= 0

교차 조인의 행은 1=0 술어와 일치하지 않습니다. 양 측면의 모든 행은 다른 쪽 테이블의 열에 NULL이있는 일반 외부 조인 규칙을 사용하여 보존됩니다.

COALESCE (A.Colour, B.Colour) AS 색상이 전체 외부 조인 B에서 1 ​​= 0

앞의 쿼리를 약간 수정하면 두 테이블 중 하나의 UNION ALL 을 시뮬레이션 할 수 있습니다.

A.Colour 선택, B.Colour 왼쪽 외부 조인 B에서 A.Colour = B.Colour 어디에서 B.Colour = '녹색'

WHERE 절 (있는 경우)은 논리적으로 조인 후에 실행됩니다. 하나의 공통적 인 오류는 왼쪽 외부 조인을 수행 한 다음 일치하지 않는 행을 제외하고 끝나는 조건을 오른쪽 표에 포함하는 WHERE 절을 포함시키는 것입니다. 위의 결과는 외부 조인을 수행합니다 ...

... 그리고 "Where"절이 실행됩니다. NULL= 'Green' 은 참으로 평가되지 않으므로 외부 조인에 의해 보존 된 행은 파란색 조인과 함께 폐기되어 효과적으로 조인을 내부로 다시 변환합니다.

올바른 구문이 무엇이든 관계없이 B의 행만 Color를 Green으로, A의 모든 행을 포함하려는 의도가있는 경우

선택 A.Colour, B.Colour 왼쪽 외부 조인 B에서 A.Colour = B.Colour 및 B.Colour = 'Green'

SQL Fiddle

SQLFiddle.com에서 실시간으로 실행되는 이 예제를 참조하십시오.




INNER JOIN두 테이블을 비교할 때 최소한 하나의 일치가 있어야합니다. 예를 들어 테이블 A와 테이블 B는 A 8 B (A 교차점 B)를 의미합니다.

LEFT OUTER JOINLEFT JOIN동일합니다. 두 테이블 모두에서 일치하는 모든 레코드와 왼쪽 테이블의 모든 가능성을 제공합니다.

마찬가지로, RIGHT OUTER JOIN그리고 RIGHT JOIN동일합니다. 두 테이블 모두에서 일치하는 모든 레코드와 올바른 테이블의 모든 가능성을 제공합니다.

FULL JOIN중복 LEFT OUTER JOIN되거나 RIGHT OUTER JOIN중복되지 않는 조합입니다 .


가장 단순한 정의

Inner Join : 두 테이블에서 일치하는 레코드 를 반환 합니다.

완전 외부 가입 : 반환 일치와 타의 추종을 불허하는 기록 에서 타의 추종을 불허하는 기록을 위해 널 (null)와 두 테이블에서 두 테이블 .

왼쪽 외부 조인 : 왼쪽의 테이블에서만 일치하고 일치하지 않는 레코드를 반환합니다 .

오른쪽 외부 조인 : 오른쪽면의 테이블에서만 일치하고 일치하지 않는 레코드를 반환합니다 .

짧은 있음

일치 + 왼쪽 불일치 + 오른쪽 불일치 = 완전 외부 결합

일치 함 + 왼쪽 일치하지 않음 = 왼쪽 외부 조인

일치 함 + 오른쪽 일치하지 않음 = 오른쪽 외부 조인

일치 함 = 내부 결합


내부 결합

내부 조인은 우리가 찾고있는 것에 대한 두 테이블에 일치가있는 행으로 제한된 결과 세트를 생성합니다. 필요한 조인을 모르는 경우에는 대개 가장 좋은 방법입니다.

LEFT OUTER JOIN

왼쪽 외부 조인 또는 왼쪽 조인은 첫 번째 또는 왼쪽 테이블의 모든 행이 보존되는 집합을 만듭니다. 두 번째 또는 오른 쪽 테이블의 행은 첫 번째 테이블의 행과 일치하는 경우에만 표시됩니다. 왼쪽 테이블의 값이 있지만 오른쪽이 아닌 값이있는 테이블은 null을 읽습니다. 이는 값이 설정되지 않았 음을 의미합니다.

오른쪽 외부 조인

오른쪽 외부 조인 또는 오른쪽 조인은 역할이 반대 인 경우를 제외하고는 왼쪽 조인과 같습니다. 오른쪽 사이드 테이블의 모든 행이 결과에 나타나지만 오른쪽 테이블과 일치하는 경우 왼쪽 테이블의 행만 존재합니다. 빈 공백은 왼쪽 조인과 마찬가지로 null입니다.

전체 외부 조인

완전 외부 조인 또는 외부 조인은 일치하는 항목이 있는지 여부에 관계없이 두 테이블의 모든 행을 포함하는 결과 집합을 생성합니다. 왼쪽 조인 및 오른쪽 조인과 마찬가지로 빈 공백을 null이라고합니다.

추가 Reference


내부 조인 내부 조인은 두 테이블 간의 공통성에 초점을 맞 춥니 다. 내부 조인을 사용할 때, 비교되는 두 (또는 그 이상) 테이블 사이에 적어도 일부 일치하는 데이터가 있어야합니다. 내부 조인은 테이블을 검색하여 일치하거나 겹치는 데이터를 찾습니다. 이를 찾아 내면 내부 조인이 정보를 결합하여 하나의 새로운 테이블로 반환합니다.

외부 조인 (Outer Join) 외부 조인은 내부 조인이 반환 할 항목을 포함하는 레코드 집합 (또는 행)을 반환하지만 다른 테이블에 일치하는 항목이없는 다른 행도 포함합니다.

외부 조인에는 세 가지 유형이 있습니다.

왼쪽 외부 조인 (또는 왼쪽 조인) 오른쪽 외부 조인 (또는 오른쪽 조인) 전체 외부 조인 (또는 전체 조인) 이러한 외부 조인은 각각 비교, 결합 및 반환되는 데이터 부분을 나타냅니다. 일부 데이터는 공유되지만 다른 데이터는 공유되지 않으므로 null이이 프로세스에서 생성되는 경우가 있습니다.


조인 은 두 테이블의 데이터를 결합하는 데 사용되며 그 결과 새로운 임시 테이블이됩니다. 조인은 조인을 수행하기 위해 사용할 조건을 지정하는 술어라는 항목에 기초하여 수행됩니다. 내부 조인과 외부 조인의 차이점은 내부 조인이 조인 조건부에 따라 실제로 일치하는 행만 반환한다는 것입니다. 직원 및 위치 테이블 고려 :

내부 조인 : - 내부 조인은 조인 술어를 기반으로 두 테이블 ( EmployeeLocation )의 열 값을 결합하여 새로운 결과 테이블을 생성합니다. 이 쿼리는 Employee의 각 행을 위치의 각 행과 비교하여 join-predicate를 충족시키는 모든 행 쌍을 찾습니다. NULL이 아닌 값을 일치시켜 join-predicate를 만족하면 EmployeeLocation 의 일치하는 각 행 쌍의 열 값이 결과 행으로 결합됩니다. 다음은 내부 조인을위한 SQL의 모습입니다.

select  * from employee inner join location on employee.empID = location.empID
OR
select  * from employee, location where employee.empID = location.empID

이제 SQL 실행 결과는 다음과 같습니다.

외부 조인 : - 외부 조인에서는 조인 된 두 테이블의 각 레코드가 일치하는 레코드를 가질 필요가 없습니다. 조인 된 테이블은 일치하는 다른 레코드가없는 경우에도 각 레코드를 보유합니다. 외부 조인은 테이블의 행 (왼쪽 또는 오른쪽)에 따라 왼쪽 외부 조인과 오른쪽 외부 조인으로 세분됩니다.

왼쪽 외부 조인 : - 테이블에 대한 왼쪽 외부 조인 (또는 단순히 왼쪽 조인) 결과 조인 조건에서 일치하는 레코드가없는 경우에도 EmployeeLocation은 항상 "왼쪽"테이블 ( Employee )의 모든 레코드를 포함합니다. "오른쪽"테이블 ( 위치 ). 위의 표를 사용하여 왼쪽 외부 조인을위한 SQL의 모습은 다음과 같습니다.

select  * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional

이제,이 SQL을 실행 한 결과는 다음과 같습니다.

오른쪽 외부 조인 : - 오른쪽 외부 조인 (또는 오른쪽 조인)은 테이블의 처리를 취소 한 경우를 제외하고는 왼쪽 외부 조인과 매우 유사합니다. "오른쪽"테이블 ( 위치 )의 모든 행은 조인 된 테이블에 적어도 한 번 나타납니다. "왼쪽"테이블 ( Employee )의 일치하는 행이 없으면 위치 에서 일치하는 레코드가없는 경우 직원의 열에 NULL이 나타납니다. 이것은 SQL의 모습입니다.

select * from employee right outer join location  on employee.empID = location.empID;
//Use of outer keyword is optional

위의 표를 사용하여 오른쪽 외부 조인의 결과 집합이 어떻게 표시되는지 확인할 수 있습니다.

전체 외부 조인 : - 완전 외부 조인 또는 전체 조인은 조인 결과에 일치하지 않는 행을 포함시키고 전체 외부 조인을 사용하여 비 일치 정보를 유지하는 것입니다. 다른 테이블의 값이 일치하는지 여부에 관계없이 두 테이블의 모든 행을 포함합니다.

이미지 소스

MySQL 8.0 레퍼런스 매뉴얼 - 조인 구문

Oracle Join 작업


다른 답변에는 성능 및 최적화에 대한 세부 정보가 많이 표시되지 않습니다.

때로는 INNER JOIN옵티 마이저가 가장 좋은 옵션을 가지고 있음을 의미하는 연관성 만 알고있는 것이 좋습니다 . 조인 순서를 재정렬하면 같은 결과를 더 빠르게 유지할 수 있습니다. 옵티마이 저는 대부분의 조인 모드를 사용할 수 있습니다.

일반적으로 INNER JOIN다른 유형의 조인 대신에 사용하려고 시도하는 것이 좋습니다 . (예상되는 결과 집합을 고려하여 가능한 경우 물론)

이 이상한 연관 동작에 대한 몇 가지 좋은 예와 설명이 있습니다.


단순 용어로,

1. INNER JOIN 또는 EQUI JOIN : 두 표의 조건과 만 일치하는 결과 집합을 반환합니다.

2. OUTER JOIN : 조건 일치가 있더라도 테이블에서 모든 값의 결과 집합을 반환합니다.

3. 왼쪽 가입은 : 바로 테이블에서 조건에 일치하는 왼쪽 테이블 만 행의 모든 값의 결과 집합을 반환합니다.

4. RIGHT JOIN : 오른쪽 테이블의 모든 값과 왼쪽 테이블의 조건과 일치하는 행의 결과 집합을 반환합니다.

5. FULL JOIN : 완전 결합과 완전 외부 결합은 동일합니다.


많은 사랑을받은 빨간 음영의 Venn 다이어그램을 비판하면서 나는 내 자신의 시도를 게시하는 것이 공평하다고 생각했습니다.

@Martin Smith의 대답은 먼 길의 가장 좋은 것이지만, 그의 테이블은 각 테이블의 키 열을 보여 주지만 이상적으로 키가 아닌 열도 표시되어야한다고 생각합니다.

내가 30 분 내에 할 수있는 최선의 방법은, 여전히 적절하게 키 값이 TableB없거나 null이 OUTER JOIN조인이 아니라 합집합 으로 인해 null이 존재 함을 적절하게 보여 준다고 생각하지 않는다는 것입니다 .


차이점은 공통 레코드가 없으면 테이블이 조인되는 방식입니다.

JOIN와 동일하며 INNER JOIN두 표에 공통된 레코드 만 표시한다는 것을 의미합니다. 레코드가 공통인지는 결합 절의 필드에 의해 결정됩니다.

예 :

SELECT * 
FROM t1
JOIN t2 on t1.ID = t2.ID

ID두 테이블 모두에 동일한 값이있는 레코드 만 표시한다는 의미 입니다.

LEFT JOIN는와 같 LEFT OUTER JOIN으며 오른쪽 테이블에 일치하는 레코드가 있는지 여부에 관계없이 왼쪽 테이블 (즉, SQL 문 앞에있는 레코드)의 모든 레코드를 표시하는 것을 의미합니다.

RIGHT JOIN와 동일 RIGHT OUTER JOIN하고 반대를 의미합니다 LEFT JOIN. 즉, 두 번째 (오른쪽) 테이블의 모든 레코드와 첫 번째 (왼쪽) 테이블의 일치하는 레코드 만 표시합니다.


1. 내부 조인 : 조인 이라고도합니다. 왼쪽 테이블과 오른쪽 테이블에있는 행이 일치하는 경우 에만 반환 합니다. 그렇지 않으면 0 레코드를 반환합니다.

예:

SELECT
  e1.emp_name,
  e2.emp_salary    
FROM emp1 e1
INNER JOIN emp2 e2
  ON e1.emp_id = e2.emp_id

2. 전체 외부 조인 : 전체 조인이라고도합니다. Left 테이블과 Right 테이블에있는 모든 행을 반환 합니다.

예:

SELECT
  e1.emp_name,
  e2.emp_salary    
FROM emp1 e1
FULL OUTER JOIN emp2 e2
  ON e1.emp_id = e2.emp_id

3. 왼쪽 외부 조인 : 또는 단순히 왼쪽 조인이라고합니다. Left 테이블에있는 모든 행과 일치하는 행을 오른쪽 테이블에서 반환합니다 (있는 경우).

4. 오른쪽 바깥 쪽 조인 : 오른쪽 조인이라고도합니다. 왼쪽 테이블 (있는 경우)과 오른쪽 테이블에있는 모든 행에서 일치하는 행을 반환합니다.

조인의 장점

  1. 더 빨리 실행합니다.

에 대한 정확한 알고리즘은 INNER JOIN, LEFT/RIGHT OUTER JOIN다음과 같습니다 :

  1. 첫 번째 표에서 각 행을 가져옵니다. a
  2. 그 옆에있는 두 번째 테이블의 모든 행을 고려하십시오. (a, b[i])
  3. ON ...각 쌍에 대해 절을 평가하십시오 .ON( a, b[i] ) = true/false?
    • 조건이로 평가되면 true결합 된 행을 반환합니다 (a, b[i]).
    • 일치하지 않는 두 번째 테이블의 끝에 도달하면이 테이블 은 LEFT 외부 조인 또는 RIGHT 외부 조인에 대해 다른 테이블의 모든 열에 대해 사용 Outer Join하는 (가상) 쌍 을 반환합니다 . 이것은 첫 번째 테이블의 모든 행이 최종 결과에 존재하는지 확인하기위한 것입니다.Null(a, Null)(Null, b)

주 :ON 절에 지정된 조건은 무엇이든 상관 없으며 기본 키 를 사용할 필요가 없습니다 (그리고 항상 두 테이블의 열을 참조 할 필요는 없습니다)! 예 :

  • ... ON T1.title = T2.title AND T1.version < T2.version(=>이 게시물을 샘플 사용으로보기 : 열에 최대 값이있는 행만 선택하십시오 . )
  • ... ON T1.y IS NULL
  • ... ON 1 = 0 (샘플처럼)

참고 : 왼쪽 결합 = 왼쪽 외부 결합, 오른쪽 결합 = 오른쪽 외부 결합.







outer-join