문제

또한 어떻게 LEFT JOIN, RIGHT JOIN 그리고 FULL JOIN 딱 맞다?

도움이 되었습니까?

해결책

중복되지 않은 열에 조인한다고 가정하면 이는 매우 일반적인 경우입니다.

  • A와 B의 내부 조인은 A가 B를 교차하는 결과를 제공합니다. 즉,a의 내부 부분 벤 다이어그램 교차로.

  • A와 B의 외부 조인은 A 합집합 B의 결과를 제공합니다. 즉,벤 다이어그램 결합의 외부 부분.

각각 단일 열이 있고 다음과 같은 데이터가 있는 두 개의 테이블이 있다고 가정합니다.

A    B
-    -
1    3
2    4
3    5
4    6

(1,2)는 A에 고유하고, (3,4)는 공통이며, (5,6)은 B에 고유합니다.

내부 조인

동등한 쿼리 중 하나를 사용하는 내부 조인은 두 테이블의 교차점을 제공합니다.두 행의 공통점입니다.

select * from a INNER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b;

a | b
--+--
3 | 3
4 | 4

왼쪽 외부 조인

왼쪽 외부 조인은 A의 모든 행과 B의 공통 행을 제공합니다.

select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b(+);

a |  b
--+-----
1 | null
2 | null
3 |    3
4 |    4

오른쪽 외부 조인

오른쪽 외부 조인은 B의 모든 행과 A의 공통 행을 제공합니다.

select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a(+) = b.b;

a    |  b
-----+----
3    |  3
4    |  4
null |  5
null |  6

완전 외부 조인

완전 외부 조인은 A와 B의 합집합을 제공합니다.A의 모든 행과 B의 모든 행.A의 항목이 B에 해당 데이텀을 갖고 있지 않으면 B 부분은 null이고 그 반대의 경우도 마찬가지입니다.

select * from a FULL OUTER JOIN b on a.a = b.b;

 a   |  b
-----+-----
   1 | null
   2 | null
   3 |    3
   4 |    4
null |    6
null |    5

다른 팁

벤 다이어그램은 실제로 나에게 적합하지 않습니다.

예를 들어 교차 조인과 내부 조인 간의 차이를 표시하지 않거나 더 일반적으로 다양한 유형의 조인 조건자 간의 차이를 표시하거나 작동 방식을 추론하기 위한 프레임워크를 제공합니다.

논리적 처리를 이해하는 것을 대체할 수 있는 방법은 없으며 어쨌든 이해하는 것은 상대적으로 간단합니다.

  1. 교차 조인을 상상해 보세요.
  2. 평가하다 on 조건자가 평가되는 행을 유지하는 1단계의 모든 행에 대한 절 true
  3. (외부 조인에만 해당) 2단계에서 손실된 외부 행을 다시 추가합니다.

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

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

enter image description here


설명

소스 테이블

enter link description here

먼저 CROSS JOIN (일명 데카르트 곱).이것은 ON 절을 입력하고 두 테이블의 모든 행 조합을 반환합니다.

A.색상, B.교차 조인 B의 색상 선택

enter link description here

내부 및 외부 조인에는 "ON" 절 조건자가 있습니다.

  • 내부 조인. 교차 조인 결과의 모든 행에 대해 "ON" 절의 조건을 평가합니다.true인 경우 조인된 행을 반환합니다.그렇지 않으면 폐기하십시오.
  • 왼쪽 외부 조인. 내부 조인과 동일하며 왼쪽 테이블에서 일치하지 않는 행에 대해 오른쪽 테이블 열에 대해 NULL 값을 출력합니다.
  • 오른쪽 외부 조인. 내부 조인과 동일하며 오른쪽 테이블에서 일치하지 않는 행에 대해 왼쪽 테이블 열에 대해 NULL 값을 출력합니다.
  • 완전 외부 조인. 내부 조인과 동일하며 왼쪽 외부 조인에서와 같이 왼쪽 일치하지 않는 행을 유지하고 오른쪽 외부 조인에 따라 오른쪽 일치하지 않는 행을 유지합니다.

몇 가지 예

A.Colour, B.Colour를 내부 조인 B에서 A.Colour = B.Colour로 선택합니다.

위의 내용은 고전적인 동등 조인입니다.

Inner Join

