programing

'INNER JOIN'과 'OUTER JOIN'의 차이점은?

stoneblock 2023. 4. 24. 21:09

'INNER JOIN'과 'OUTER JOIN'의 차이점은?

어떻게 요?LEFT OUTER JOIN,RIGHT OUTER JOIN , , , , 입니다.FULL OUTER JOIN★★★★★★★★★★★★★★★★★?

중복되지 않는 열에 결합한다고 가정할 때, 이는 매우 일반적인 경우입니다.

  • A와 B의 내부 결합은 A가 B를 교차한 결과, 즉 벤 다이어그램 교점의 내부 부분을 나타낸다.

  • 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단계에서 1단계까지 합니다.true
  3. (외부 조인에 한함) 스텝2에서 잃어버린 외부 행에 다시 추가합니다.

(NB: 실제로는 쿼리 옵티마이저가 위의 순수 논리적인 설명보다 더 효율적인 쿼리 실행 방법을 찾을 수 있지만 최종 결과는 동일해야 합니다.)

는 풀 아우터 조인 애니메이션 버전으로 시작하겠습니다.자세한 설명은 다음과 같습니다.

여기에 이미지 설명 입력


설명.

소스 테이블

링크 설명을 여기에 입력하십시오.

번째 은 '''로 시작합니다.CROSS JOIN(일명 데카르트 제품).은 「」가 있지 않습니다.ON구를 지정하고 두 테이블의 모든 행 조합을 반환합니다.

A를 선택합니다.색상, B.A 크로스 조인 B의 색상

링크 설명을 여기에 입력하십시오.

Inner 및 Outer join에는 "ON" 절의 술어가 있습니다.

  • 이너조인교차 결합 결과의 모든 행에 대해 "ON" 절의 조건을 평가합니다.true이면 결합된 행을 반환합니다.그렇지 않으면 폐기합니다.
  • 좌측 아우터 조인.왼쪽 테이블 내의 어떤 행에도 일치하지 않는 행에 대해서도 inner join과 마찬가지로 오른쪽 테이블컬럼의 NULL 값이 출력됩니다.
  • 우측 아우터 조인.오른쪽 테이블 내의 어떤 행에도 일치하지 않는 행에 대해서도 inner join과 마찬가지로 왼쪽 테이블컬럼의 NULL 값이 출력됩니다.
  • 전체 외부 결합.내부 조인과 마찬가지로 왼쪽 외부 조인과는 일치하지 않는 왼쪽 행을 유지하고 오른쪽 외부 조인과는 일치하지 않는 오른쪽 행을 유지합니다.

몇 가지 예

A를 선택합니다.색상, B.A의 내부 결합 B에서 색상.색상 = B.색상

위의 것이 전형적인 에키 조인입니다.

내부 결합

애니메이션 버전

여기에 이미지 설명 입력

A를 선택합니다.색상, B.A의 내부 결합 B에서 색상.색상이 없습니다('녹색', '파란색').

내부 결합 조건은 반드시 동일 조건일 필요는 없으며 테이블의 양쪽(또는 둘 다)의 열을 참조할 필요도 없습니다.A.Colour NOT IN ('Green','Blue')이치

내부 2

A를 선택합니다.색상, B.A 내부 결합 B의 색상 ON 1 =1

결합 조건은 교차 결합 결과의 모든 행에 대해 true로 평가되므로 이는 교차 결합과 동일합니다.두 번 다시 16줄 사진을 찍지 않겠습니다.

A를 선택합니다.색상, B.A의 좌측 아우터 조인트 B의 색상.색상 = B.색상

한 방법으로 단, 왼쪽조인의 의되지 않은 됩니다.NULL오른쪽 열의 값입니다.

하지 않다

A를 선택합니다.색상, B.A의 좌측 아우터 조인트 B의 색상.색상 = B.색상 B.색상은 특수한 순서입니다.

하여 는는음 음음 음음 음음 음음음 where where where where where where where where where return where where return the return the return the the만 반환하도록 .B.Colour IS NULL하는 행이 경우 는 테이블에서 하지 않는 행을 반환합니다.쿼리는 테이블에서 일치하지 않는 빨간색 행을 반환합니다.B이것을 안티 세미 조인이라고 합니다.

'열을합니다.IS NULL이 null이 아닌 것을 입니다.NULL, 또, 이 패턴이 올바르게 동작하기 위해서는, 않게 .이 행에는, 「」, 「다」, 「다」, 「다」, 「다」, 「다」, 「다」, 「다」, 「다」, 「다」, 「다」, 「다」가 .NULL일치하지 않는 행과 함께 해당 열의 값도 지정합니다.

loj는 null입니다.

A를 선택합니다.색상, B.A의 우측 외부 결합 B에서 색상.색상 = B.색상

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

ROJ

A를 선택합니다.색상, B.A의 전체 외부 결합 B에서 색상.색상 = B.색상

전체 외부 조인은 왼쪽 및 오른쪽 조인의 동작을 결합하여 왼쪽 및 오른쪽 테이블의 일치하지 않는 행을 유지합니다.

FOJ

A를 선택합니다.색상, B.A 전체 외측 결합 B의 색상 ON 1 = 0

내 은 이 행과 일치하지 않습니다.1=0이 있는 됩니다.양쪽의 모든 행은 다른 쪽 테이블의 컬럼에 NULL이 있는 일반 외부 조인 규칙을 사용하여 유지됩니다.

FOJ 2

COALESCE(A)를 선택합니다.색상, B.색상) A 전체 외부 결합 B에서 색상 1 = 0

를 약간 하면, 「」를 할 수 .UNION ALL두 테이블 중 하나죠.

UNION 전체

A를 선택합니다.색상, B.A의 좌측 아우터 조인트 B의 색상.색상 = B.색상 B.색상 = '녹색'

에 주의:WHERE절(존재하는 경우)은 조인 후에 논리적으로 실행됩니다.일반적인 오류 중 하나는 왼쪽 외부 조인 실행 후 오른쪽 테이블에 조건이 있는 WHERE 절을 포함하면 일치하지 않는 행이 제외됩니다.위는 결국 외부 결합을 수행하게 됩니다.

하지 않다

"그리고 "어디" 조항이 실행됩니다. NULL= 'Green'는 true로 평가되지 않기 때문에 외부 결합에 의해 보존된 행은 (파란색과 함께) 폐기되고 결합은 사실상 내부 결합으로 변환됩니다.

LOJTo

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

A를 선택합니다.색상, B.A의 좌측 아우터 조인트 B의 색상.색상 = B.색상 및 B.색상 = '녹색'

여기에 이미지 설명 입력

SQL 바이올린

다음 예시는 SQLFiddle.com에서 라이브로 실행됩니다.

조인(join)은 두 테이블의 데이터를 결합하기 위해 사용되며, 그 결과 새로운 임시 테이블이 생성됩니다.조인은 술어라고 불리는 것에 근거해 실행됩니다. 술어는 조인을 실행하기 위해 사용할 조건을 지정합니다.내부 결합과 외부 결합의 차이점은 내부 결합이 결합 술어에 따라 실제로 일치하는 행만 반환한다는 것입니다.예를 들어, 직원 및 위치 표를 고려합니다.

직원

엠피디 엠프명
13 제이슨이야.
8 알렉스야.
3 들이받다
17 바부
25 존슨

위치

엠피디 EmpLoc
13 새너제이
8 로스앤젤레스
3 푸네, 인도
17 인도 첸나이
39 인도 방갈로르

내부 조인:- 내부 조인에서는 조인-프리디케이트를 기반으로 두 테이블(EmployeeLocation)의 열 값을 조합하여 새 결과 테이블을 만듭니다.쿼리는 Employee의 행과 Location의 각 행을 비교하여 join-predicate를 충족하는 모든 행 쌍을 찾습니다.NULL 이외의 값을 일치시킴으로써 join-predicate가 충족되면 Employee 과 Location 의 일치하는 각 쌍의 열 값이 결과 행으로 결합됩니다.내부 조인을 위한 SQL은 다음과 같습니다.

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

SQL을 실행하면 다음과 같은 결과가 나타납니다.

직원.EmpId 직원.엠프명 위치.EmpId 위치.EmpLoc
13 제이슨이야. 13 새너제이
8 알렉스야. 8 로스앤젤레스
3 들이받다 3 푸네, 인도
17 바부 17 인도 첸나이

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

Left Outer Join: 테이블 Employee Location의 왼쪽 외부 조인(또는 단순히 왼쪽 조인) 결과에는 조인 조건이 "오른쪽" 테이블(Location)에 일치하는 레코드를 찾을 수 없는 경우에도 항상 "왼쪽" 테이블(Employee)의 모든 레코드가 포함됩니다.위 표를 사용하면 왼쪽 외부 조인의 SQL을 볼 수 있습니다.

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

이 SQL을 실행하면 다음과 같은 결과가 나타납니다.

직원.EmpId 직원.엠프명 위치.EmpId 위치.EmpLoc
13 제이슨이야. 13 새너제이
8 알렉스야. 8 로스앤젤레스
3 들이받다 3 푸네, 인도
17 바부 17 인도 첸나이
25 존슨 특수한 순서 특수한 순서

Johnson은 직원 위치 테이블에 항목이 없지만 결과에 계속 포함되지만 위치 필드는 무효가 됩니다.

오른쪽 외측 결합:- 오른쪽 외측 결합(또는 오른쪽 결합)은 테이블을 반대로 처리하는 경우를 제외하고 왼쪽 외측 결합과 매우 유사합니다.오른쪽 테이블(위치)의 모든 행이 조인된 테이블에 한 번 이상 나타납니다."왼쪽" 테이블(직원)에 일치하는 행이 없는 경우 위치에 일치하지 않는 레코드에 대해 직원의 열에 NULL이 표시됩니다.SQL의 외관은 다음과 같습니다.

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

위의 표를 사용하여 우측 아우터 조인 결과 세트를 표시할 수 있습니다.

직원.EmpId 직원.엠프명 위치.EmpId 위치.EmpLoc
13 제이슨이야. 13 새너제이
8 알렉스야. 8 로스앤젤레스
3 들이받다 3 푸네, 인도
17 바부 17 인도 첸나이
특수한 순서 특수한 순서 39 인도 방갈로르

Bangalore에 근무하고 있는 종업원은 없지만, 종업원 필드가 무효인 채로 결과에 포함되는 것에 주의해 주세요.

Full Outer Join: - Full Outer Join 또는 Full Join은 결합 결과에 일치하지 않는 행을 포함하여 일치하지 않는 정보를 유지하는 것입니다.Full Outer Join을 사용합니다.다른 테이블의 값이 일치하는지 여부에 관계없이 두 테이블의 모든 행이 포함됩니다.

직원.EmpId 직원.엠프명 위치.EmpId 위치.EmpLoc
13 제이슨이야. 13 새너제이
8 알렉스야. 8 로스앤젤레스
3 들이받다 3 푸네, 인도
17 바부 17 인도 첸나이
25 존슨 특수한 순서 특수한 순서
특수한 순서 특수한 순서 39 인도 방갈로르

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

Oracle Join 작업

내부 결합

만 가져옵니다. 「」는 「」입니다.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

레퍼런스

간단히 말하면:

내부 결합은 일치하는 행만 가져옵니다.

외부 조인은 한 테이블에서 일치하는 행을 가져오고 다른 테이블에서 모든 행을 가져오지만 결과는 사용하는 테이블에 따라 달라집니다.

  • 왼쪽: 오른쪽 테이블의 행과 왼쪽 테이블의 모든 행이 일치합니다.

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

  • [Full] : 모든 테이블의 모든 행.일치가 있든 없든 상관없다

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

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

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

외부 조인은 우측에 아무것도 없는 경우에도 좌측에 대한 레코드를 반환합니다.

예를 들어 Orders 테이블과 OrderDetails 테이블이 있습니다.이들은 "OrderID"로 관련지어집니다.

주문

  • 주문 ID
  • 님의 이름

주문 상세내역

  • 주문 상세아이디
  • 주문 ID
  • 제품명
  • 수량
  • 가격.

요구 사항

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

Order Details 테이블에도 있는 주문만 반환됩니다.

OUTER LEFT JOIN으로 변경하면

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

그러면 Order Details 레코드가 없어도 Order 테이블에서 레코드가 반환됩니다.

를 추가합니다.서 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.
    }
  }

오른쪽 조인 : 왼쪽 조인과는 정반대입니다.오른쪽 조인에서 왼쪽 조인 테이블 이름을 입력하면 왼쪽 조인 출력과 동일합니다.

Outer join : 양쪽 테이블의 모든 레코드를 표시합니다.No matter what왼쪽 테이블의 레코드가 [Primary], [Forieign]키에 따라 오른쪽 테이블과 일치하지 않으면 join의 결과로 NULL 값을 사용합니다.

예:

예

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

1.employees , 2.phone_numbers_employees

employees : id , name 

phone_numbers_employees : id , phone_num , emp_id   

phone_numbers_employes」를 합니다)입니다.emp_id하는 employee.id아이테이블이 됩니다.

내부 결합

2 테이블 레코드를 취득하는 은 종업원 테이블의 프라이머리 키(ID)가 차일드테이블 phone_numbers_employes(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;

도표상으로는 다음과 같습니다.

도표

두 테이블에서 일치하는 모든 행을 반환할 때 사용합니다.결과 표에서는 모든 행과 열에 값이 지정됩니다.

결과 테이블에는 빈 열이 있을 수 있습니다.외부 결합은 다음 중 하나입니다.LEFT ★★★★★★★★★★★★★★★★★」RIGHT.

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

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

INNER JOIN에서는 적어도 두 테이블을 비교할 때 일치하는 것이 필요합니다.B(A) A(B) B(A) B(B) B(A) B(B) A(B) B(B) A(B) B(B) A(B) B(B) A(B) A(B) B(B) A(B) A(B) A(B) A(B) A

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

similarly유 similarly,, similarly 、RIGHT OUTER JOIN ★★★★★★★★★★★★★★★★★」RIGHT JOIN오른쪽 합니다.양쪽 테이블에서 일치하는 모든 레코드와 오른쪽 테이블의 모든 가능성을 제공합니다.

FULL JOIN의 조합입니다.LEFT OUTER JOIN ★★★★★★★★★★★★★★★★★」RIGHT OUTER JOIN중복되지 않습니다.

답은 각각의 의미에 있기 때문에, 그 결과에 있습니다.


»SQLiteRIGHT OUTER JOIN ★★★★★★★★★★★★★★★★★」FULL OUTER JOIN.
또 ㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇ.MySQLFULL OUTER JOIN.

제 답변은 위의 참고 사항에 근거합니다.

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

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

JOIN / JOIN : / cross cross :
는 " " "로 가질 수 .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

JOIN 이너 조인:
때, 예를 들어 「」와 같은 를 추가합니다.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

[JOIN : 외 [ ]] ] :
중 때는 하면 .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

JOIN : 풀 아우터 조인:
때 할 수 .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

필요에 따라서, 각각의 요구에 맞는 것을 선택해 주세요.

이너조인

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

아우터 조인.

왼쪽 조인은 첫 번째 테이블의 행을 두 번째 테이블의 행과 일치하도록 검색합니다.일치하는 항목을 찾을 수 없는 경우 첫 번째 테이블의 열을 반환하고 두 번째 테이블의 열은 비워 둡니다(늘).

여기에 이미지 설명 입력

  • INNER JOIN두 개 이상의 테이블에 대한 가장 일반적인 결합입니다.[ON] (온) (Forignkey) (Forignkey) (Forignkey) (Forignkey) (온) (Forignkey) (Forignkey) (Forignkey) (Forignkey)) (온) (온)
  • OUTER JOIN와 같다INNER JOIN , ㄴ, ㄴ다, ㄴ다, ㄴ다, ㄴ다 등이 .NULL데이터를 표시합니다.
    • LEFT JOIN=INNER JOIN+ 왼쪽 테이블의 일치하지 않는 데이터Null오른쪽테테테테테긋긋긋긋
    • RIGHT JOIN=INNER JOIN+ 오른쪽 테이블의 일치하지 않는 데이터Null왼쪽 테이블에 성냥을 긋습니다.
    • FULL JOIN=INNER JOIN+ 오른쪽과 왼쪽의 양쪽 테이블에서 일치하지 않는 데이터:Null치합니니다다
  • 테이블 자체에서 데이터를 참조하는 경우 셀프 조인(self join)은 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 

다른 답변에서는 성능 및 최적화에 대한 자세한 내용을 확인할 수 없습니다.

가끔은 그것만 알아두는 것이 좋을 때도 있다.INNER JOIN는 관련성이 있습니다.즉, 옵티마이저는 이 옵션을 최대한 활용할 수 있습니다.동일한 결과를 유지하도록 조인 순서를 다시 지정할 수 있습니다.옵티마이저는 가장 많은 Join 모드를 사용할 수 있습니다.

.INNER JOIN다른 종류의 결합이 아니라. (물론 예상되는 결과 세트를 고려하여 가능하다면)

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

많은 사랑을 받고 있는 붉은 그림자 벤 도표를 비판하면서, 나는 나만의 시도를 게시하는 것이 정당하다고 생각했다.

@Martin Smith의 답변은 이 그룹 중 단연 최고이지만, 각 테이블의 키 열만 표시되며, 이상적으로는 키가 아닌 열도 표시되어야 한다고 생각합니다.

안에 수 은 30분 안에 그 이유는 키 값이 존재하지 않기 때문입니다.TableB 그 '그것'OUTER 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 Outer Join의 (Null, b)우측 아우터 조인용.이는 최종 결과에 첫 번째 표의 모든 행이 존재하는지 확인하기 위한 것입니다.

주의: 에 기재되어 있는 조건ONprimary keys를 사용할 필요는 없습니다(또한 항상 두 테이블의 Columns를 참조할 필요는 없습니다).예를 들어 다음과 같습니다.

  • ... ON T1.title = T2.title AND T1.version < T2.version( = > 이 투고를 사용 예로서 참조해 주세요.열의 최대값이 있는 행만 선택)
  • ... ON T1.y IS NULL
  • ... ON 1 = 0) (샘플 그대로)

내부 참여와


여기에 이미지 설명 입력

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

가장 간단한 정의

내부 결합:양쪽 테이블에서 일치하는 레코드를 반환합니다.

전체 외부 결합:양쪽 테이블에서 일치하는 레코드와 일치하지 않는 레코드가 반환되며, 양쪽 테이블에서 일치하지 않는 레코드가 null로 반환됩니다.

좌측 외부 결합:왼쪽 테이블의 일치 레코드 및 불일치 레코드만 반환합니다.

우측 외부 결합:우측 테이블에서만 일치 및 불일치 레코드가 반환됩니다.

쇼트

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

일치 + 왼쪽 불일치 = 왼쪽 외부 결합

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

일치 = 내부 결합

일반적인 생각

Martin Smith의 답변을 참조해 주십시오.다양한 결합에 대한 자세한 설명과 설명은 다음과 같습니다.FULL OUTER JOIN,RIGHT OUTER JOIN ★★★★★★★★★★★★★★★★★」LEFT OUTER JOIN.

두 는 2번 표로 나타낼 수 근거가 됩니다.JOINs 는 음 s s s s s s s s s s s s

근거

크로스 조인트

크로스 조인

SELECT *
  FROM citizen
 CROSS JOIN postalcode

결과는 모든 조합의 데카르트 곱이 될 것이다..JOIN수수: :

크로스 조인 결과

이너 조인트

INNER JOIN 단순하다, 라고 말할 수 있습니다.JOIN

이너조인

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

, 한 것을 .JOIN★★★★

이너 조인 결과

좌측 아우터 조인트

LEFT OUTER JOIN is is is is is와 LEFT JOIN

왼쪽 결합

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

그 결과는 모든 것이 될 것이다.citizenpostalcode 한 번 말하지만JOIN을 사용하다

Left 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;

때가 흐릿하다JOIN ★★★★★★★★★★★★★★★★★」WHERE

크로스 조인트

CROSS JOINIdea/Managel/Managely/Managely/Managely/Managely 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 JOINLEFT OUTER JOIN ''를 넣는 합니다.NULL행이 빠졌어요

이너 조인트

INNER JOIN데카르트 제품이 됩니다.이나 '개념'이나 '개념'이나 입니다.CROSS JOIN:

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

여기서 내부 조인은 제거된 조건과 일치하지 않는 결과를 가진 크로스 조인이라고 볼 수 있습니다.여기서 결과 행은 제거되지 않습니다.

「」를 사용합니다.INNER JOINLEFT OUTER JOIN요령도 필요합니다.빠졌어요.

좌측 아우터 조인트

LEFT JOIN은 「Idea/」로 됩니다.CROSS JOIN:

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

LEFT JOIN은 「Idea/」로 됩니다.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"에 대한 이미지 인터넷 검색에는 다수의 Ven 도표가 표시됩니다.내 책상 위에 인쇄본이 하나 있었어요.하지만 대표성에 문제가 있다.

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

셀프 조인은 각 요소가 실제로 두 세트에서 동일한 코너 케이스입니다.하지만 여전히 아래 문제에서 자유롭지 못합니다.

★★★A왼쪽 .citizen및 '''''''''' 。B입니다.postalcode( ) 참참참참참주오오 。

