etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2021. 9. 28. 00:13
반응형

질문자 :Chris de Vries


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



답변자 : Mark Harrison


매우 일반적인 경우인 중복이 없는 열에 조인한다고 가정합니다.

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

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

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

 AB - - 1 3 2 4 3 5 4 6

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

내부 조인

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

 select * from a INNER JOIN b on aa = bb; select a.*, b.* from a,b where aa = bb; a | b --+-- 3 | 3 4 | 4

왼쪽 외부 조인

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

 select * from a LEFT OUTER JOIN b on aa = bb; select a.*, b.* from a,b where aa = bb(+); a | b --+----- 1 | null 2 | null 3 | 3 4 | 4

오른쪽 외부 조인

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

 select * from a RIGHT OUTER JOIN b on aa = bb; select a.*, b.* from a,b where aa(+) = bb; 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 aa = bb; a | b -----+----- 1 | null 2 | null 3 | 3 4 | 4 null | 6 null | 5


답변자 : Martin Smith


벤다이어그램은 저에게 적합하지 않습니다.

예를 들어 교차 조인과 내부 조인 사이에 어떤 차이도 보여주지 않거나 더 일반적으로 서로 다른 유형의 조인 술어 사이에 차이를 보여주거나 작동 방식에 대한 추론을 위한 프레임워크를 제공합니다.

논리적 처리를 이해하는 것을 대체할 수 있는 것은 없으며 어쨌든 이해하기가 비교적 쉽습니다.

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

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

전체 외부 조인 의 애니메이션 버전으로 시작하겠습니다. 추가 설명이 이어집니다.

여기에 이미지 설명 입력


설명

소스 테이블

여기에 링크 설명 입력

먼저 CROSS JOIN (데카르트 곱이라고도 함)으로 시작합니다. 이것은 ON 절이 없으며 단순히 두 테이블의 모든 행 조합을 반환합니다.

A CROSS JOIN B에서 A.색상, B.색상 선택

여기에 링크 설명 입력

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

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

몇 가지 예

A.Colour = B.Colour의 A INNER JOIN B에서 A.Colour, B.Colour 선택

위는 고전적인 동등 조인입니다.

내부 조인

애니메이션 버전

여기에 이미지 설명 입력

A.Colour, B.Colour FROM A INNER JOIN B ON A.Colour NOT IN ('Green','Blue')

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

내부 2

A INNER JOIN B ON 1 =1에서 A.색상, B.색상 선택

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

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

외부 조인은 왼쪽 테이블의 행(왼쪽 조인의 경우)이 오른쪽 테이블의 행과 전혀 조인되지 않는 경우 결과에 NULL 값으로 보존된다는 점을 제외하고 내부 조인과 동일한 방식으로 논리적으로 평가됩니다. 오른쪽 열.

LOJ

SELECT A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour WHERE B.Colour IS NULL

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

nullable이 아니거나 이 패턴이 올바르게 작동하고 발생한 행을 다시 가져오는 것을 방지하기 위해 NULL IS NULL 테스트를 위한 열을 선택하는 것이 중요합니다. 일치하지 않는 행 외에 해당 열에 대한 NULL

loj는 null입니다

A.Colour = B.Colour의 A 오른쪽 외부 조인 B에서 A.Colour, B.Colour 선택

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

ROJ

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

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

FOJ

SELECT A.Colour, B.Colour FROM A FULL OUTER JOIN B ON 1 = 0

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

FOJ 2

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

앞의 쿼리를 약간 수정하면 두 테이블 UNION ALL

유니온 올

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

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

LOJ

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

LOJtoInner

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

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

여기에 이미지 설명 입력

SQL 바이올린

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



답변자 : ajitksharma


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

여기에 이미지 설명 입력

내부 조인: 내부 조인은 조인 술어를 기반으로 두 테이블( EmployeeLocation )의 열 값을 결합하여 새 결과 테이블을 생성합니다. 쿼리는 Employee의 각 행을 Location의 각 행과 비교하여 결합 술어를 충족하는 모든 행 쌍을 찾습니다. NULL이 아닌 값을 일치시켜 조인 술어를 만족하면 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 )의 모든 레코드를 포함합니다. "오른쪽" 테이블( Location ). 위의 표를 사용하여 왼쪽 외부 조인에 대한 SQL은 다음과 같습니다.

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

