또한 수행하는 방법 LEFT JOIN
, RIGHT JOIN
그리고 FULL JOIN
에 적합?
또한 수행하는 방법 LEFT JOIN
, RIGHT JOIN
그리고 FULL 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
벤 다이어그램은 실제로 나를 위해하지 않습니다.
예를 들어, 크로스 조인과 내부 조인 간의 차이를 나타내지 않거나보다 일반적으로 다른 유형의 조인 술어 간의 차이를 나타내거나 작동 방식에 대한 추론을위한 프레임 워크를 제공합니다.
논리적 처리를 이해하는 대용은 없으며 어쨌든 파악하는 것이 비교적 간단합니다.
on
술어가 평가되는 행을 유지하면서 1 단계의 모든 행에 대해 절을 평가하십시오.true
(NB : 실제로 쿼리 최적화 프로그램은 위의 논리적 설명보다 더 효율적인 쿼리 실행 방법을 찾을 수 있지만 최종 결과는 동일해야합니다)
전체 외부 조인 의 애니메이션 버전부터 시작하겠습니다 . 자세한 설명은 다음과 같습니다.
소스 테이블
먼저 CROSS JOIN
(AKA 직교 곱)으로 시작하십시오. 여기에는 ON
절이 없으며 단순히 두 테이블에서 모든 행 조합을 반환합니다.
A. 컬러, B. 컬러에서 선택
내부 및 외부 조인에는 "ON"절 조건자가 있습니다.
A. 컬러, B. 컬러 A의 내부 참여 B에서 A. 컬러 = B. 컬러
위는 클래식 동등 조인입니다.
내부 조인 조건은 반드시 동등 조건 일 필요는 없으며 두 테이블 (또는 둘 다)의 열을 참조 할 필요는 없습니다. A.Colour NOT IN ('Green','Blue')
교차 결합 리턴의 각 행에서 평가 합니다.
내부 이너 조인 B에서 1 = 1의 A. 컬러, B. 컬러를 선택하십시오.
교차 조인 결과의 모든 행에 대해 조인 조건이 true로 평가되므로 교차 조인과 동일합니다. 나는 16 행의 그림을 다시 반복하지 않을 것이다.
외부 조인은 왼쪽 테이블의 행 (왼쪽 조인의 경우)이 오른쪽 테이블의 행과 전혀 조인되지 않는 경우 결과에 NULL
값 이 유지되는 것을 제외하고 내부 조인과 동일한 방식으로 논리적으로 평가됩니다 . 오른쪽 열.
이것은 단순히 이전 결과를 where 행만 반환하도록 제한합니다 B.Colour IS NULL
. 이 경우 오른쪽 테이블에서 일치하지 않았으므로 보존 된 행이되고 쿼리는 테이블에서 일치하지 않는 단일 빨간색 행을 반환합니다 B
. 이것을 반 세미 조인이라고합니다.
이 패턴이 올바르게 작동하고 값 이있는 행을 다시 가져 오지 않도록하기 위해 IS NULL
널 입력 가능하지 않거나 결합 조건이 NULL
값이 제외 되도록 보장 하기 위해 열을 선택하는 것이 중요 NULL
합니다. 일치하지 않는 행 외에도 열.
오른쪽 외부 조인은 오른쪽 테이블에서 일치하지 않는 행을 유지하고 왼쪽 열을 널 확장한다는 점을 제외하고 왼쪽 외부 조인과 유사하게 작동합니다.
완전 외부 조인은 왼쪽 및 오른쪽 조인의 동작을 결합하고 왼쪽 및 오른쪽 테이블 모두에서 일치하지 않는 행을 보존합니다.
교차 결합의 행이 1=0
술어 와 일치하지 않습니다 . 양쪽의 모든 행은 반대쪽 테이블의 열에 NULL이있는 일반 외부 조인 규칙을 사용하여 유지됩니다.
앞의 쿼리를 약간 수정 UNION ALL
하면 두 테이블 중 하나를 시뮬레이션 할 수 있습니다.
참고는 것을 WHERE
절 (있는 경우) 논리적으로 가입 한 후 실행합니다. 하나의 일반적인 오류는 왼쪽 외부 조인을 수행 한 다음 일치하지 않는 행을 제외시키는 오른쪽 테이블에 조건이있는 WHERE 절을 포함시키는 것입니다. 위의 결과는 외부 조인을 수행합니다.
... 그리고 "Where"절이 실행됩니다. NULL= 'Green'
외부 조인에 의해 보존 된 행은 (파란색과 함께) 폐기되어 결국 내부 조인으로 효과적으로 변환됩니다.
의도가 색상이 녹색 인 B의 행만 포함하고 올바른 구문에 관계없이 A의 모든 행을 포함하려는 경우
SQLFiddle.com에서 실시간으로 실행되는 이러한 예제를 참조하십시오 .
조인 은 두 테이블의 데이터를 결합하는 데 사용되며 결과는 새로운 임시 테이블입니다. 결합은 술어라는 것을 기반으로 수행되며, 결합을 수행하기 위해 사용할 조건을 지정합니다. 내부 조인과 외부 조인의 차이점은 내부 조인은 조인 조건자를 기준으로 실제로 일치하는 행만 반환한다는 것입니다. 예를 들어, Employee 및 Location 테이블을 고려하십시오.
내부 조인 :- 내부 조인은조인 조건 자에 따라두 테이블 ( Employee 및 Location )의 열 값을 결합하여 새 결과 테이블을 만듭니다. 쿼리는 Employee의 각 행을 Location의 각 행과비교하여 join-predicate를 만족시키는 모든 행 쌍을 찾습니다. NULL이 아닌 값을 일치시켜 결합 술어가 충족되면 직원 과 위치 의 일치하는 각 행 쌍의 열 값이 결과 행으로 결합됩니다. 내부 조인에 대한 SQL은 다음과 같습니다.
select * from employee inner join location on employee.empID = location.empID
OR
select * from employee, location where employee.empID = location.empID
이제 SQL 실행 결과는 다음과 같습니다.
외부 조인 :- 외부 조인은 두 조인 된 테이블의 각 레코드가 일치하는 레코드를 갖도록 요구하지 않습니다. 조인 된 테이블은 일치하는 다른 레코드가 없더라도 각 레코드를 유지합니다. 외부 조인은 유지되는 테이블 행 (왼쪽 또는 오른쪽)에 따라 왼쪽 외부 조인과 오른쪽 외부 조인으로 세분화됩니다.
왼쪽 외부 조인 :- 직원 및 위치 테이블에 대한 왼쪽 외부 조인 (또는 단순히 왼쪽 조인)의 결과는 조인 조건에서 일치하는 레코드를 찾을 수없는 경우에도항상 "왼쪽"테이블 ( 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
위의 표를 사용하여 오른쪽 외부 조인의 결과 집합이 어떻게 표시되는지 확인할 수 있습니다.
완전 외부 조인 :- 완전 외부 조인 또는 완전 조인은 조인 결과에 일치하지 않는 행을 포함시켜 일치하지 않는 정보를 유지하려면 완전 외부 조인을 사용하십시오. 다른 테이블의 값이 일치하는지 여부에 관계없이 두 테이블의 모든 행을 포함합니다.
일치하는 행만 검색하십시오 (즉,) 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"와 관련이 있습니다.
명령
주문 세부 사항
요청
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
OrderDetails 테이블에 무언가가있는 Orders 만 반환합니다.
외부 왼쪽 조인으로 변경하면
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
OrderDetails 레코드가없는 경우에도 Orders 테이블에서 레코드를 반환합니다.
where 절을 추가하여 고아 주문을 나타내는 OrderDetails가없는 주문을 찾을 수 있습니다 WHERE OrderDetails.OrderID IS NULL
.
SELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c, categories_description cd WHERE c.id = cd.categories_id AND c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASC
에 SELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c INNER JOIN categories_description cd ON c.id = cd.categories_id WHERE c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASC
성공 (MySQL의). 나는 추가 조건에 대해 확신하지 못했습니다, 그들은 잘 섞입니다 ...
간단한 말로 :
내부 조인 -> 상위 및 하위 테이블에서 공통 레코드 만 가져옵니다. 상위 테이블의 기본 키가 하위 테이블의 외래 키와 일치하는 경우.
왼쪽 조인 ->
의사 코드
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.
}
}
오른쪽 조인 : 왼쪽 조인과 정확히 반대입니다. Right join에서 오른쪽의 LEFT JOIN에 테이블 이름을 입력하면 LEFT JOIN과 동일한 출력이 표시됩니다.
외부 조인 : 두 테이블의 모든 레코드를 표시합니다 No matter what
. 왼쪽 테이블의 레코드가 기본 Forieign 키를 기준으로 오른쪽 테이블과 일치하지 않으면 조인 결과로 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
합니다).
내부 조인
2 개의 테이블 레코드 만 사용 하십시오. 직원 테이블의 기본 키 (id)는 하위 테이블의 foreign key와 일치합니다. 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;
도식적으로 다음과 같습니다.
이것은 모든 종류의 조인에 대한 좋은 다이어그램 설명입니다.
출처 : 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 / OUTER JOIN : 다음 과 같이 또는
함께 테이블 데이터를 모두 가질 수 있습니다 .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
INNER 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
LEFT [OUTER] JOIN :
위의 결과에서 테이블 중 하나의 모든 행을 동일한 관계로 사용하려면 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
글쎄, 당신의 필요로 당신은 당신의 필요를 다루는 각각을 선택합니다;).
full outer join
MySQL 에는 없다고 덧붙일 수 있습니다 .
내부 조인.
조인은 두 테이블의 행을 결합합니다. 내부 조인 쿼리에서 지정한 기준에 따라 두 개의 테이블을 일치하는 시도를하고 만 일치하는 행을 반환합니다. 조인의 첫 번째 테이블 행이 두 번째 테이블의 두 행과 일치하면 결과에 두 개의 행이 반환됩니다. 첫 번째 테이블에 두 번째 행과 일치하지 않는 행이 있으면 반환되지 않습니다. 마찬가지로 두 번째 테이블에 첫 번째 행과 일치하지 않는 행이 있으면 반환되지 않습니다.
외부 조인.
A는 가입 왼쪽 두 번째 테이블의 행에 대한 첫 번째 테이블에서 행을 일치 찾을 시도. 일치하는 항목을 찾을 수 없으면 첫 번째 테이블에서 열을 반환하고 두 번째 테이블의 열을 비워 둡니다 (널).
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
.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
연관성 즉, 옵티마이 저가 가장 많은 옵션을 가지고 있음을 의미합니다. 동일한 결과를 더 빨리 유지하기 위해 결합 순서를 재정렬 할 수 있습니다. 옵티마이 저는 가장 많은 결합 모드를 사용할 수 있습니다.
일반적으로 INNER JOIN
다른 종류의 조인 대신 사용하는 것이 좋습니다 . (물론 예상되는 결과 세트를 고려할 수 있다면)
이 이상한 연관 행동에 대한 몇 가지 좋은 예와 설명이 있습니다.
INNER JOIN
보다 느리고 LEFT JOIN
사람들은 예기치 않은 결과 를 제거 하기 위해 를 추가하는 LEFT JOIN
대신 사용할 수 있습니다 .). INNER JOIN
WHERE
NULL
INNER
느리다고 생각 합니까?
많이 사랑받는 붉은 그늘의 벤 다이어그램을 비난하면서 나는 내 자신의 시도를 게시하는 것이 공정하다고 생각했습니다.
@Martin Smith의 대답이 먼 길 에서이 묶음 중 최고이지만, 각 테이블의 키 열만 표시하지만 키가 아닌 열도 표시해야한다고 생각합니다.
반 시간 동안 내가 할 수있는 최선을 다했지만 여전히 키 값이 없기 때문에 null이 TableB
있거나 OUTER JOIN
실제로 조인이 아닌 합집합이라는 것이 적절하게 표시되지 않는다고 생각합니다 .
TableA a LEFT OUTER JOIN TableB b
와 함께TableB B RIGHT OUTER JOIN TableA a
에 대한 정확한 알고리즘은 INNER JOIN
, LEFT/RIGHT OUTER JOIN
다음과 같습니다 :
a
(a, b[i])
ON ...
각 쌍에 대해 절을 평가하십시오 .ON( a, b[i] ) = true/false?
true
결합 된 행을 반환합니다 (a, b[i])
.Outer Join
을 반환 합니다. LEFT 외부 조인 또는 RIGHT 외부 조인. 이는 첫 번째 테이블의 모든 행이 최종 결과에 존재하도록하기위한 것입니다.Null
(a, Null)
(Null, b)
참고 :ON
절에 지정된 조건은 무엇이든 될 수 있으며 기본 키 를 사용할 필요는 없습니다 (두 테이블의 열을 항상 참조 할 필요는 없습니다)! 예를 들면 다음과 같습니다.
... ON T1.title = T2.title AND T1.version < T2.version
(=>이 게시물을 샘플 사용법으로 참조하십시오 . 열에 최대 값을 가진 행만 선택하십시오 )... ON T1.y IS NULL
... ON 1 = 0
(샘플 그대로)참고 : 왼쪽 조인 = 왼쪽 외부 조인, 오른쪽 조인 = 오른쪽 외부 조인
가장 간단한 정의
내부 조인 : 두 테이블에서 일치하는 레코드 를 반환 합니다.
완전 외부 가입 : 반환 일치와 타의 추종을 불허하는 기록 에서 타의 추종을 불허하는 기록을 위해 널 (null)와 두 테이블에서 두 테이블 .
왼쪽 외부 조인 : 왼쪽의 테이블에서만 일치 및 일치하지 않는 레코드를 반환합니다 .
Right Outer Join : Right Side의 테이블에서만 일치하고 일치하지 않는 레코드를 반환합니다 .
짧은
일치 + 왼쪽 일치하지 않음 + 오른쪽 일치하지 않음 = 완전 외부 조인
일치 + 왼쪽 일치하지 않음 = 왼쪽 외부 결합
일치 + 오른쪽 불일치 = 오른쪽 외부 조인
일치 = 내부 조인
예
각각 단일 열이있는 두 개의 테이블과 다음과 같은 데이터가 있다고 가정합니다.
A B
- -
1 3
2 4
3 5
4 6
7
8
(1,2,7,8)은 A에 고유하고 (3,4)는 공통이며 (5,6)은 B에 고유합니다.
INNER JOIN 키워드는 조건이 만족되는 한 두 테이블에서 모든 행을 선택합니다. 이 키워드는 조건이 만족되는 조건 (예 : 공통 필드 값)이 동일한 두 테이블의 모든 행을 결합하여 결과 집합을 만듭니다.
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
이 조인은 조인의 왼쪽에있는 테이블의 모든 행과 조인의 오른쪽에있는 테이블에 대한 일치하는 행을 반환합니다. 오른쪽에 일치하는 행이없는 행에는 결과 집합에 null이 포함됩니다. LEFT JOIN은로도 알려져 있습니다 LEFT OUTER JOIN
.
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
7 | null
8 | null
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
전체 (외부) 가입 :
FULL JOIN은 LEFT JOIN과 RIGHT JOIN의 결과를 결합하여 결과 집합을 만듭니다. 결과 집합에는 두 테이블의 모든 행이 포함됩니다. 일치하지 않는 행은 결과 집합에 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
7 | null
8 | null
내부 조인 - 동등한 쿼리 중 하나를 사용 하는 내부 조인 은 두 테이블 , 즉 공통된 두 행 의 교차를 제공합니다 .
왼쪽 외부 조인 - 왼쪽 외부 조인 은 A의 모든 행과 B의 공통 행을 제공합니다.
완전 외부 조인 - 완전 외부 조인 은 A와 B, 즉 A의 모든 행과 B의 모든 행을 통합합니다. A의 항목에 B에 해당 데이텀이없는 경우 B 부분은 다음과 같습니다. null 및 그 반대
Join is not an intersection unless the tables have the same columns
원하는 열을 결합 할 수 있으며 값이 일치하면 서로 결합됩니다.
1. 내부 조인 : 조인 이라고도합니다. 일치하는 경우 에만 왼쪽 테이블과 오른쪽 테이블 모두에 존재하는 행을 리턴합니다 . 그렇지 않으면 레코드 0을 반환합니다.
예:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
INNER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
2. 전체 외부 조인 : 전체 조인이라고도합니다. 왼쪽 테이블과 오른쪽 테이블 모두에있는 모든 행을 반환 합니다.
예:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
FULL OUTER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
3. 왼쪽 외부 조인 : 또는 간단히 왼쪽 조인이라고합니다. 왼쪽 테이블에있는 모든 행과 오른쪽 테이블 (있는 경우)의 일치하는 행을 반환합니다.
4. 오른쪽 외부 조인 : 오른쪽 조인이라고도합니다. 왼쪽 테이블 (있는 경우)과 오른쪽 테이블에있는 모든 행에서 일치하는 행을 반환합니다.
조인의 장점
아래 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
위에서 볼 수 있듯이 dept_id 가 Department 테이블에서 일치하는 항목을 찾지 못 하므로 출력의 EMP 에서 Jose
인쇄 되지 않습니다. 이와 유사하게, 그리고 행은에서 인쇄되지 않은 부서 가 EMP 테이블에서 일치하는 항목을 찾을 수 없습니다로 테이블.6
HR
R&D
따라서 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은 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행만 반환합니다.
참조하십시오 대답 하여 마틴 스미스를 다른 포함한 사이, 특히 차이, 조인의 더 나은 illustations 및 설명을 위해 FULL OUTER JOIN
, RIGHT OUTER JOIN
그리고 LEFT OUTER JOIN
.
이 두 표는 JOIN
아래의 표를 나타내는 기초를 형성 합니다.
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
와 같다 LEFT JOIN
SELECT *
FROM citizen c
LEFT JOIN postalcode p ON c.postal = p.postal
에 citizen
일치하는 항목이 없더라도 결과는 모든 것 입니다 postalcode
. 다시 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 JOIN
일반 아이디어 / 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
직교 제품이됩니다. 그것은 일반적인 아이디어와 동일합니다 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
테이블) 의 세트를 나타냅니다 .
두 세트의 모든 요소가 다른 세트의 모든 요소와 일치 하므로이 데카르트 곱을 제대로 나타내려면 모든 요소의 양과 A
모든 B
요소의 양이 필요합니다 . 세트 이론은 세트의 여러 동일한 요소에 대해 만들어지지 않았으므로 벤 다이어그램이 비실용적이거나 불가능한 것을 올바르게 나타내는 것으로 나타났습니다. 그런 것 같지 않아B
A
UNION
.
행은 구별됩니다. 는 UNION
총 7 행이다. 그러나 공통 SQL
결과 집합과 호환되지 않습니다 . 그리고 이것은 전혀 CROSS JOIN
작동 방식이 아닙니다 .
다음과 같이 표현하려고합니다.
..하지만 지금은 단지처럼 보이는 INTERSECTION
그것은 확실히이다하는, 하지 . 또한 INTERSECTION
실제로 두 개의 다른 세트에있는 요소가 없습니다 . 그러나 다음과 유사한 검색 가능한 결과와 매우 유사합니다.
참고로 CROSS JOIN
s에 대한 하나의 검색 가능한 결과 는 Tutorialgateway . 이 INTERSECTION
것과 마찬가지로는 비어 있습니다.
요소의 값은 JOIN
조건에 따라 다릅니다 . 모든 행이 해당 조건에 고유하게되는 조건에서이를 나타낼 수 있습니다. 한 행에 id=x
대해서만 의미 가 있습니다. 테이블의 행이되면 ( ) 테이블의 여러 행과 일치 ( 세 이하) 조건, 결과는 같은 문제가 행이 여러 번 표현해야하고, 집합 이론은 정말 위해 만든되지 않습니다. 고유성 조건에서는 다이어그램이 작동 할 수 있지만 조건에 따라 다이어그램에서 요소의 위치가 결정됩니다. 타기 위해 나머지 행과 함께 조건 의 값만 살펴보십시오 .A
citizen
B
postalcode
JOIN
CROSS JOIN
JOIN
JOIN
이 표현은 을로 만드는 조건 에서 INNER JOIN
with를 사용할 때 완전히 분리됩니다 .ON 1 = 1
CROSS JOIN
자기 -로 JOIN
, 행은 두 테이블에서 사실 idential 요소에 있지만, 모두 같은 테이블을 표현 A
하고하는 것은 B
매우 적합하지 않습니다. 예를 들어 일반적인 자기 JOIN
의 요소를 만드는 조건이 A
일치하는 될 다른 B의 요소가된다 ON A.parent = B.child
에서 일치하기 A
에 B
별도의 요소. 다음 SQL
과 같은 예에서 :
SELECT *
FROM citizen c1
JOIN citizen c2 ON c1.id = c2.leader
의미 Smith는 Green과 Jensen의 리더입니다.
한 행에 다른 테이블의 행과 여러 개의 일치가 있으면 문제가 다시 시작됩니다. OUTER JOIN
빈 세트와 일치 할 수 있기 때문에 이것은 더 복잡 합니다. 그러나 세트 이론에서 모든 세트 C
와 빈 세트 의 결합 은 항상 단지 C
입니다. 빈 세트는 아무것도 추가하지 않습니다. 이것에 대한 표현 LEFT OUTER JOIN
은 일반적으로 일치 여부에 관계없이 A
행 A
이 선택 되었음을 나타내는 모든 것을 보여줍니다 B
. 그러나 "일치하는 요소"에는 위의 그림과 같은 문제가 있습니다. 조건에 따라 다릅니다. 그리고 빈 세트는 방황 한 것처럼 보입니다 A
.
CROSS JOIN
달에 Smith와 우편 번호 가있는 모든 행 찾기 :
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE c.name = 'Smith'
AND p.area = 'Moon';
이제 벤 다이어그램은을 반영하는 데 사용되지 않습니다 JOIN
. 다음 절 에만 사용 됩니다WHERE
.
.. 그리고 말이 되네요.
설명 된 것처럼 INNER JOIN
실제로는 아닙니다 INTERSECT
. 그러나 INTERSECT
별도의 쿼리 결과에는 s를 사용할 수 있습니다. 별도의 쿼리의 요소가 실제로 결과 중 하나 또는 둘 다에 속하는 행이기 때문에 Venn 다이어그램이 의미가 있습니다. 교차는 두 행 모두에 행이있는 경우에만 결과를 반환합니다. 이는 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';
.. 그리고 결과를 제공합니다 :
또한 Venn 다이어그램이 의미가 있습니다.
중요한 점은 이러한에만 작동 두 SELECT의의 결과의 구조가 비교 또는 조합을 가능하게 같을 때이다. 이 두 가지 결과는 다음을 가능하게하지 않습니다.
SELECT *
FROM citizen
WHERE name = 'Smith'
SELECT *
FROM postalcode
WHERE area = 'Moon';
.. 결과와 결합하려고 UNION
하면
ORA-01790: expression must have same datatype as corresponding expression
더 관심을 읽을 들어 설명하면서 때 벤 다이어그램에 말 NO를 조인 및 SQL은 벤 다이어그램으로 조인 . 둘 다 커버 EXCEPT
.
의 차이 inner join
와는 outer join
다음과 같다 :
Inner join
일치하는 튜플을 기반으로 테이블을 결합한 조인이지만 일치하는 튜플 outer join
과 일치하지 않는 튜플을 기반으로 테이블을 결합한 조인입니다.Inner join
일치하지 않는 행이 생략 된 두 테이블에서 일치하는 행을 병합하는 반면, 두 테이블의 행을 병합하면 일치하지 않는 행은 outer join
널값으로 채워집니다.Inner join
교차 연산 outer join
과 같지만 통합 연산과 같습니다.Inner join
두 가지 유형이지만 outer join
세 가지 유형입니다.outer join
보다 빠릅니다 inner join
.