크로스 조인트

는 다른합니다. 즉, 이 두 세트의 모든 요소와 일치해야 합니다.A의 양B 및 「」B의 양A이 데카르트 제품을 적절하게 표현하기 위한 요소.집합이론은 집합 내의 여러 동일한 요소에 대해 만들어지지 않기 때문에 Venn 다이어그램은 이를 적절하게 표현하기 위해 실용적이지 않거나 불가능하다는 것을 알게 되었습니다.UNION전혀 맞지 않아요.

행이 구별됩니다.UNION7번입니다. 이 두 가지는 요.SQL결과를 설정합니다. 이런 것은 .CROSS JOIN작합니니다다

Cross Join Union 1

이렇게 표현하려고 합니다.

CrossJoinUnion2Crossing

지금은 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.INTERSECTION그건 확실히 아니지.게다가 이 제품에는INTERSECTION두 가지 뚜렷한 세트 중 하나에 해당됩니다.그러나 다음과 같은 검색 가능 결과와 매우 유사합니다.

크로스조인유니온3

검색 입니다.CROSS JOIN는 튜토리얼 게이트웨이에서 확인할 수 있습니다.INTERSECTION , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , .

이너 조인트

은 성분에 .JOIN이 그 에 일의가되는 모든 행이 해당 조건에 대해 고유해지는 조건에서 이 값을 나타낼 수 있습니다.의미.id=x에만 해당됩니다.테이블에서 한 줄씩A )citizen는 표 과 일치합니다.B )postalcode) の the ) の underJOIN.CROSS JOIN번 , 행은 여러 번 나타낼 필요가 있고, 집합론은 실제로 그것을 위해 만들어지지 않았습니다. 하에 할 수 이 그림은 할 수 있다는 하시기 바랍니다.JOIN합니다.condition은 그림에서 요소의 위치를 결정합니다.JOIN" " " " " " " : " :