이제 이 SQL을 실행한 결과는 다음과 같습니다.여기에 이미지 설명 입력

오른쪽 외부 조인:- 오른쪽 외부 조인(또는 오른쪽 조인)은 테이블 처리가 반대인 경우를 제외하고 왼쪽 외부 조인과 매우 유사합니다. "오른쪽" 테이블( Location )의 모든 행은 조인된 테이블에 한 번 이상 나타납니다. "왼쪽" 테이블( Employee )에 일치하는 행이 없으면 Location 에 일치하는 항목이 없는 레코드에 대해 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 조인 작업



답변자 : Tushar Gupta - curioustushar


내부 조인

일치하는 행만 검색합니다. 즉, 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

참고문헌



답변자 : vidyadhar


간단히 말해서:

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

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

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

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

  • 전체 : 모든 테이블의 모든 행. 매치가 있건 없건 상관없어



답변자 : 1800 INFORMATION


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

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



답변자 : Brian Boatright


내부 조인을 사용하려면 조인된 테이블에 관련 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.OrderID IS NULL 과 같은 where 절을 추가하여 가능한 고아 주문을 나타내는 OrderDetails가 없는 주문을 찾는 데 사용할 수 있습니다.



답변자 : Pratik


간단히 말해서 :

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

왼쪽 조인 ->

의사 코드

 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에 테이블 이름을 입력하면 LEFT JOIN과 동일한 출력을 얻을 수 있습니다.

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

예시 :

예시

이제 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 자식 테이블 있도록.)

내부 조인

직원 테이블(해당 id)의 기본 키가 하위 테이블 phone_numbers_employees(emp_id)의 외래 키와 일치하는 경우에만 2개 테이블의 레코드를 가져옵니다.

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

 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;

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

도표



답변자 : vijikumar


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

OUTER JOIN 에서 결과 테이블에 빈 열이 있을 수 있습니다. 외부 조인은 LEFT 또는 RIGHT 일 수 있습니다.

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

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



답변자 : naga


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

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

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

FULL JOIN LEFT OUTER JOINRIGHT OUTER JOIN 을 중복 없이 조합한 것입니다.



답변자 : shA.t


답은 각각의 의미에 있고 결과에도 있습니다.

메모 :
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 사용할 수 있습니다.
( RIGHT 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

글쎄, 당신의 필요에 따라 당신의 필요에 맞는 각각을 선택하십시오 ;).



답변자 : Kanwar Singh


내부 조인.

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

외부 조인.

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



답변자 : Premraj


여기에 이미지 설명 입력

  • INNER JOIN 두 개 이상의 테이블에 대한 가장 일반적인 조인입니다. 테이블 ON 기본 키와 외래 키 관계 모두에서 일치하는 데이터를 반환합니다.
  • OUTER JOIN INNER JOIN 과 동일하지만 ResultSet에 NULL 데이터도 포함합니다.
    • LEFT JOIN = INNER JOIN + 왼쪽 테이블의 일치하지 않는 데이터와 오른쪽 테이블의 Null
    • RIGHT JOIN = INNER JOIN + 오른쪽 테이블의 일치하지 않는 데이터와 왼쪽 테이블의 Null
    • FULL JOIN = INNER JOIN Null 일치가 있는 오른쪽 및 왼쪽 테이블 모두에서 일치하지 않는 데이터.
  • 자체 조인은 테이블이 자체적으로 자체 조인으로 알고 있는 데이터를 참조할 때 SQL에서 키워드가 아닙니다. INNER JOINOUTER 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


답변자 : Lajos Veres


다른 답변에서 성능 및 최적화 도구에 대한 자세한 내용을 볼 수 없습니다.

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

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

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



답변자 : onedaywhen


많은 사랑을 받은 붉은 음영의 벤다이어그램을 비판했지만, 나는 내 자신의 시도를 게시하는 것이 정당하다고 생각했습니다.

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

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

여기에 이미지 설명 입력