애니메이션 버전

enter image description here

A.Color, B.Color FROM A INNER JOIN B ON A.Color NOT IN ('녹색','파란색')

내부 조인 조건은 반드시 동등 조건일 필요는 없으며 두 테이블 모두(또는 둘 중 하나)의 열을 참조할 필요도 없습니다.평가 중 A.Colour NOT IN ('Green','Blue') 크로스 조인의 각 행에서 반환됩니다.

inner 2

A 내부 조인 B ON 1 =1에서 A.색상, B.색상 선택

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

A.Colour, A의 왼쪽 외부 조인 B에서 B.Colour를 선택합니다. A.Colour = B.Colour

외부 조인은 왼쪽 테이블(왼쪽 조인의 경우)의 행이 오른쪽 테이블의 어떤 행과도 조인하지 않는 경우 결과에 다음과 같이 유지된다는 점을 제외하면 내부 조인과 동일한 방식으로 논리적으로 평가됩니다. NULL 오른쪽 열의 값입니다.

LOJ

A.Colour, A.Colour가 NULL인 경우 A.Colour = B.Colour의 왼쪽 외부 조인 B에서 B.Colour를 선택합니다.

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

열을 선택하는 것이 중요합니다. IS NULL Null을 허용하지 않거나 조인 조건이 다음을 보장하는 테스트 NULL 이 패턴이 올바르게 작동하고 우연히 발생한 행을 다시 가져오는 것을 방지하기 위해 값이 제외됩니다. NULL 일치하지 않는 행 외에 해당 열의 값입니다.

loj is null

A.Color = B.Color의 오른쪽 외부 조인 B에서 A.Color, B.Color를 선택합니다.

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

ROJ

A.Colour, A.Colour = B.Colour의 전체 외부 조인 B에서 B.Colour를 선택합니다.

완전 외부 조인은 왼쪽 및 오른쪽 조인의 동작을 결합하고 왼쪽 및 오른쪽 테이블 모두에서 일치하지 않는 행을 유지합니다.

FOJ

A.Color, 전체 외부 조인 B에서 B.Color 선택 1 = 0

교차 조인에 다음과 일치하는 행이 없습니다. 1=0 술부.양쪽의 모든 행은 반대쪽 테이블의 열에 NULL이 있는 일반 외부 조인 규칙을 사용하여 보존됩니다.

FOJ 2

SELECT COALESCE(A.Colour, B.Colour) AS Color FROM A FULL OUTER JOIN B ON 1 = 0

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

UNION ALL

A.Colour, A의 왼쪽 외부 조인 B에서 B.Colour를 선택합니다. Colour = B.Colour WHERE B.Colour = 'Green'

참고 WHERE 절(있는 경우)은 조인 후에 논리적으로 실행됩니다.일반적인 오류 중 하나는 왼쪽 외부 조인을 수행한 다음 일치하지 않는 행을 제외시키는 오른쪽 테이블의 조건과 함께 WHERE 절을 포함하는 것입니다.위의 내용은 외부 조인을 수행하는 것으로 끝납니다.

LOJ

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

LOJtoInner

색상이 녹색인 B의 행만 포함하고 올바른 구문에 관계없이 A의 모든 행을 포함하려는 경우

A.Colour, A의 왼쪽 외부 조인 B에서 B.Colour를 선택합니다.Colour = B.Colour AND B.Colour = 'Green'

enter image description here

SQL 바이올린

이 예를 참조하세요 SQLFiddle.com에서 라이브로 실행.

조인 두 테이블의 데이터를 결합하여 새로운 임시 테이블을 만드는 데 사용됩니다.조인은 조인을 수행하기 위해 사용할 조건을 지정하는 술어를 기반으로 수행됩니다.내부 조인과 외부 조인의 차이점은 내부 조인은 조인 조건자를 기준으로 실제로 일치하는 행만 반환한다는 것입니다.직원 및 위치 테이블을 고려해 보겠습니다.

enter image description here

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

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

이제 해당 SQL을 실행한 결과는 다음과 같습니다.enter image description here enter image description here

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