내부 결합 교차로 - 채워짐

은 RSA를 어긋납니다.INNER JOIN a ON 1 = 1 condition making making로 하는 CROSS JOIN.

JOIN이지만 두 모두로 A ★★★★★★★★★★★★★★★★★」B별로 적합하지 않습니다.를 들어, 의 자기관리, 자기관리-를 들 수 있습니다.JOINAB의 다른 요소와 일치한다는 것은ON A.parent = B.child부터 A로로 합니다.B른른른른를 들어, 「」라고 하는 로부터, 「」라고 하는 것이 .SQL음음음같 뭇매하다

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

Self Join 결과

Smith는 Green과 Jensen의 리더입니다.

아우터 조인트

이 문제는 1개의 행이 다른 테이블의 행과 여러 개 일치할 때 시작됩니다.는 더 합니다.OUTER JOIN빈 집합과 일치할 수 있습니다. 에서는 모든 이다.C집합은 ""입니다.C도 추가되지 않습니다 빈 세트에는 아무것도 추가되지 않습니다.은 " " " 입니다.LEFT OUTER JOIN 다 예요.A의 과 같습니다.A됩니다.B다만, 「일치 요소」는, 상기의 그림과 같은 문제가 있습니다.황황 르그리고 그 빈 세트는 저쪽으로 떠돌아다닌 것 같다.A:

왼쪽 결합

WHERE 절 - 이치에 맞다

에서 모든 CROSS JOIN스미스와 우편번호가 달나라에 있습니다.

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

장소 - 결과

, 벤 '보다 낫다'를 할 때 사용되지 않습니다.JOIN. 이것은 오직 에만 사용됩니다.WHERE§:

어디에

..그건 말이 되네.

교차 및 UNION이 타당할 때

교차하다

INNER JOIN는 사실은 .INTERSECT단,하지만INTERSECT는 개별 쿼리 결과에 사용할 수 있습니다.여기서 Venn 다이어그램은 개별 쿼리의 요소가 실제로는 결과 중 하나 또는 둘 모두에 속하는 행이기 때문에 의미가 있습니다.Cross는 두 쿼리에 행이 있는 경우에만 결과를 반환합니다. ★★★★★★★★★★★★★★★★★.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, 모든 SELECTs:

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';

..결과는 다음과 같습니다.

Union - 결과

여기서도 벤 다이어그램은 의미가 있습니다.

유니온

해당되지 않을 때

중요한 점은 두 SELECT의 결과 구조가 동일할 때만 이러한 기능이 작동하여 비교 또는 결합이 가능하다는 것입니다.이러한 2개의 결과에서는, 다음의 기능이 유효하게 되지 않습니다.

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

