Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

TechBlog

[MSSQL/SQL Server] JOIN 종류 본문

Study/DB

[MSSQL/SQL Server] JOIN 종류

jiazzang 2024. 5. 25. 16:23

 

Join 종류로는 다음과 같은 것들이 있다.

 

  • Inner Join
  • Outer Join(left, right, full)
  • Cross Join
  • Cross Apply, Outer Apply
  • Self Join

 

1. Inner Join

Inner Join은 두 테이블의 조인 컬럼의 값이 일치하는 행만 결합된다.

따라서 Join의 결과는 두 테이블의 교집합이다.

 

<Inner Join 예시>

다음과 같이 두 테이블이 있다고 하자.

employee 테이블과 department 테이블을 Inner Join한다.

select *
from employee as e
inner join department as d
on e.dept_id = d.dept_id

 

Inner Join은 두 테이블의 dept_id 값이 일치하는 행만 결합되므로, Join의 결과는 다음과 같다.

Inner Join 결과

 

2. Outer Join

Outer Join은 조인 컬럼의 값이 일치하는 행뿐만 아니라, 일치하지 않는 행도 유지한다.

이때 왼쪽 테이블 값만 유지하면 Left Outer Join, 오른쪽 테이블 값만 유지하면 Right Outer Join, 두 테이블 값을 모두 유지하면 Full Outer Join이다.

 

(1) Left Outer Join

왼쪽 테이블을 기준으로 두 테이블의 조인 컬럼 값이 일치하는 행만 결합되고 일치하지 않는 부분은 null으로 채워진다.

 

(2) Right Outer Join

오른쪽 테이블을 기준으로 두 테이블의 조인 컬럼 값이 일치하는 행만 결합되고 일치하지 않는 부분은 null으로 채워진다.

 

(3) Full Outer Join

두 테이블의 조인 컬럼의 값이 일치하는 행은 값을 모두 표시하고, 일치하지 않는 부분은 Null로 표시하되 두 테이블의 모든 데이터가 조회된다.

 

<Outer Join 예시>

-- 1) Left Outer Join
select *
from employee as e
left outer join department as d
on e.dept_id = d.dept_id

-- 2) Right Outer Join
select *
from employee as e
right outer join department as d
on e.dept_id = d.dept_id

-- 3) Full Outer Join
select *
from employee as e
full outer join department as d
on e.dept_id = d.dept_id

 

 

Join의 결과는 다음과 같다.

Left Outer Join / Right Outer Join / Full Outer Join의 결과

 

Left Outer Join은 employee 테이블을 기준으로, employee 테이블과 department 테이블의 조인 컬럼인 dept_id 값이 일치하는 행은 그대로 결합되고, 일치하지 않는 경우 department 테이블의 컬럼 값들이 모두 null로 채워진다.

 

마찬가지로 Right Outer Join은 department 테이블이 기준이 된다.

 

Full Outer Join의 경우, 두 테이블의 조인 조건 컬럼(dept_id)의 값이 'A', 'B', 'C', 'D'로 일치하는 행에 대해서는 두 테이블의 값을 모두 표시하고, 일치하지 않는 경우 Null로 표시한다.

예를 들어 employee 테이블엔 dept_id = 'F'가 존재하지만 department 테이블엔 존재하지 않으므로, department 테이블의 컬럼 값들은 모두 null로 표시된다.

 

3. Cross Join

Cross Join에는 조인 조건이 존재하지 않으며, 두 테이블의 모든 행을 조인시킨다.

Join의 결과는 두 테이블의 데이터의 모든 조합에 해당하며, 결과 집합의 row 건 수는 두 테이블의 row 수의 곱이다.

-- 유저 테이블: 11건
select *
from userTbl

-- 구매 테이블: 13건
select *
from buyTbl

-- cross join (11*13 = 143건)
select *
from userTbl
cross join buyTbl

 

4. Cross Apply, Outer Apply

(1) Cross Apply

내부 테이블의 집합으로부터 조인 키로 결합한 외부 테이블의 행만을 반환한다.

 

(2) Outer Apply

내부 테이블의 집합으로부터 조인 키에 결합한 외부 테이블의 행과 그렇지 않은 행 전부를 반환한다.

이때 결합되지 않은 행의 값은 Null로 표시한다.

 

(3) 특징

- Cross apply의 결과 집합은 Inner join의 결과 집합과 같으며, Outer apply의 결과 집합은 Left outer join의 결과 집합과 같은 형태이다.

- 내부 테이블에 외부 테이블의 컬럼을 인자로 제공할 수 있다.

- 적절한 인덱스가 있을 경우 처리할 데이터를 줄여주므로 성능 향상에 도움이 될 수 있다.

 

5. Self Join

같은 테이블을 조인한다.

아래와 같이 customer 테이블은 고객 본인의 아이디(Customer_id), 본인의 이름(Name)과 배우자의 아이디(Spouse_id) 컬럼으로 구성되어 있다고 가정하자. 만약 배우자의 이름까지 알고 싶다면 어떻게 해야 할까?

이때 customer 테이블을 self join하면 배우자의 이름까지 붙여줄 수 있다.

customer 테이블 → customer 테이블을 self join한 결과

select c1.customer_id, c1.name, c1.spouse_id, c2.name
from customer as c1
inner join customer as c2
on c1.spouse_id = c2.customer_id