왼쪽 외부 조인:-테이블에 대한 왼쪽 외부 조인(또는 간단히 왼쪽 조인)의 결과 직원 그리고 위치 항상 "왼쪽" 테이블의 모든 레코드를 포함합니다(직원), 조인 조건이 "오른쪽" 테이블에서 일치하는 레코드를 찾지 못하더라도(위치).위의 테이블을 사용하여 왼쪽 외부 조인에 대한 SQL은 다음과 같습니다.

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

이제 이 SQL을 실행한 결과는 다음과 같습니다.enter image description here enter image description here

오른쪽 외부 조인:-오른쪽 외부 조인(또는 오른쪽 조인)은 테이블 처리가 반대라는 점을 제외하면 왼쪽 외부 조인과 매우 유사합니다."오른쪽" 테이블의 모든 행(위치)이 조인된 테이블에 한 번 이상 표시됩니다."왼쪽" 테이블에 일치하는 행이 없는 경우(직원)이 존재하면 NULL이 다음의 열에 나타납니다. 직원 일치하는 항목이 없는 레코드의 경우 위치.SQL은 다음과 같습니다.

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

위의 표를 사용하여 오른쪽 외부 조인의 결과 집합이 어떤 모습인지 보여줄 수 있습니다.

enter image description hereenter image description here

전체 외부 조인:-완전 외부 조인(Full Outer Join) 또는 완전 외부 조인(Full Join)은 조인 결과에 일치하지 않는 행을 포함하여 일치하지 않는 정보를 유지하는 것입니다. 완전 외부 조인을 사용합니다.여기에는 다른 테이블에 일치하는 값이 있는지 여부에 관계없이 두 테이블의 모든 행이 포함됩니다.enter image description here

이미지 출처

MySQL 8.0 참조 매뉴얼 - 조인 구문

Oracle 조인 작업

내부 조인

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

Enter image description here

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

왼쪽 외부 조인

첫 번째 테이블에서 모든 레코드와 두 번째 테이블의 레코드를 선택한 키와 일치합니다.

Enter image description here

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

완전 외부 조인

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

Enter image description here

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

참고자료

간단히 말하면:

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

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

  • 왼쪽:오른쪽 테이블의 일치하는 행과 왼쪽 테이블의 모든 행

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

  • 가득한:모든 테이블의 모든 행.일치하는지 여부는 중요하지 않습니다.

내부 조인은 조인의 반대쪽(오른쪽)에 일치하는 레코드가 있는 경우에만 행을 표시합니다.

(왼쪽) 외부 조인은 조인의 반대쪽(오른쪽)에 일치하는 행이 없더라도 왼쪽에 각 레코드에 대한 행을 표시합니다.일치하는 행이 없으면 반대쪽(오른쪽)의 열에는 NULL이 표시됩니다.

내부 조인을 사용하려면 조인된 테이블에 관련 ID가 있는 레코드가 있어야 합니다.

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

예를 들어 Orders 및 OrderDetails 테이블이 있습니다.이는 "OrderID"로 연결됩니다.

명령

  • 주문 아이디
  • 고객 이름

주문 세부정보

  • 주문 세부정보ID
  • 주문 아이디
  • 상품명
  • 수량
  • 가격

요청

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

OrderDetails 테이블에도 뭔가가 있는 주문만 반환됩니다.

OUTER LEFT JOIN으로 변경하면

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

그러면 OrderDetails 레코드가 없더라도 Orders 테이블의 레코드가 반환됩니다.

이를 사용하면 다음과 같은 where 절을 추가하여 가능한 고아 주문을 나타내는 OrderDetails가 없는 주문을 찾을 수 있습니다. WHERE OrderDetails.OrderID IS NULL.

간단히 말해서 :

내부 조인 -> 상위 테이블의 기본 키가 하위 테이블의 외래 키와 일치하는 상위 및 하위 테이블에서 공통 레코드만 가져옵니다.

왼쪽 조인 ->

의사 코드

1.Take All records from left Table
2.for(each record in right table,) {
    if(Records from left & right table matching on primary & foreign key){
       use their values as it is as result of join at the right side for 2nd table.
    } else {
       put value NULL values in that particular record as result of join at the right side for 2nd table.
    }
  }

오른쪽 조인 :Left Join 과 정반대입니다.Right Join의 오른쪽에 있는 LEFT JOIN에 테이블 이름을 입력하면 LEFT JOIN과 동일한 출력을 얻습니다.