.결과와 결합할 수 없습니다.UNION

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

자세한 내용은 JOINSQL 조인을 다이어그램으로 설명할 때 벤 다이어그램에 NO라고 말합니다.를 참조하십시오.둘 다 커버합니다.EXCEPT.

간단히 말하면,

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

2.OUTER JOIN : 조건이 일치하는지 여부에 관계없이 두 테이블의 모든 값 결과 세트를 반환합니다.

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

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

5. FULL JOIN : Full Join과 Full Outer Join은 동일합니다.

left join oninner join on »union all by " " " " " " 。nulls.

right join oninner join on »union all by " " " " " " 。nulls.

full join oninner join on 표시union all by " " " " " " 。nulls union all by " " " " " " 。nulls.

outer는 옵션이며 효과가 없습니다.

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

하지 마outer join on에 무엇이 알 inner join on관여하고 있습니다.


행인지 합니다.inner join on반환: SQL에서의 CROSS JOIN vs

또한 Venn(유사) 다이어그램이 내부 결합과 외부 결합에 도움이 되지 않는 이유도 설명됩니다.일반적으로 결합에 도움이 되지 않는 이유에 대한 자세한 내용은 자연 결합을 위한다이어그램

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. 전체 외부 결합:Full Join이라고도 합니다.왼쪽 테이블과 오른쪽 테이블에 있는 모든 행을 반환합니다.