답변자 : S.Serpooshan


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 을 사용하여 (가상) 쌍을 반환합니다. LEFT 외부 조인 (a, Null) 또는 RIGHT 외부의 경우 (Null, b) 가입하다. 이는 첫 번째 테이블의 모든 행이 최종 결과에 존재하는지 확인하기 위한 것입니다.

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

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

내부 조인 대 왼쪽 외부 조인


여기에 이미지 설명 입력

참고: 왼쪽 조인 = 왼쪽 외부 조인, 오른쪽 조인 = 오른쪽 외부 조인.



답변자 : Akshay Khale


가장 간단한 정의

내부 조인: 두 테이블에서 일치하는 레코드를 반환합니다.

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

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

Right Outer Join: Right Side 의 테이블에서만 일치하는 레코드와 일치하지 않는 레코드를 반환합니다.

숏컷

일치 + 왼쪽 불일치 + 오른쪽 불일치 = 전체 외부 조인

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

일치 + 오른쪽 불일치 = 오른쪽 외부 조인

일치 = 내부 조인



답변자 : Anands23


간단한 용어로,

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

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

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

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

5. FULL JOIN : Full Join과 Full Outer Join은 같다.



답변자 : Scratte


일반적인 아이디어

FULL OUTER JOIN , RIGHT OUTER JOINLEFT OUTER JOIN 사이의 특히 차이점을 포함하여 다양한 조인에 대한 더 나은 설명과 설명을 보려면 Martin Smith 의 답변 을 참조하십시오.

JOIN 표현을 위한 기초를 형성합니다.

기초

크로스 조인

크로스조인

 SELECT * FROM citizen CROSS JOIN postalcode

결과는 모든 조합의 데카르트 곱이 됩니다. JOIN 조건이 필요하지 않습니다.

CrossJoin 결과

내부 조인

INNER JOIN JOIN 과 동일합니다.

내부 조인

 SELECT * FROM citizen c JOIN postalcode p ON c.postal = p.postal

JOIN 조건을 충족하는 조합이 됩니다.

내부 조인 결과

왼쪽 외부 조인

LEFT OUTER JOIN LEFT JOIN 과 동일합니다.

왼쪽 조인

 SELECT * FROM citizen c LEFT JOIN postalcode p ON c.postal = p.postal

postalcode 번호에 일치하는 항목이 없더라도 결과는 citizen 모든 것입니다. 다시 JOIN 조건이 필요합니다.

왼쪽 조인 결과

재생 데이터

모든 예제는 Oracle 18c에서 실행되었습니다. 테이블 스크린샷의 출처이기도 한 dbfiddle.uk 에서 사용할 수 있습니다.

 CREATE TABLE citizen (id NUMBER, name VARCHAR2(20), postal NUMBER, -- <-- could do with a redesign to postalcode.id instead. leader NUMBER); CREATE TABLE postalcode (id NUMBER, postal NUMBER, city VARCHAR2(20), area VARCHAR2(20)); INSERT INTO citizen (id, name, postal, leader) SELECT 1, 'Smith', 2200, null FROM DUAL UNION SELECT 2, 'Green', 31006, 1 FROM DUAL UNION SELECT 3, 'Jensen', 623, 1 FROM DUAL; INSERT INTO postalcode (id, postal, city, area) SELECT 1, 2200, 'BigCity', 'Geancy' FROM DUAL UNION SELECT 2, 31006, 'SmallTown', 'Snizkim' FROM DUAL UNION SELECT 3, 31006, 'Settlement', 'Moon' FROM DUAL -- <-- Uuh-uhh. UNION SELECT 4, 78567390, 'LookoutTowerX89', 'Space' FROM DUAL;

JOINWHERE 재생할 때 경계가 흐릿함

크로스 조인

CROSS JOIN 결과로 행이 General Idea/ INNER JOIN .

 SELECT * FROM citizen c CROSS JOIN postalcode p WHERE c.postal = p.postal -- < -- The WHERE condition is limiting the resulting rows

CROSS JOIN 을 사용 LEFT OUTER JOIN 의 결과를 얻으려면 NULL 행을 추가하는 것과 같은 트릭이 필요합니다. 생략합니다.

내부 조인