외부 조인 :두 테이블 모두의 모든 레코드 표시 No matter what.Left 테이블의 레코드가 Primary, Foreign 키를 기준으로 오른쪽 테이블과 일치하지 않는 경우 조인 결과로 NULL 값을 사용합니다.

예 :

Example

이제 2개의 테이블에 대해 가정해 보겠습니다.

1.employees , 2.phone_numbers_employees

employees : id , name 

phone_numbers_employees : id , phone_num , emp_id   

여기서 직원 테이블은 마스터 테이블이고,phone_numbers_employees는 하위 테이블입니다. emp_id 연결하는 외래 키로 employee.id 그래서 자식 테이블입니다.)

내부 조인

2개의 테이블의 기록을 가져옵니다. 직원 테이블의 기본 키(해당 ID)가 하위 테이블의 외래 키인phone_numbers_employees(emp_id)와 일치하는 경우에만.

따라서 쿼리는 다음과 같습니다.

SELECT e.id , e.name , p.phone_num FROM employees AS e INNER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

위에서 설명한 대로 기본 키 = 외래 키에서 일치하는 행만 가져옵니다. 여기서 기본 키 = 외래 키에서 일치하지 않는 행은 조인 결과 건너뜁니다.

왼쪽 조인 :

왼쪽 조인은 오른쪽 테이블에 일치하는 행이 있는지 여부에 관계없이 왼쪽 테이블의 모든 행을 유지합니다.

SELECT e.id , e.name , p.phone_num FROM employees AS e LEFT JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

외부 조인 :

SELECT e.id , e.name , p.phone_num FROM employees AS e OUTER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

도식적으로 보면 다음과 같습니다.

Diagram

너는 사용한다 INNER JOIN 일치하는 항목이 있는 두 테이블의 모든 행을 반환합니다.즉.결과 테이블의 모든 행과 열에는 값이 있습니다.

~ 안에 OUTER JOIN 결과 테이블에는 빈 열이 있을 수 있습니다.외부 조인은 다음 중 하나일 수 있습니다. LEFT 또는 RIGHT.

LEFT OUTER JOIN 두 번째 테이블에 일치하는 항목이 없더라도 첫 번째 테이블의 모든 행을 반환합니다.

RIGHT OUTER JOIN 첫 번째 테이블에 일치하는 항목이 없더라도 두 번째 테이블의 모든 행을 반환합니다.

This is a good explanation for joins

이것은 모든 종류의 조인에 대한 좋은 도식적 설명입니다.

원천: http://ssiddique.info/understanding-sql-joins-in-easy-way.html

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

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

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

FULL JOIN 의 조합이다 LEFT OUTER JOIN 그리고 RIGHT OUTER JOIN 중복 없이.

답은 각각의 의미에 있으므로 결과에도 있습니다.

메모 :
~ 안에 SQLite 없다 RIGHT OUTER JOIN 또는 FULL OUTER JOIN.
그리고 또한 MySQL 없다 FULL OUTER JOIN.

내 대답은 위의 내용을 기반으로합니다. 메모.

다음과 같은 두 개의 테이블이 있는 경우:

--[table1]               --[table2]
id | name                id | name
---+-------              ---+-------
1  | a1                  1  | a2
2  | b1                  3  | b2

크로스 조인/외부 조인:
다음을 사용하여 해당 테이블 데이터를 모두 가질 수 있습니다. CROSS JOIN 아니면 그냥 , 이와 같이:

SELECT * FROM table1, table2
--[OR]
SELECT * FROM table1 CROSS JOIN table2

--[Results:]
id | name | id | name 
---+------+----+------
1  | a1   | 1  | a2
1  | a1   | 3  | b2
2  | b1   | 1  | a2
2  | b1   | 3  | b2

내부 조인:
다음과 같은 관계를 기반으로 위 결과에 필터를 추가하려는 경우 table1.id = table2.id 당신이 사용할 수있는 INNER JOIN:

SELECT * FROM table1, table2 WHERE table1.id = table2.id
--[OR]
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id

--[Results:]
id | name | id | name 
---+------+----+------
1  | a1   | 1  | a2

왼쪽 [외부] 조인:
위 결과에서 테이블 중 하나의 모든 행을 동일한 관계로 갖고 싶다면 다음을 사용할 수 있습니다. LEFT JOIN:
(을 위한 바로 가입 그냥 테이블 위치만 바꾸세요)