예:

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

출력 2

3. 좌측 외부 결합:또는 단순히 Left Join이라고 불립니다.왼쪽 테이블에 있는 모든 행과 오른쪽 테이블의 일치하는 행(있는 경우)이 반환됩니다.

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

참가하다

조인의 장점

  1. 실행 속도가 빨라집니다.
  • 내부 조인 - 동등한 쿼리 중 하나를 사용하는 내부 조인에서는 두 테이블의 교차점, 즉 두 개의 행이 공통으로 있습니다.

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

  • 전체 외부 결합 - 전체 외부 결합은 A와 B의 결합을 제공합니다.A의 모든 행과 B의 모든 행.A에 있는 무언가가 B에 대응하는 데이텀을 가지고 있지 않은 경우, B 부분은 null이고, 그 반대는 null입니다.

조인(join)은 예를 들어 보다 쉽게 설명할 수 있습니다.

여기에 이미지 설명 입력

개별 테이블에 저장된 개인 및 이메일을 시뮬레이션하려면

표 A와 표 B는 표_A.id = 표_B.name_id에 의해 결합됩니다.

내부 결합

여기에 이미지 설명 입력

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

외부 결합

여기에 이미지 설명 입력

A의 일치 ID 및 일치하지 않는 행을 나타냅니다.

