SQL Server에서 왼쪽 조인과 오른쪽 조인의 차이점
SQL Server의 조인에 대해 알고 있습니다.
예를 들어. Table1, Table2의 두 테이블이 있습니다.
그들의 테이블 구조는 다음과 같습니다.
create table Table1 (id int, Name varchar (10))
create table Table2 (id int, Name varchar (10))
다음과 같은 Table1 데이터 :
Id Name
-------------
1 A
2 B
다음과 같은 Table2 데이터 :
Id Name
-------------
1 A
2 B
3 C
아래 언급 된 SQL 문을 모두 실행하면 두 출력이 동일합니다.
select *
from Table1
left join Table2 on Table1.id = Table2.id
select *
from Table2
right join Table1 on Table1.id = Table2.id
위의 SQL 문에서 왼쪽과 오른쪽 조인의 차이점을 설명하십시오.
Select * from Table1 left join Table2 ...
과
Select * from Table2 right join Table1 ...
실제로 완전히 호환됩니다. 그러나 차이점을 보려면 Table2 left join Table1
(또는 동일한 쌍 Table1 right join Table2
) 시도 하십시오. Table2에는 Table1에없는 id를 가진 행이 있으므로이 쿼리는 더 많은 행을 제공해야합니다.
Codeproject에는 다음과 같은 SQL 조인의 간단한 기본 사항을 설명하는이 이미지가 있습니다. http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx
데이터를 가져 오는 테이블은 'LEFT'입니다.
가입하려는 테이블이 'RIGHT'입니다.
왼쪽 결합 : 왼쪽 테이블에서 모든 항목을 가져오고 오른쪽 테이블에서 일치하는 항목 만 가져옵니다.
RIGHT JOIN : 오른쪽 테이블에서 모든 항목을 가져오고 왼쪽 테이블에서 일치하는 항목 만 가져옵니다.
그래서:
Select * from Table1 left join Table2 on Table1.id = Table2.id
제공합니다 :
Id Name
-------------
1 A
2 B
그러나:
Select * from Table1 right join Table2 on Table1.id = Table2.id
제공합니다 :
Id Name
-------------
1 A
2 B
3 C
당신은 바로 더 행이 테이블에 적은 행이 테이블에 합류했다
및
더 많은 행과 함께 테이블에 적은 행이 테이블에 합류 왼쪽, 다시
시도하십시오
If Table1.Rows.Count > Table2.Rows.Count Then
' Left Join
Else
' Right Join
End If
(INNER) JOIN : 두 테이블에서 일치하는 값을 가진 레코드를 반환합니다.
LEFT (OUTER) JOIN : 왼쪽 테이블에서 모든 레코드를 반환하고 오른쪽 테이블에서 일치하는 레코드를 반환합니다.
RIGHT (OUTER) JOIN : 오른쪽 테이블에서 모든 레코드를 반환하고 왼쪽 테이블에서 일치하는 레코드를 반환합니다.
FULL (OUTER) JOIN : 왼쪽 또는 오른쪽 테이블에 일치하는 모든 레코드를 반환합니다
예를 들어 다음과 같은 레코드가있는 두 개의 테이블이 있다고 가정합니다.
표 A
id firstname lastname
___________________________
1 Ram Thapa
2 sam Koirala
3 abc xyz
6 sruthy abc
표 B
id2 place
_____________
1 Nepal
2 USA
3 Lumbini
5 Kathmandu
내부 조인
참고 : 두 테이블의 교차점을 제공합니다.
통사론
SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
샘플 테이블에 적용하십시오.
SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA INNER JOIN TableB ON TableA.id = TableB.id2;
결과는 다음과 같습니다.
firstName lastName Place
_____________________________________
Ram Thapa Nepal
sam Koirala USA
abc xyz Lumbini
왼쪽 조인
참고 : TableA에서 선택한 모든 행과 TableB에서 선택한 모든 일반 행을 제공합니다.
SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;
샘플 테이블에 적용하십시오
SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA LEFT JOIN TableB ON TableA.id = TableB.id2;
결과는 다음과 같습니다.
firstName lastName Place
______________________________
Ram Thapa Nepal
sam Koirala USA
abc xyz Lumbini
sruthy abc Null
바로 가입
참고 : TableB에서 선택한 모든 행과 TableA에서 공통으로 선택된 행을 제공합니다.
통사론:
SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;
samole 테이블에 적용하십시오.
SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA RIGHT JOIN TableB ON TableA.id = TableB.id2;
결과는 bw입니다.
firstName lastName Place
______________________________
Ram Thapa Nepal
sam Koirala USA
abc xyz Lumbini
Null Null Kathmandu
전체 가입
참고 : 통합 연산과 동일하며 두 테이블에서 선택한 모든 값을 반환합니다.
통사론:
SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;
samp [le 테이블에 적용하십시오 :
SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA FULL JOIN TableB ON TableA.id = TableB.id2;
결과는 다음과 같습니다.
firstName lastName Place
______________________________
Ram Thapa Nepal
sam Koirala USA
abc xyz Lumbini
sruthy abc Null
Null Null Kathmandu
몇 가지 사실
INNER 조인의 경우 주문은 중요하지 않습니다
(왼쪽, 오른쪽 또는 전체) 외부 조인의 경우 순서가 중요합니다.
w3schools 에서 더 찾기
select fields
from tableA --left
left join tableB --right
on tableA.key = tableB.key
의 테이블 from
이 예제에서는 tableA
, 관계의 왼쪽에있다.
tableA <- tableB
[left]------[right]
따라서 왼쪽 테이블 ( tableA
) 에서 모든 행을 가져 오려면 오른쪽 테이블 ( tableB
)에 일치하는 항목이 없더라도 "왼쪽 조인"을 사용합니다.
오른쪽 테이블 ( tableB
) 에서 모든 행을 가져 오려면 왼쪽 테이블 ( tableA
)에 일치하는 항목이 없더라도 right join
.
따라서 다음 쿼리는 위에서 사용한 것과 동일합니다.
select fields
from tableB
right join tableA on tableB.key = tableA.key
" RIGHT OUTER JOIN
사용하는 LEFT OUTER JOIN
구문을 다시 작성할 수 있다면 왜 RIGHT OUTER JOIN
구문이 있는가?" 라고 묻는 것 같습니다. 이 질문에 대한 답은 언어 디자이너가 사용자에게 그러한 제한을두기를 원하지 않았기 때문에 (그리고 그들이 비판을 받았다고 생각하기 때문에) 사용자가 테이블의 순서를 변경하도록 강요했기 때문이라고 생각합니다 에 FROM
어떤 상황에서 절 단지가 조인 유형을 변경하는 경우.
두 진술은 동일합니다.
대부분의 사람들 LEFT JOIN
은 더 직관적 인 것처럼 보이기 때문에 사용 하며 보편적 인 구문이기 때문에 모든 RDBMS를 지원한다고 생각하지는 않습니다 RIGHT JOIN
.
나는 우리가 원하는 결과를 얻도록 마지막 그림의 절에 AND
조건 이 필요할 수 있다고 생각 합니다. 검색어를 업데이트해야한다고 생각합니다.where
Outer Excluding JOIN
A Union B Minus A Interaction B
SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL AND B.Key IS NULL
를 사용 OR
하면 모든 결과를 얻을 수 있습니다.A Union B
Table1.id = Table2.id의 Table1 왼쪽 조인 Table2에서 *를 선택하십시오.
첫 번째 쿼리에서 왼쪽 조인 은 왼쪽 테이블 table1 과 오른쪽 테이블 table2를 비교 합니다.
table1의 모든 속성 이 표시되는 반면 table2 에는 조건이 true 인 속성 만 표시됩니다.
Table1.id = Table2.id의 Table2 오른쪽 조인 Table1에서 *를 선택하십시오.
첫 번째 쿼리에서 오른쪽 조인 은 오른쪽 테이블 table1 과 왼쪽 테이블 table2를 비교 합니다.
table1의 모든 속성 이 표시되는 반면 table2 에는 조건이 true 인 속성 만 표시됩니다.
첫 번째 왼쪽 조인 쿼리 에서 table1 과 table2 를 각각 왼쪽과 오른쪽으로 선언 하고 두 번째 오른쪽 조인 에서 table1 과 table2 를 각각 오른쪽과 왼쪽 으로 선언하는 것처럼 쿼리에서 테이블 선언 순서가 다르기 때문에 두 쿼리 모두 동일한 결과를 제공합니다. 질문.
이것이 두 쿼리에서 동일한 결과를 얻는 이유입니다. 다른 결과를 원한다면이 두 쿼리를 각각 실행하십시오.
Table1.id = Table2.id의 Table1 왼쪽 조인 Table2에서 *를 선택하십시오.
Table1.id = Table2.id의 Table1 오른쪽 조인 Table2에서 *를 선택하십시오.
Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id
정의 : 왼쪽 조인은 "on"키워드 다음의 기준과 일치하는 표 1의 "select"키워드로 언급 된 모든 열과 표 2의 열을 선택합니다.
마찬가지로 정의에 의해 : 오른쪽 조인은 "on"키워드 뒤의 기준과 일치하는 표 2의 "select"키워드로 언급 된 모든 열과 표 1의 열을 선택합니다.
귀하의 질문을 참조하면, 두 테이블의 id는 출력에 던져지는 데 필요한 모든 열과 비교됩니다. 따라서 id 1과 2는 두 테이블에서 공통적이며 결과적으로 첫 번째 와 두 번째 테이블의 id 및 name 열 이있는 네 개의 열이 순서대로 표시됩니다.
*select * from Table1 left join Table2 on Table1.id = Table2.id
위의 표현식은 표 1의 모든 레코드 (행)와 표 1 및 표 2 의 ID 가 일치하는 열을 표 2에서 가져옵니다.
select * from Table2 right join Table1 on Table1.id = Table2.id**
위의 식과 마찬가지로 표 1과 표 2 의 일치하는 ID 와 표 2 의 일치하는 테이블 1과 열의 모든 레코드 (행)를 가져옵니다 . (이것은 올바른 조인이므로 table2의 모든 열은 그렇지 않습니다. table1에서 고려됩니다).
'Programing' 카테고리의 다른 글
setDrawerListener 메소드는 추천되지 않습니다 (0) | 2020.04.25 |
---|---|
"if x : return x"문을 피하는 파이썬 방식 (0) | 2020.04.25 |
범위를 벗어난 배열에 액세스하는 것이 얼마나 위험합니까? (0) | 2020.04.25 |
Express 4.0으로 파일 업로드 : req.files undefined (0) | 2020.04.25 |
힘내 빨리 감기 VS 빨리 감기 병합 (0) | 2020.04.25 |