SELECT * FROM table1, table2 WHERE table1.id = table2.id 
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
--[OR]
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id

--[Results:]
id | name | id   | name 
---+------+------+------
1  | a1   | 1    | a2
2  | b1   | Null | Null

전체 외부 조인:
결과에 다른 테이블의 모든 행을 포함하려면 다음을 사용할 수 있습니다. FULL OUTER JOIN:

SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
UNION ALL
SELECT Null, Null, * FROM table2 WHERE Not table2.id In (SELECT id FROM table1)
--[OR] (recommended for SQLite)
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION ALL
SELECT * FROM table2 LEFT JOIN table1 ON table2.id = table1.id
WHERE table1.id IS NULL
--[OR]
SELECT * FROM table1 FULL OUTER JOIN table2 On table1.id = table2.id

--[Results:]
id   | name | id   | name 
-----+------+------+------
1    | a1   | 1    | a2
2    | b1   | Null | Null
Null | Null | 3    | b2

글쎄요, 귀하의 필요에 따라 귀하의 필요를 충족하는 각각을 선택하십시오;).

내부 조인.

조인은 두 테이블의 행을 결합하는 것입니다.안 내부 조인 쿼리에 지정한 기준에 따라 두 테이블을 일치시키려고 시도하고 일치하는 행만 반환합니다.조인에 있는 첫 번째 테이블의 행이 두 번째 테이블의 두 행과 일치하면 결과에 두 개의 행이 반환됩니다.첫 번째 테이블의 행이 두 번째 테이블의 행과 일치하지 않으면 반환되지 않습니다.마찬가지로, 첫 번째 행과 일치하지 않는 두 번째 테이블의 행이 있으면 반환되지 않습니다.

외부 조인.

왼쪽 조인 첫 번째 테이블의 행과 두 번째 테이블의 행을 일치시키려고 시도합니다.일치하는 항목을 찾을 수 없으면 첫 번째 테이블의 열을 반환하고 두 번째 테이블의 열은 공백(null)으로 남겨둡니다.

다른 답변에서는 성능 및 최적화 프로그램에 대한 자세한 내용을 볼 수 없습니다.

가끔은 그것만 아는 것이 좋다. INNER JOIN 연관적이라는 것은 옵티마이저가 이를 사용할 수 있는 옵션이 가장 많다는 것을 의미합니다.동일한 결과를 더 빠르게 유지하기 위해 조인 순서를 다시 정렬할 수 있습니다.최적화 프로그램은 가장 많은 조인 모드를 사용할 수 있습니다.

일반적으로 다음을 사용하는 것이 좋습니다. INNER JOIN 다른 종류의 조인 대신.(물론 예상되는 결과세트를 고려하면 가능하다.)

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

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

  1. 첫 번째 테이블에서 각 행을 가져옵니다. a
  2. 옆에 있는 두 번째 테이블의 모든 행을 고려합니다. (a, b[i])
  3. 평가하다 ON ... 각 쌍에 대한 절: ON( a, b[i] ) = true/false?
    • 조건이 다음과 같이 평가될 때 true, 결합된 행을 반환합니다. (a, b[i]).
    • 일치하는 항목이 없이 두 번째 테이블 끝에 도달하면 이는 Outer Join 그런 다음 (가상) 다음을 사용하여 페어링 Null 다른 테이블의 모든 열에 대해: (a, Null) LEFT 외부 조인의 경우 또는 (Null, b) RIGHT 외부 조인의 경우.이는 첫 번째 테이블의 모든 행이 최종 결과에 존재하는지 확인하기 위한 것입니다.

메모: 에 지정된 조건 ON 절은 무엇이든 될 수 있지만 반드시 사용할 필요는 없습니다. 기본 키 (그리고 항상 두 테이블의 열을 참조할 필요는 없습니다)!예를 들어:

  • ... ON T1.title = T2.title AND T1.version < T2.version ( => 이 게시물을 샘플 사용법으로 참조하세요. 열에 최대값이 있는 행만 선택)
  • ... ON T1.y IS NULL
  • ... ON 1 = 0 (샘플과 동일)

Inner Join vs. Left Outer Join


enter image description here