여기에 이미지 설명 입력

B에 일치하는 ID 및 일치하지 않는 행을 나타냅니다.

여기에 이미지 설명 입력 양쪽 테이블의 일치하는 ID 및 일치하지 않는 행이 표시됩니다.

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

다음 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

같이, 「 「 」입니다.Jose출력에는 dept_id이므로 EMP에서 출력되지 않습니다.6부문 테이블에서 일치하는 항목을 찾을 수 없습니다.similarly유 similarly,, similarly 、HR ★★★★★★★★★★★★★★★★★」R&DEmp 테이블에서 일치하는 항목을 찾지 못했기 때문에 부서 테이블에서 행이 인쇄되지 않습니다.

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

왼쪽 결합:

그러면 왼쪽 테이블의 모든 레코드와 오른쪽 테이블의 일치하는 레코드만 반환됩니다.

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    

따라서 위의 출력을 보면 왼쪽 테이블(Emp)의 모든 레코드는 오른쪽 테이블의 레코드만 일치하여 인쇄됩니다.

HR ★★★★★★★★★★★★★★★★★」R&Ddept_id의 Emp 테이블에서 일치하는 항목을 찾을 수 없었기 때문에 부서 테이블에서 행이 인쇄되지 않습니다.

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

DEMO도 이쪽에서 확인하실 수 있습니다.

여기에는 매우 정확한 관계대수의 예시와 함께 좋은 답들이 많이 있습니다.다음은 SQL 코딩 딜레마에 빠진 아마추어 또는 초보 코더에게 도움이 될 수 있는 매우 간단한 답변입니다.