INNER JOIN 은 데카르트 곱이 됩니다. General Idea/ CROSS JOIN 과 동일합니다.

 SELECT * FROM citizen c JOIN postalcode p ON 1 = 1 -- < -- The ON condition makes it a CROSS JOIN

이것은 내부 조인이 제거된 조건과 일치하지 않는 결과를 가진 교차 조인으로 실제로 볼 수 있는 곳입니다. 여기서 결과 행은 제거되지 않습니다.

INNER JOIN 을 사용 LEFT OUTER JOIN 의 결과를 얻으려면 트릭이 필요합니다. 생략합니다.

왼쪽 외부 조인

LEFT JOIN CROSS JOIN 과 같은 행을 생성합니다.

 SELECT * FROM citizen c LEFT JOIN postalcode p ON 1 = 1 -- < -- The ON condition makes it a CROSS JOIN

LEFT JOIN INNER JOIN 과 같은 행을 생성합니다.

 SELECT * FROM citizen c LEFT JOIN postalcode p ON c.postal = p.postal WHERE p.postal IS NOT NULL -- < -- removed the row where there's no mathcing result from postalcode

벤다이어그램의 문제점

"sql join cross inner outer"에 대한 이미지 인터넷 검색에는 수많은 벤 다이어그램이 표시됩니다. 제 책상 위에는 인쇄본이 하나 있었습니다. 하지만 대표성에 문제가 있다.

벤다이어그램은 요소가 하나 또는 두 집합에 모두 포함될 수 있는 집합 이론에 적합합니다. 그러나 데이터베이스의 경우 하나의 "세트"에 있는 요소가 테이블의 행인 것처럼 보이기 때문에 다른 테이블에도 존재하지 않습니다. 여러 테이블에 하나의 행이 있는 것은 아닙니다. 행은 테이블에 고유합니다.

자체 조인은 각 요소가 실제로 두 집합에서 동일한 경우입니다. 그러나 여전히 아래의 문제에서 자유롭지 못합니다.

아래에서 설명하는 집합 A 는 왼쪽 집합( citizen 테이블)을 나타내고 집합 B 는 오른쪽 집합( postalcode 테이블)을 나타냅니다.

크로스 조인

두 세트의 모든 요소는 다른 세트의 모든 요소와 일치합니다. 즉, 이 데카르트 곱을 적절하게 나타내려면 B 요소 A 양이 A B 양이 필요합니다. 집합 이론은 집합의 여러 동일한 요소에 대해 만들어지지 않았으므로 벤 다이어그램이 비실용적/불가능함을 적절하게 표현하는 것으로 나타났습니다. UNION 이 전혀 맞지 않는 것 같습니다.

행이 구별됩니다. UNION 은 총 7행입니다. SQL 결과 세트와 호환되지 않습니다. CROSS JOIN 작동하는 방식이 아닙니다.

CrossJoinUnion1

다음과 같이 표현하려고 합니다.

CrossJoinUnion2Crossing

..하지만 지금은 INTERSECTION 처럼 보이지만 확실히 그렇지는 않습니다 . INTERSECTION 에는 실제로 두 개의 개별 집합에 있는 요소가 없습니다. 그러나 다음과 유사한 검색 가능한 결과와 매우 유사합니다.

CrossJoinUnionUnion3

CROSS JOIN 대한 하나의 검색 가능한 결과 는 Tutorialgateway 에서 볼 수 있습니다. INTERSECTION 은 이것과 마찬가지로 비어 있습니다.

내부 조인