메모: 왼쪽 조인 = 왼쪽 외부 조인, 오른쪽 조인 = 오른쪽 외부 조인.

많은 사랑을 받은 빨간색 음영 벤 다이어그램을 비판한 후, 나는 내 시도를 게시하는 것이 공정하다고 생각했습니다.

@Martin Smith의 답변은 이 중 최고이지만 각 테이블의 키 열만 표시하는 반면 이상적으로는 키가 아닌 열도 표시해야 한다고 생각합니다.

허용된 30분 동안 내가 할 수 있는 최선은 여전히 ​​키 값이 없기 때문에 null이 있다는 것을 적절하게 보여주지 못한다고 생각합니다. TableB 또는 OUTER JOIN 실제로는 조인이 아니라 공용체입니다.

enter image description here

enter image description here

  • INNER JOIN 두 개 이상의 테이블에 대한 가장 일반적인 조인입니다.테이블 ON 기본 키와 forignkey 관계 모두에서 일치하는 데이터를 반환합니다.
  • OUTER JOIN 와 같다 INNER JOIN, 그러나 여기에는 또한 포함됩니다 NULL ResultSet의 데이터입니다.
    • LEFT JOIN = INNER JOIN + 일치하지 않는 데이터 왼쪽 테이블 Null 오른쪽 테이블에서 일치합니다.
    • RIGHT JOIN = INNER JOIN + 일치하지 않는 데이터 오른쪽 테이블 Null 왼쪽 테이블에서 일치합니다.
    • FULL JOIN = INNER JOIN + 일치하지 않는 데이터 오른쪽과 왼쪽 모두 테이블이 있는 Null 성냥.
  • 자체 조인은 테이블이 자체적으로 데이터를 참조하는 경우 자체 조인으로 알려진 SQL의 키워드가 아닙니다.사용 INNER JOIN 그리고 OUTER JOIN 자체 조인 쿼리를 작성할 수 있습니다.

예를 들어:

SELECT * 
FROM   tablea a 
       INNER JOIN tableb b 
               ON a.primary_key = b.foreign_key 
       INNER JOIN tablec c 
               ON b.primary_key = c.foreign_key 

가장 간단한 정의

내부 조인:보고 일치하는 기록 두 테이블 모두에서.

완전 외부 조인:일치하는 반품 및 비교할 수 없는 기록 일치하지 않는 레코드에 대해 null이 있는 두 테이블 모두에서 두 테이블 모두.

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

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

인쇼트

일치 + 왼쪽 일치하지 않음 + 오른쪽 일치하지 않음 = 완전 외부 조인

일치 + 왼쪽 불일치 = 왼쪽 외부 조인

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

일치 = 내부 조인

간단히 말해서,

1.내부 조인 또는 EQUI 조인: 두 테이블의 조건과만 일치하는 결과 집합을 반환합니다.

2.외부 조인: 조건 일치 여부에 관계없이 두 테이블의 모든 값의 결과 집합을 반환합니다.

3.왼쪽 조인: 왼쪽 테이블의 모든 값과 오른쪽 테이블의 조건과 일치하는 행만 결과 집합으로 반환합니다.

4.올바른 가입 : 오른쪽 테이블의 모든 값과 왼쪽 테이블의 조건과 일치하는 행만 결과 집합으로 반환합니다.

5.전체 조인: 전체 조인과 전체 외부 조인은 동일합니다.

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

예:

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

output1

2.완전 외부 조인: 완전 조인이라고도 합니다.그것은 반환 모든 행 왼쪽 테이블과 오른쪽 테이블 모두에 존재합니다.

예:

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

output2

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

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

joins

조인의 장점

  1. 더 빠르게 실행됩니다.
  • 내부 조인 - 안 내부 조인 동등한 쿼리 중 하나를 사용하면 두 쿼리의 교차점이 제공됩니다. 테이블, 즉.두 행의 공통점입니다.

  • 왼쪽 외부 조인 - ㅏ 왼쪽 외부 조인 A의 모든 행과 B의 공통 행을 제공합니다.

  • 완전 외부 조인 - ㅏ 완전 외부 조인 A와 B의 합집합을 제공합니다.A의 모든 행과 B의 모든 행.A의 항목이 B의 해당 데이텀을 갖고 있지 않으면 B 부분은 null이고 그 반대의 경우도 마찬가지입니다.