는, 「이러다」, 「이러다」, 「이러다」, 「이러다」, 「이러다」, 「이러다」라고 하는,JOIN쿼리는 다음 두 가지 경우로 요약됩니다.

SELECT부의의 A 삭제:

  • INNER JOIN된 「」의 B찾고 있는 데이터는 데이터베이스 설계에 따라 반드시 존재해야 합니다.
  • LEFT JOIN된 「」의 B데이터베이스 설계에 따라 MIGH 또는 MIGHT가 존재하지 않을 수 있습니다.

「 」의 inner join ★★★★★★★★★★★★★★★★★」outer join음음음같 뭇매하다

  1. Inner join하는 튜플을 단, "는 "table"을 기반으로 한 결합입니다.outer join는 일치한 태플과 일치하지 않는 태플을 모두 기반으로 한 결합 테이블입니다.
  2. Inner join하지 않는 을 Marge 만, 「Marge」는 「Marge」입니다.outer join는 두 테이블의 행을 병합하고 일치하지 않는 행에 늘 값을 채웁니다.
  3. Inner join 조작과 , 「교차 조작"은 "교차 조작"과 같습니다.outer join노조 작전 같아요
  4. Inner join만, 「 」는 「 」입니다.outer join세 가지 타입이 있습니다.
  5. outer joininner join.

데모

세우다

에에 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

A FULL OUTER JOIN 됩니다.NULL어느 쪽에도 상대가 없으면요.

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

A LEFT OUTER JOIN모든 인간(왼쪽 테이블)을 반환합니다. 없는 나 고양이에게 .NULL cat_name됩니다.이치노

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

A RIGHT OUTER JOIN모든 고양이(오른쪽 테이블)를 반환합니다.나 벌을 .NULL human_name가 없는 됩니다.이치노

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

내부와 외부

「 」는 「 」로 되어 있는 것을 할 수 .INNER JOIN각종 다른 종류의OUTER이 없는 되어 있습니다.

은요, 」입니다.INNER ★★★★★★★★★★★★★★★★★」OUTER쿼리에 표시할 필요가 없습니다.

  • JOIN 가 시사하는 바가 있다INNER
  • LEFT JOIN,RIGHT JOIN ★★★★★★★★★★★★★★★★★」OUTER JOIN 함축되어 있다OUTER

"외부"와 "내부"는 옵션 요소일 뿐이며, 두 가지 종류의 결합을 다루고 있습니다.내부 조인(또는 "조인"만 사용하는 경우 기본값)은 두 테이블에 모두 기준과 일치하는 요소만 있는 조인입니다.

"외부" 조인은 내부 조인 및 일치하지 않는 왼쪽 또는 오른쪽 테이블의 요소와 동일하며 다른 테이블의 모든 열에 늘을 추가합니다.

전체 결합은 안쪽과 오른쪽 및 왼쪽 결합입니다.

요약하자면, 이와 같은 테이블 A가 있다면

이다. 컬럼 테이블a idB
1 1
2 새라입니다. 1
3 클라크였다. 2
4 바비 특수한 순서

테이블 B는 다음과 같습니다.

idB ColumnTableB
1 코너
2 켄트
3 스팍

내부 결합:

from tableA join tableB on tableA.idB = tableB.idB
이다. 컬럼 테이블a idB ColumnTableB
1 1 코너
2 새라입니다. 1 코너
3 클라크였다. 2 켄트

좌측 외부 결합:

from tableA left join tableB on tableA.idB = tableB.idB
이다. 컬럼 테이블a idB ColumnTableB
1 1 코너
2 새라입니다. 1 코너
3 클라크였다. 2 켄트
4 바비 특수한 순서 특수한 순서

우측 외측 결합:

from tableA right join tableB on tableA.idB = tableB.idB
이다. 컬럼 테이블a idB ColumnTableB
1 1 코너
2 새라입니다. 1 코너
3 클라크였다. 2 켄트
특수한 순서 특수한 순서 3 스팍

전체 외부 결합:

from tableA full join tableB on tableA.idB = tableB.idB
이다. 컬럼 테이블a idB ColumnTableB
1 1 코너
2 새라입니다. 1 코너
3 클라크였다. 2 켄트
4 바비 특수한 순서 특수한 순서
특수한 순서 특수한 순서 3 스팍

언급URL : https://stackoverflow.com/questions/38549/what-is-the-difference-between-inner-join-and-outer-join