요소의 값은 JOIN 조건에 따라 다릅니다. 모든 행이 해당 조건에 대해 고유하게 되는 조건에서 이를 나타낼 수 있습니다. 의미 id=x 는 한 행에 대해서만 참입니다. 테이블 A ( citizen JOIN B ( postalcode )의 여러 행과 일치 CROSS JOIN 과 동일한 문제가 발생합니다. 행은 여러 번 표시되어야 하며 집합 이론은 그렇지 않습니다. 정말로 그것을 위해 만들어졌습니다. 고유성 조건에서는 다이어그램이 작동할 수 있지만 JOIN 조건이 다이어그램에서 요소의 배치를 결정한다는 점을 명심하십시오. 승차를 위해 행의 나머지 부분과 함께 JOIN 조건의 값만 살펴보면 다음과 같습니다.

InnerJoinIntersection - 채워짐

ON 1 = 1 INNER JOINCROSS JOIN 으로 만들 때 완전히 분리됩니다.

self- JOIN 을 사용하면 행은 실제로 두 테이블의 동일한 요소이지만 테이블을 AB 로 나타내는 것은 그다지 적합하지 않습니다. 예를 들어 A 요소가 B 의 다른 요소와 일치하도록 만드는 JOIN ON A.parent = B.child 이며, 별도의 요소 A 에서 B 다음과 같은 SQL 이 될 예에서:

 SELECT * FROM citizen c1 JOIN citizen c2 ON c1.id = c2.leader

SelfJoin 결과

Smith는 Green과 Jensen의 리더임을 의미합니다.

외부 조인

다시 한 행에 다른 테이블의 행과 일치하는 항목이 여러 개 있을 때 문제가 시작됩니다. OUTER JOIN 이 빈 집합과 일치하는 것으로 생각할 수 있기 때문에 더욱 복잡합니다. 그러나 집합 이론에서 집합 C 와 빈 집합 C 입니다. 빈 집합은 아무것도 추가하지 않습니다. LEFT OUTER JOIN 의 표현 B 의 일치 여부에 관계없이 A 행이 선택되었음을 설명하기 위해 A 를 모두 표시하는 것입니다. 그러나 "일치하는 요소"에는 위의 그림과 동일한 문제가 있습니다. 조건에 따라 다릅니다. 그리고 빈 집합이 A 방황한 것 같습니다.

LeftJoinIntersection - 채워짐

WHERE 절 - 의미

Smith와 달의 우편 번호를 사용하여 CROSS JOIN 에서 모든 행 찾기:

 SELECT * FROM citizen c CROSS JOIN postalcode p WHERE c.name = 'Smith' AND p.area = 'Moon';

어디서 - 결과

JOIN 을 반영하는 데 사용되지 않습니다. WHERE에만 사용됩니다.

어디에

..그리고 그것은 의미가 있습니다.

INTERSECT와 UNION이 의미가 있을 때

교차

설명했듯이 INNER JOIN 은 실제로 INTERSECT 가 아닙니다. 그러나 INTERSECT 는 별도의 쿼리 결과에 사용할 수 있습니다. 개별 쿼리의 요소가 실제로 결과 중 하나 또는 둘 다에 속하는 행이기 때문에 여기에서 벤 다이어그램이 의미가 있습니다. Intersect는 분명히 행이 두 쿼리에 모두 있는 경우에만 결과를 반환합니다. 이 SQL WHERE 위의 행과 동일한 행을 생성하고 벤 다이어그램도 동일합니다.

 SELECT * FROM citizen c CROSS JOIN postalcode p WHERE c.name = 'Smith' INTERSECT SELECT * FROM citizen c CROSS JOIN postalcode p WHERE p.area = 'Moon';

노동 조합

OUTER JOIN UNION 이 아닙니다. 그러나 UNION INTERSECT 와 동일한 조건에서 작동 SELECT 결합한 모든 결과가 반환됩니다.

 SELECT * FROM citizen c CROSS JOIN postalcode p WHERE c.name = 'Smith' UNION SELECT * FROM citizen c CROSS JOIN postalcode p WHERE p.area = 'Moon';

이는 다음과 같습니다.

 SELECT * FROM citizen c CROSS JOIN postalcode p WHERE c.name = 'Smith' OR p.area = 'Moon';

..그리고 결과를 제공합니다:

조합 - 결과

또한 여기에서 벤 다이어그램이 의미가 있습니다.

노동 조합

적용되지 않을 때

중요한 점 은 두 SELECT의 결과 구조가 같을 때만 작동하여 비교 또는 합집합이 가능하다는 것입니다. 이 두 가지의 결과는 다음을 가능하게 하지 않습니다.

 SELECT * FROM citizen WHERE name = 'Smith'
 SELECT * FROM postalcode WHERE area = 'Moon';

..결과를 UNION 과 결합하려고 하면

 ORA-01790: expression must have same datatype as corresponding expression

자세한 내용은 JOIN 및 SQL 조인을 venn 다이어그램으로 설명할 때 Venn Diagrams에 NO라고 말하세요 . EXCEPT 도 다룹니다.



답변자 : philipxy


여기 스택 오버플로를 포함하여 이 주제에 대해 잘못된 정보가 많이 있습니다.

left join on (일명 left outer join on )는 null union all 않는 모든 왼쪽 테이블 행을 합집합한 행에서 inner join on 반환합니다.

right join (on 일명 right outer join on )은 null union all 않는 모든 오른쪽 테이블 행을 결합한 행 inner join on 반환합니다.

full join on (일명 full outer join on 반환) inner join on 행의 union all 확장 타의 추종을 불허하는 왼쪽 테이블 행 nullunion all 확장 타의 추종을 불허하는 권리 테이블 행 null 들.

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

inner join 이 무엇인지 알 때까지 outer join 하지 마십시오.


반환 시 inner join on 행을 확인하십시오.
SQL의 CROSS JOIN 대 INNER JOIN

이는 또한 Venn(-like) 다이어그램이 내부 및 외부 조인에 도움이 되지 않는 이유를 설명합니다.
Venn(-like) 다이어그램이 조인에 도움이 되지 않는 이유에 대한 자세한 내용:
자연 조인에 대한 벤 다이어그램



답변자 : Sandesh


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

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

  • 완전 외부 조인 - 완전 외부 조인 은 A와 B의 합집합, 즉 A의 모든 행과 B의 모든 행을 제공합니다. A의 항목에 B의 해당 데이텀이 없으면 B 부분은 null 및 그 반대



답변자 : Laxmi


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

예시:

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

출력1

2. 완전 외부 조인: 완전 조인이라고도 합니다. 왼쪽 테이블과 오른쪽 테이블에 있는 모든 행을 반환합니다.

예시:

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

출력2

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

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

조인

조인의 장점

  1. 더 빠르게 실행합니다.


답변자 : HGG-Dev


조인은 예를 들어 더 쉽게 설명됩니다.

여기에 이미지 설명 입력

별도의 테이블에 저장된 사람과 이메일을 시뮬레이션하려면,

테이블 A와 테이블 B는 Table_A에 의해 조인됩니다. 아이디 = Table_B. name_id

내부 조인

여기에 이미지 설명 입력

일치하는 ID의 행만 표시됩니다.

외부 조인

여기에 이미지 설명 입력

테이블 A 에 대해 일치하는 ID와 일치하지 않는 행이 표시됩니다.

여기에 이미지 설명 입력

테이블 B 에 대해 일치하는 ID와 일치하지 않는 행이 표시됩니다.

여기에 이미지 설명 입력 두 테이블에서 일치하는 ID와 일치하지 않는 행이 표시됩니다.

참고: MySQL에서는 전체 외부 조인을 사용할 수 없습니다.



답변자 : Mayank Porwal


아래 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 쿼리에서 JOIN 으로 작성됩니다. 테이블 간에 일치하는 레코드만 반환합니다.

모든 직원과 부서 이름을 찾으십시오.

 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

위에서 볼 수 있듯이 Jose6 이 Department 테이블에서 일치하는 항목을 찾지 못하므로 출력의 EMP에서 인쇄되지 않습니다. 마찬가지로 HRR&D 행은 Emp 테이블에서 일치하는 항목을 찾지 못했기 때문에 Department 테이블에서 인쇄되지 않습니다.

따라서 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 테이블의 일치하는 레코드로 인쇄됩니다.

HRR&D 행은 dept_id의 Emp 테이블에서 일치하는 항목을 찾지 못했기 때문에 Department 테이블에서 인쇄되지 않습니다.

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

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



답변자 : rashedcs


inner joinouter join 의 차이점은 다음과 같습니다.

  1. Inner join 은 일치하는 튜플을 기반으로 테이블을 결합하는 조인이고 outer join 은 일치하는 튜플과 일치하지 않는 튜플을 기반으로 테이블을 결합하는 조인입니다.
  2. Inner join 은 일치하지 않는 행이 생략된 두 테이블의 일치하는 행을 병합하는 반면, outer join 은 두 테이블의 행을 병합하고 일치하지 않는 행이 null 값으로 채워집니다.
  3. Inner join 은 교차 연산과 비슷하지만 outer join 은 합집합 연산과 같습니다.
  4. Inner join 은 두 가지 유형이고 outer join 은 세 가지 유형입니다.
  5. outer join inner join 보다 빠릅니다.


답변자 : ForguesR


여기에는 매우 정확한 관계 대수학 예제가 포함된 좋은 답변이 많이 있습니다. 다음은 SQL 코딩 딜레마가 있는 아마추어 또는 초보 코더에게 도움이 될 수 있는 매우 간단한 답변입니다.

JOIN 쿼리는 두 가지 경우로 요약되는 경우가 많습니다.

A 데이터의 하위 집합에 대한 SELECT

  • 찾고 있는 관련 B 데이터가 데이터베이스 디자인별로 반드시 INNER JOIN 사용하십시오.
  • 데이터베이스 디자인별로 MIGHT 또는 MIGHT NOT 찾고 있는 관련 B 데이터가 LEFT JOIN 사용합니다.


답변자 : Nathan Long


데모

설정

psql 들어가서 고양이와 인간의 작은 데이터베이스를 만드십시오. 이 전체 섹션을 복사하여 붙여넣을 수 있습니다.

 CREATE DATABASE catdb; \c catdb; \pset null '[NULL]' -- how to display null values CREATE TABLE humans ( name text primary key ); CREATE TABLE cats ( human_name text references humans(name), name text ); INSERT INTO humans (name) VALUES ('Abe'), ('Ann'), ('Ben'), ('Jen'); INSERT INTO cats (human_name, name) VALUES ('Abe', 'Axel'), (NULL, 'Bitty'), ('Jen', 'Jellybean'), ('Jen', 'Juniper');

쿼리

다음은 결과를 보기 위해 [SOMETHING JOIN] 을 다양한 유형으로 변경하여 여러 번 실행할 쿼리입니다.

 SELECT humans.name AS human_name, cats.name AS cat_name FROM humans [SOMETHING JOIN] cats ON humans.name = cats.human_name ORDER BY humans.name;

INNER JOIN 은 모든 인간-고양이 쌍을 반환합니다. 고양이가 없는 사람이나 사람이 없는 고양이는 제외됩니다.

 human_name | cat_name ------------+----------- Abe | Axel Jen | Jellybean Jen | Juniper

FULL OUTER JOIN 은 모든 사람과 모든 고양이를 반환하며 양쪽에 일치하는 항목이 없으면 NULL

 human_name | cat_name ------------+----------- Abe | Axel Ann | [NULL] Ben | [NULL] Jen | Jellybean Jen | Juniper [NULL] | Bitty

LEFT OUTER JOIN 은 모든 사람(왼쪽 테이블)을 반환합니다. 고양이가 없는 사람은 cat_nameNULL 사람이 없는 고양이는 제외됩니다.

 human_name | cat_name ------------+----------- Abe | Axel Ann | [NULL] Ben | [NULL] Jen | Jellybean Jen | Juniper

A RIGHT OUTER JOIN 은 모든 고양이(오른쪽 테이블)를 반환합니다. 사람이 없는 고양이는 human_nameNULL 고양이가 없는 사람은 제외됩니다.

 human_name | cat_name ------------+----------- Abe | Axel Jen | Jellybean Jen | Juniper [NULL] | Bitty

내부 대 외부

INNER JOIN 은 일치하는 쌍만 가져오는 반면 OUTER 조인의 각 종류에는 일치하지 않는 일부 항목이 포함됩니다.

그러나 실제 단어 INNEROUTER 는 쿼리에 나타날 필요가 없습니다.

  • JOIN 은 그 자체로 INNER
  • LEFT JOIN , RIGHT JOINOUTER JOIN OUTER 의미합니다.


출처 : Here


출처 : http:www.stackoverflow.com/questions/38549/what-is-the-difference-between-inner-join-and-outer-join">

반응형