left join on (일명 left outer join on) 반환 inner join onunion all Null로 확장된 일치하지 않는 왼쪽 테이블 행.

right join (on 일명 right outer join on) 반환 inner join onunion all Null로 확장된 일치하지 않는 오른쪽 테이블 행입니다.

full join on (일명 full outer join on) 반환 inner join onunion all Null로 확장된 일치하지 않는 왼쪽 테이블 행 union all Null로 확장된 일치하지 않는 오른쪽 테이블 행입니다.

(SQL Standard 2006 SQL/Foundation 7.7 구문 규칙 1, 일반 규칙 1b, 3c & d, 5b.)

그러니 하지 마세요 outer join 기본이 무엇인지 알 때까지 inner join 관련되어 있습니다.


알아내다 어떤 행 inner join 보고.

내 의견을 읽어보면 혼란스럽고 잘못된 답변이 많이 있습니다.

그런 다음 여기에서 많은 혼란스럽고 잘못된 답변에 대한 내 의견을 읽으십시오.

내부 조인과 외부 조인의 차이점은 다음과 같습니다.

  1. 내부 조인은 일치하는 튜플을 기준으로 테이블을 결합하는 조인인 반면, 외부 조인은 일치하는 튜플과 일치하지 않는 튜플을 기준으로 테이블을 결합하는 조인입니다.
  2. 내부 조인은 일치하지 않는 행을 생략하는 두 테이블의 일치하는 행을 병합하는 반면, 외부 조인은 두 테이블의 행을 병합하고 일치하지 않는 행을 null 값으로 채웁니다.
  3. 내부 조인은 교차 연산과 비슷하지만 외부 조인은 통합 연산과 같습니다.
  4. 내부 조인은 두 가지 유형이고 외부 조인은 세 가지 유형입니다.
  5. 내부 조인은 느린 반면 외부 조인은 내부 조인보다 빠릅니다.

아래 2개의 테이블을 고려하십시오.

EMP

empid   name    dept_id salary
1       Rob     1       100
2       Mark    1       300
3       John    2       100
4       Mary    2       300
5       Bill    3       700
6       Jose    6       400

부서

deptid  name
1       IT
2       Accounts
3       Security
4       HR
5       R&D

내부 조인:

대부분 다음과 같이 작성됩니다. 가입하다 SQL 쿼리에서.테이블 간에 일치하는 레코드만 반환합니다.

모든 직원과 부서 이름을 알아보세요.

Select a.empid, a.name, b.name as dept_name
FROM emp a
JOIN department b
ON a.dept_id = b.deptid
;

empid   name    dept_name
1       Rob     IT
2       Mark    IT
3       John    Accounts
4       Mary    Accounts
5       Bill    Security

위에서 보시는 바와 같이, Jose 에서 인쇄되지 않습니다 EMP 출력에서 dept_id로 6 Department 테이블에서 일치하는 항목을 찾지 못했습니다.비슷하게, HR 그리고 R&D 행은 인쇄되지 않습니다 부서 Emp 테이블에서 일치하는 항목을 찾지 못했기 때문입니다.

따라서 INNER JOIN 또는 JOIN은 일치하는 행만 반환합니다.

왼쪽 조인:

그러면 LEFT 테이블의 모든 레코드가 반환되고 RIGHT 테이블의 일치하는 레코드만 반환됩니다.

Select a.empid, a.name, b.name as dept_name
FROM emp a
LEFT JOIN department b
ON a.dept_id = b.deptid
;

empid   name    dept_name
1       Rob     IT
2       Mark    IT
3       John    Accounts
4       Mary    Accounts
5       Bill    Security
6       Jose    

따라서 위 출력을 관찰하면 LEFT 테이블(Emp)의 모든 레코드가 RIGHT 테이블의 레코드와 일치하는 레코드로 인쇄됩니다.

HR 그리고 R&D 행은 인쇄되지 않습니다 부서 dept_id의 Emp 테이블에서 일치하는 항목을 찾지 못했기 때문입니다.

따라서 LEFT JOIN은 Left 테이블의 모든 행을 반환하고 RIGHT 테이블의 일치하는 행만 반환합니다.

DEMO도 확인할 수 있습니다 여기.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top