inner join vs outer join
내부 조인 대 외부 조인 : 내부 조인과 외부 조인의 정확한 차이점을 탐색 할 준비
내부 조인과 외부 조인의 차이점을 살펴보기 전에 먼저 SQL JOIN이 무엇인지 살펴 보겠습니다.
조인 절은 레코드를 결합하거나 조인 조건을 통해 둘 이상의 테이블에서 레코드를 조작하는 데 사용됩니다. 조인 조건은 각 테이블의 열이 서로 일치하는 방식을 나타냅니다.
조인은 이러한 테이블 간의 관련 열을 기반으로합니다. 가장 일반적인 예는 기본 키 열과 외래 키 열을 통한 두 테이블 간의 조인입니다.
직원 급여가 포함 된 테이블이 있고 직원 세부 정보가 포함 된 다른 테이블이 있다고 가정합니다.
이 경우이 두 테이블을 결합 할 직원 ID와 같은 공통 열이 있습니다. 이 직원 ID 열은 직원 세부 정보 테이블의 기본 키와 직원 급여 테이블의 외래 키입니다.
두 개체간에 공통 키를 갖는 것은 매우 중요합니다. 테이블은 엔터티로, 키는 조인 작업에 사용되는 두 테이블 간의 공통 링크로 생각할 수 있습니다.
안드로이드 용 mp3 음악 다운로더 다운로드
기본적으로 SQL에는 두 가지 유형의 Join이 있습니다. 내부 결합 및 외부 결합 . 외부 조인은 세 가지 유형으로 더 세분화됩니다. 왼쪽 외부 결합, 오른쪽 외부 결합 및 완전 외부 결합.
이 기사에서 우리는 내부 결합 및 외부 결합 상세히. 교차 조인 및 부등 조인은이 기사의 범위에서 제외됩니다.
학습 내용 :
- 내부 조인이란 무엇입니까?
- 외부 조인이란 무엇입니까?
- 내부 조인과 외부 조인의 차이점
- 공연
- MS 액세스 내부 및 외부 조인
- 왼쪽 조인 대 왼쪽 외부 조인
- 왼쪽 외부 결합 대 오른쪽 외부 결합
- 테이블 형식의 내부 조인과 외부 조인의 차이점
- 내부 및 외부 조인 대 유니온
- 결론
- 추천 도서
내부 조인이란 무엇입니까?
내부 조인은 두 테이블 모두에서 일치하는 값을 가진 행만 반환합니다 (여기서는 두 테이블간에 조인이 수행되는 것으로 간주 함).
외부 조인이란 무엇입니까?
외부 조인에는 일치하는 행과 두 테이블간에 일치하지 않는 일부 행이 포함됩니다. 외부 조인은 기본적으로 잘못된 일치 조건을 처리하는 방식에서 내부 조인과 다릅니다.
외부 조인에는 3 가지 유형이 있습니다.
- 왼쪽 외부 결합 : LEFT 테이블의 모든 행과 두 테이블간에 일치하는 레코드를 반환합니다.
- 오른쪽 외부 결합 : RIGHT 테이블의 모든 행과 두 테이블간에 일치하는 레코드를 반환합니다.
- 전체 외부 결합 : Left Outer Join과 Right Outer Join의 결과를 결합합니다.
내부 조인과 외부 조인의 차이점
(영상 출처 )
위의 다이어그램에서 볼 수 있듯이 두 개의 엔티티, 즉 테이블 1과 테이블 2가 있으며 두 테이블 모두 일부 공통 데이터를 공유합니다.
내부 조인은 이러한 테이블 간의 공통 영역 (위 다이어그램의 녹색 음영 영역), 즉 테이블 1과 테이블 2간에 공통된 모든 레코드를 반환합니다.
Left Outer Join은 테이블 1의 모든 행과 테이블 1에도 공통 인 테이블 2의 행만 반환합니다. Right Outer Join은 그 반대입니다. 테이블 2의 모든 레코드와 테이블 1의 일치하는 레코드 만 제공합니다.
또한 Full Outer Join은 테이블 1과 테이블 2의 모든 레코드를 제공합니다.
이것을 더 명확하게하기 위해 예를 들어 보겠습니다.
두 가지가 있다고 가정합니다. 테이블 : EmpDetails 및 EmpSalary .
EmpDetails 테이블 :
EmployeeID | EmployeeName |
7 | 백합 |
1 | 남자 |
두 | 사만다 |
삼 | 없음 |
4 | 부드러운 |
5 | 램 |
6 | Arpit |
8 | 시타 |
9 | 파라 |
10 | 실내 변기 |
EmpSalary 테이블 :
EmployeeID | EmployeeName | 직원 급여 |
---|---|---|
열한 | 장미 | 90000 |
1 | 남자 | 50,000 |
두 | 사만다 | 120000 |
삼 | 없음 | 75000 |
4 | 부드러운 | 25000 |
5 | 램 | 150000 |
6 | Arpit | 80000 |
12 | Sakshi | 45000 |
13 | 잭 | 250,000 |
이 두 테이블에 대해 내부 조인을 수행하고 결과를 관찰하겠습니다.
질문:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails INNER JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
결과:
EmployeeID | EmployeeName | 직원 급여 |
---|---|---|
7 | 백합 | 없는 |
1 | 남자 | 50,000 |
두 | 사만다 | 120000 |
삼 | 없음 | 75000 |
4 | 부드러운 | 25000 |
5 | 램 | 150000 |
6 | Arpit | 80000 |
위의 결과 집합에서 Inner Join이 일치하는 키 (예 : EmployeeID)를 가진 EmpDetails 및 EmpSalary 모두에있는 처음 6 개의 레코드를 반환했음을 알 수 있습니다. 따라서 A와 B가 두 항목 인 경우 Inner Join은 일치하는 키를 기준으로 'A 및 B의 레코드'와 동일한 결과 집합을 반환합니다.
이제 Left Outer Join이 무엇을하는지 살펴 보겠습니다.
질문:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails LEFT JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
결과:
EmployeeID | EmployeeName | 직원 급여 |
---|---|---|
1 | 남자 | 50,000 |
두 | 사만다 | 120000 |
삼 | 없음 | 75000 |
4 | 부드러운 | 25000 |
5 | 램 | 150000 |
6 | Arpit | 80000 |
8 | 시타 | 없는 |
9 | 파라 | 없는 |
10 | 실내 변기 | 없는 |
위의 결과 집합에서 왼쪽 외부 조인이 LEFT 테이블, 즉 EmpDetails 테이블에서 10 개의 레코드를 모두 반환했으며 처음 6 개의 레코드가 일치하므로 이러한 일치하는 레코드에 대해 직원 급여를 반환했음을 알 수 있습니다.
나머지 레코드는 RIGHT 테이블, 즉 EmpSalary 테이블에 일치하는 키가 없기 때문에 해당하는 NULL을 반환했습니다. Lily, Sita, Farah 및 Jerry는 EmpSalary 테이블에 일치하는 직원 ID가 없기 때문에 Salary는 결과 집합에서 NULL로 표시됩니다.
따라서 A와 B가 두 항목 인 경우 왼쪽 외부 조인은 일치하는 키를 기준으로 'A NOT B의 레코드'와 동일한 결과 집합을 반환합니다.
이제 Right Outer Join이 수행하는 작업을 살펴 보겠습니다.
질문:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails RIGHT join EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
결과:
EmployeeID | EmployeeName | 직원 급여 |
---|---|---|
없는 | 없는 | 90000 |
1 | 남자 | 50,000 |
두 | 사만다 | 120000 |
삼 | 없음 | 75000 |
4 | 부드러운 | 25000 |
5 | 램 | 150000 |
6 | Arpit | 80000 |
없는 | 없는 | 250,000 |
없는 | 없는 | 250,000 |
위의 결과 집합에서 오른쪽 외부 조인이 왼쪽 조인의 반대를 수행했음을 알 수 있습니다. 오른쪽 테이블, 즉 EmpSalary 테이블에서 모든 급여를 반환했습니다.
그러나 Rose, Sakshi 및 Jack은 왼쪽 테이블, 즉 EmpDetails 테이블에 일치하는 직원 ID가 없기 때문에 왼쪽 테이블에서 직원 ID와 EmployeeName을 NULL로 얻었습니다.
따라서 A와 B가 두 항목 인 경우 오른쪽 외부 조인은 일치하는 키를 기준으로 'B NOT A의 레코드'와 동일한 결과 집합을 반환합니다.
또한 두 테이블의 모든 열에 대해 선택 작업을 수행하는 경우 결과 집합이 무엇인지 살펴 보겠습니다.
질문:
SELECT * FROM EmpDetails RIGHT JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
결과:
EmployeeID | EmployeeName | EmployeeID | EmployeeName | 직원 급여 |
---|---|---|---|---|
없는 | 없는 | 열한 | 장미 | 90000 |
1 | 남자 | 1 | 남자 | 50,000 |
두 | 사만다 | 두 | 사만다 | 120000 |
삼 | 없음 | 삼 | 없음 | 75000 |
4 | 부드러운 | 4 | 부드러운 | 25000 |
5 | 램 | 5 | 램 | 150000 |
6 | Arpit | 6 | Arpit | 80000 |
없는 | 없는 | 12 | Sakshi | 250,000 |
없는 | 없는 | 13 | 잭 | 250,000 |
이제 Full Join으로 이동해 보겠습니다.
완전 외부 조인은 일치 여부에 관계없이 두 테이블의 모든 데이터를 원할 때 수행됩니다. 따라서 일치하는 키를 찾지 못하더라도 모든 직원을 원하면 아래와 같이 쿼리를 실행하겠습니다.
질문:
SELECT * FROM EmpDetails FULL JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
결과:
EmployeeID | EmployeeName | EmployeeID | EmployeeName | 직원 급여 |
---|---|---|---|---|
7 | 백합 | 없는 | 없는 | 없는 |
1 | 남자 | 1 | 남자 | 50,000 |
두 | 사만다 | 두 | 사만다 | 120000 |
삼 | 없음 | 삼 | 없음 | 75000 |
4 | 부드러운 | 4 | 부드러운 | 25000 |
5 | 램 | 5 | 램 | 150000 |
6 | Arpit | 6 | Arpit | 80000 |
8 | 시타 | 없는 | 없는 | 없는 |
9 | 파라 | 없는 | 없는 | 없는 |
10 | 실내 변기 | 없는 | 없는 | 없는 |
없는 | 없는 | 열한 | 장미 | 90000 |
없는 | 없는 | 12 | Sakshi | 250,000 |
없는 | 없는 | 13 | 잭 | 250,000 |
위의 결과 집합에서 처음 6 개의 레코드가 두 테이블에서 일치하므로 NULL이없는 모든 데이터를 얻었습니다. 다음 네 개의 레코드가 왼쪽 테이블에는 있지만 오른쪽 테이블에는 없으므로 오른쪽 테이블의 해당 데이터는 NULL입니다.
마지막 세 개의 레코드는 왼쪽 테이블이 아닌 오른쪽 테이블에 존재하므로 왼쪽 테이블의 해당 데이터에 NULL이 있습니다. 따라서 A와 B가 두 항목 인 경우 전체 외부 조인은 일치하는 키에 관계없이 'A AND B의 레코드'와 동일한 결과 집합을 반환합니다.
이론적으로는 Left Join과 Right Join의 조합입니다.
공연
내부 조인을 SQL 서버의 왼쪽 외부 조인과 비교해 보겠습니다. 작동 속도에 대해 말하면 왼쪽 외부 JOIN은 분명히 내부 결합보다 빠르지 않습니다.
정의에 따라 외부 조인은 왼쪽이든 오른쪽이든 추가 작업과 함께 내부 조인의 모든 작업을 수행해야합니다. 외부 조인은 더 많은 수의 레코드를 반환 할 것으로 예상되며 결과 집합이 더 크기 때문에 총 실행 시간이 더 늘어납니다.
따라서 외부 조인은 내부 조인보다 느립니다.
또한 왼쪽 조인이 내부 조인보다 빠르지 만 왼쪽 외부 조인이 내부 조인과 기능적으로 동일하지 않기 때문에이를 서로 대체 할 수없는 특정 상황이있을 수 있습니다.
Left Join이 Inner Join보다 빠를 수있는 경우에 대해 논의 해 보겠습니다. 조인 작업에 포함 된 테이블이 너무 작 으면 10 개 미만의 레코드가 있고 테이블에 쿼리를 처리하기에 충분한 인덱스가없는 경우 왼쪽 조인이 일반적으로 내부 조인보다 빠릅니다.
아래의 두 테이블을 만들고 두 테이블 사이에 INNER JOIN과 LEFT OUTER JOIN을 예로 들어 보겠습니다.
CREATE TABLE #Table1 ( ID int NOT NULL PRIMARY KEY, Name varchar(50) NOT NULL ) INSERT #Table1 (ID, Name) VALUES (1, 'A') INSERT #Table1 (ID, Name) VALUES (2, 'B') INSERT #Table1 (ID, Name) VALUES (3, 'C') INSERT #Table1 (ID, Name) VALUES (4, 'D') INSERT #Table1 (ID, Name) VALUES (5, 'E') CREATE TABLE #Table2 ( ID int NOT NULL PRIMARY KEY, Name varchar(50) NOT NULL ) INSERT #Table2 (ID, Name) VALUES (1, 'A') INSERT #Table2 (ID, Name) VALUES (2, 'B') INSERT #Table2 (ID, Name) VALUES (3, 'C') INSERT #Table2 (ID, Name) VALUES (4, 'D') INSERT #Table2 (ID, Name) VALUES (5, 'E') SELECT * FROM #Table1 t1 INNER JOIN #Table2 t2 ON t2.Name = t1.Name
신분증 | 이름 | 신분증 | 이름 | |
---|---|---|---|---|
다음은 내부 조인의 시각화입니다. | 아래는 외부 조인의 시각화입니다. | |||
1 | 1 | 에 | 1 | 에 |
두 | 두 | 비 | 두 | 비 |
삼 | 삼 | 씨 | 삼 | 씨 |
4 | 4 | 디 | 4 | 디 |
5 | 5 | IS | 5 | IS |
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS bar ON (55=55);
신분증 | 이름 | 신분증 | 이름 | |
---|---|---|---|---|
1 | 1 | 에 | 1 | 에 |
두 | 두 | 비 | 두 | 비 |
삼 | 삼 | 씨 | 삼 | 씨 |
4 | 4 | 디 | 4 | 디 |
5 | 5 | IS | 5 | IS |
위에서 볼 수 있듯이 두 쿼리 모두 동일한 결과 집합을 반환했습니다. 이 경우 두 쿼리의 실행 계획을 보면 내부 조인이 외부 조인보다 비용이 더 많이 든다는 것을 알 수 있습니다. 내부 조인의 경우 SQL 서버가 해시 일치를 수행하는 반면 왼쪽 조인에 대해서는 중첩 루프를 수행하기 때문입니다.
해시 일치는 일반적으로 중첩 루프보다 빠릅니다. 그러나이 경우 행 수가 너무 적고 사용할 인덱스가 없기 때문에 (이름 열에 대한 조인을 수행하는 것처럼) 해시 작업이 가장 비싼 내부 조인 쿼리로 밝혀졌습니다.
그러나 조인 쿼리에서 일치하는 키를 Name에서 ID로 변경하고 테이블에 많은 행이있는 경우 내부 조인이 왼쪽 외부 조인보다 빠르다는 것을 알 수 있습니다.
MS 액세스 내부 및 외부 조인
MS Access 쿼리에서 여러 데이터 소스를 사용하는 경우 데이터 소스가 서로 연결되는 방식에 따라 보려는 레코드를 제어하기 위해 JOIN을 적용합니다.
내부 조인에서는 두 테이블의 관련 항목 만 단일 결과 집합으로 결합됩니다. 이것은 Access의 기본 조인이며 가장 자주 사용되는 조인이기도합니다. 조인을 적용하지만 조인 유형을 명시 적으로 지정하지 않은 경우 Access에서는 내부 조인으로 간주합니다.
외부 조인에서는 두 테이블의 모든 관련 데이터와 한 테이블의 나머지 모든 행이 올바르게 결합됩니다. 완전 외부 조인에서는 가능한 모든 데이터가 결합됩니다.
왼쪽 조인 대 왼쪽 외부 조인
SQL Server에서 왼쪽 외부 조인을 적용 할 때 키워드 outer는 선택 사항입니다. 따라서 'LEFT OUTER JOIN'또는 'LEFT JOIN'을 써도 두 가지 모두 동일한 결과를 얻을 수 있으므로 차이가 없습니다.
LEFT JOIN B는 A LEFT OUTER JOIN B와 동등한 구문입니다.
다음은 SQL 서버의 동등한 구문 목록입니다.
(영상 출처 )
왼쪽 외부 결합 대 오른쪽 외부 결합
우리는 이미이 기사에서 이러한 차이점을 확인했습니다. Left Outer Join 및 Right Outer Join 쿼리와 결과 집합을 참조하여 차이점을 확인할 수 있습니다.
Left Join과 Right Join의 주요 차이점은 일치하지 않는 행을 포함한다는 것입니다. 왼쪽 외부 조인에는 조인 절 왼쪽에있는 테이블의 일치하지 않는 행이 포함되는 반면 오른쪽 외부 조인에는 조인 절 오른쪽에있는 테이블에서 일치하지 않는 행이 포함됩니다.
병합 정렬 C ++ 예제
사람들은 왼쪽 조인 또는 오른쪽 조인을 사용하는 것이 더 나은지 묻습니다. 기본적으로 인수가 반전 된 경우를 제외하고는 동일한 유형의 작업입니다. 따라서 어떤 조인을 사용할 것인지 물으면 실제로 작성할 것인지 묻는 것입니다. ㅏ. 그것은 단지 선호도의 문제입니다.
일반적으로 사람들은 SQL 쿼리에서 Left 조인을 사용하는 것을 선호합니다. 쿼리를 해석하는 데 혼란을 피하기 위해 쿼리를 작성하는 방식에서 일관성을 유지해야합니다.
지금까지 내부 조인과 모든 유형의 외부 조인에 대해 살펴 보았습니다. 내부 조인과 외부 조인의 차이점을 간단히 요약 해 보겠습니다.
테이블 형식의 내부 조인과 외부 조인의 차이점
내부 조인 | 외부 결합 |
---|---|
두 테이블 모두에서 일치하는 값이있는 행만 반환합니다. | 두 테이블 사이에 일치하지 않는 행과 일부 일치하지 않는 행을 포함합니다. |
테이블에 많은 행이 있고 사용할 인덱스가있는 경우 일반적으로 INNER JOIN이 OUTER JOIN보다 빠릅니다. | 일반적으로 OUTER JOIN은 INNER JOIN과 비교할 때 더 많은 수의 레코드를 반환해야하므로 INNER JOIN보다 느립니다. 그러나 OUTER JOIN이 더 빠른 몇 가지 특정 시나리오가있을 수 있습니다. |
일치하는 항목이 없으면 아무것도 반환하지 않습니다. | 일치하는 항목이 없으면 반환 된 열 값에 NULL이 배치됩니다. |
특정 열의 자세한 정보를 조회하려면 INNER JOIN을 사용하십시오. | 두 테이블의 모든 정보 목록을 표시하려면 OUTER JOIN을 사용하십시오. |
INNER JOIN은 필터처럼 작동합니다. 내부 조인이 데이터를 반환하려면 두 테이블이 모두 일치해야합니다. | 데이터 추가 기능처럼 작동합니다. |
FROM 절에서 쉼표로 구분 된 방식으로 조인 할 테이블을 등록하는 내부 조인에 대한 암시 적 조인 표기법이 있습니다. 예 : SELECT * FROM product, category WHERE product.CategoryID = category.CategoryID; | 외부 조인에는 암시 적 조인 표기법이 없습니다. |
내부 및 외부 조인 대 유니온
때때로 우리는 Join과 Union을 혼동하며 이것은 또한 가장 일반적으로 묻는 질문 중 하나입니다. SQL 인터뷰 . 이미 내부 조인과 외부 조인의 차이점을 확인했습니다. 이제 JOIN이 UNION과 어떻게 다른지 살펴 보겠습니다.
UNION은 쿼리 줄을 서로 뒤에 배치하는 반면 조인은 데카르트 곱을 만들고 하위 집합을 만듭니다. 따라서 UNION과 JOIN은 완전히 다른 작업입니다.
MySQL에서 아래 두 개의 쿼리를 실행하고 그 결과를 확인하겠습니다.
UNION 쿼리 :
SELECT 28 AS bah UNION SELECT 35 AS bah;
결과:
바 | |
---|---|
1 | 28 |
두 | 35 |
JOIN 쿼리 :
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS bar ON (55=55);
결과:
foo | 바 | |
---|---|---|
1 | 38 | 35 |
UNION 연산은 둘 이상의 쿼리 결과를 단일 결과 집합에 넣습니다. 이 결과 집합은 UNION과 관련된 모든 쿼리를 통해 반환 된 모든 레코드를 보유합니다. 따라서 기본적으로 UNION은 두 결과 집합을 함께 결합합니다.
조인 작업은 이러한 테이블 간의 논리적 관계, 즉 조인 조건을 기반으로 두 개 이상의 테이블에서 데이터를 가져옵니다. 조인 쿼리에서 한 테이블의 데이터는 다른 테이블의 레코드를 선택하는 데 사용됩니다. 다른 테이블에있는 유사한 데이터를 연결할 수 있습니다.
매우 간단하게 이해하기 위해 UNION은 두 테이블의 행을 결합하고 조인은 두 개 이상의 테이블의 열을 결합한다고 말할 수 있습니다. 따라서 둘 다 n 테이블의 데이터를 결합하는 데 사용되지만 데이터가 결합되는 방식에 차이가 있습니다.
아래는 UNION과 JOIN의 그림 표현입니다.
위는 결과 집합의 각 레코드에 테이블 A와 테이블 B의 열이 모두 포함되어 있음을 나타내는 조인 작업의 그림 표현입니다.이 결과는 쿼리에 적용된 조인 조건에 따라 반환됩니다.
조인은 일반적으로 비정규 화 (정규화의 반대)의 결과이며 한 테이블의 외래 키를 사용하여 다른 테이블에서 기본 키를 사용하여 열 값을 조회합니다.
위는 결과 집합의 각 레코드가 두 테이블 중 하나의 행임을 나타내는 UNION 연산의 그림 표현입니다. 따라서 UNION의 결과는 테이블 A와 테이블 B의 행을 결합했습니다.
추가 읽기 = >> 예제와 함께 설명 된 MySQL UNION
결론
이 기사에서 우리는 SQL의 내부 조인 및 외부 조인 . 또한 외부 조인 (예 : 왼쪽 조인, 오른쪽 조인 및 전체 조인)의 분류도 확인했습니다. 이러한 각 조인 유형이 작동하는 방식과 서로 다른 방식을 살펴 보았습니다.
또한 이러한 조인 유형 간의 성능 비교도 수행했습니다. 또한 조인이 유니온과 어떻게 다른지에 대해서도 논의했습니다.
또한 읽기 = >> MySQL 조인 유형
이 기사가 다양한 조인 유형 간의 차이점에 대한 의심을 없애는 데 도움이 되었기를 바랍니다. 이것은 실제로 원하는 결과 집합에 따라 선택할 조인 유형을 결정하게 할 것이라고 확신합니다.