ㅈㅣ니 2024. 7. 11. 20:07

오늘은 JOIN 구문에 대해서 알아보는 시간을 가져볼 것이다.

 

조인이란?

조인은 관계가 있는 두 개 이상의 테이블을 주어진 조건으로 결합하여 하나의 결과 집합으로 출력하는 기능이다.

 

구문 예시 )

SELECT *
FROM 테이블명 a JOIN 테이블명 b
ON 조인조건

 

CROSS JOIN 을 제외한 조인들은 결과 집합을 만들기 위해 테이블 간의 관계를 갖는 조건이 요구되는데, ON 절에 기술된 열이 조인의 관계로 사용되는 키가 된다.

 

예시 테이블 ( Employee , Department 테이블)

 

 

실제 테이블

 

직원의 정보를 저장하는 Employee 테이블과 부서 정보를 저장하는 Department 테이블이 있다.

두 테이블은 Dept_NO 라는 부서 코드 열로 관계를 가지는데,

 

다음과 같이 쿼리를 작성하면 특정 직원의 부서 이름을 출력할 수 있다.

SELECT e.Name, d.Dept_Name
FROM emp.Employee e INNER JOIN emp.Department d
ON e.Dept_No = d.Dept_No
WHERE e.Name = '김한주'

⇒ 두 테이블을 dept_no 열을 기준으로 조인했다.

 

 

조인의 종류

조인의 종류는 아래와 같이 분류할 수 있다.

 

조인 논리적 조인 INNER JOIN
OUTER JOIN
CROSS JOIN
APPLY
물리적 조인 Nested Loop Join
Merge JOIN
Hash JOIN

=> 물리적 조인은 논리적 조인을 처리하기 위한 방법이다.

 

INNER JOIN

INNER JOIN은 조인 조건을 만족하는 데이터만 결과로 출력하는 조인이다.

 

이런식으로 표현할 수 있다.

⇒ 조인 조건을 기준으로 A와 B의 교집합이 되는 부분이 INNER JOIN된 결과 집합이 된다.

 

쿼리문으로 설명하면 다음과 같다.

SELECT e.Name, d.Dept_No, d.Dept_Name
FROM emp.Employee e INNER JOIN emp.Department d
ON e.Dept_No = d.Dept_No

 

 

OUTER JOIN

OUTER JOIN은 조인 조건을 만족하는 데이터와 함께 기준이 되는 테이블의 조인 실패 행까지 출력하는 조인이다.

 

기준은 LEFT, RIDHT, FULL 이렇게 3가지로 정의할 수 있다.

 

LEFT OUTER JOIN의 집합 관계

 

LEFT OUTER JOIN은 왼쪽 테이블이 기준 테이블이 된다.

 

조인 조건을 통해 A와 B의 교집합이 되는 데이터 (2)와 함께

A 테이블에서 조인이 실패하는 행(1)까지 최종 결과 집합에 포함된다.

 

쿼리문으로 설명하면 다음과 같다.

SELECT e.Name, d.Dept_No, d.Dept_Name
FROM emp.Employee e LEFT OUTER JOIN emp.Department d
ON e.Dept_NO = d.Dept_No

기준이 되는 Employee 테이블은 조인이 실패하는 행을 NULL 값으로 입력하여 조인에 성공한 행과 함께 출력된다.

 

 

RIGHT OUTER JOIN의 집합 관계

 

RIGHT OUTER JOIN 은 위에서 설명한 LEFT OUTER JOIN과는 반대로 오른쪽 테이블이 기준 테이블이 된다.

조인 조건을 통해 교집합이 되는 데이터(2)와 함께 B테이블에서 조인이 실패하는 행(1)까지 최종 결과 집합에 포함된다.

 

쿼리문으로 설명하면 다음과 같다.

SELECT e.Name, d.Dept_No, d.Dept_Name
FROM emp.Employee e RIGHT OUTER JOIN emp.Department d
ON e.Dept_No = d.Dept_No

기준이 되는 Department테이블은 조인이 실패하는 행을 NULL값으로 입력하여 조인에 성공한 행과 함께 출력된다.

 

 

FULL OUTER JOIN의 집합 관계

FULL OUTER JOIN 은 양쪽 테이블이 모두 기준 테이블이 되며 조인 조건을 통해 교집합이 되는 데이터(2)와 함께 각 테이블에서 조인에 실패하는 행(1)까지 최종 결과 집합에 포함된다.

 

쿼리문으로 설명하면 다음과 같다.

SELECT e.Name, d.Dept_No, d.Dept_Name
FROM emp.Employee e FULL OUTER JOIN emp.Department d
ON e.Dept_No = d.Dept_No

기준이 되는 두 테이블은 조인에 실패하는 행을 NULL 값으로 입력하여 조인에 성공한 행과 함께 최종 출력한다.

 

 

CROSS JOIN

CROSS JOIN은 조인 조건 없이 두 테이블에 대한 모든 행을 조인하는 기능이다.

카티션 곱(Cartesian Product)이라고 불리며, 결과 행 수는 각 테이블의 행을 곱한 수와 같다.

 

쿼리문으로 설명하면 다음과 같다.

SELECT e.Name, d.Dept_No, d.Dept_Name
FROM emp.Employee e CROSS JOIN emp.Department d
WHERE e.EMP_NO IN (1,2,3)
AND d.Dept_No IN (10,20,30)

 

모든 행을 조인하게 되면 7행 * 5행이 출력되기 때문에 WHERE절에 조건을 넣었다.

 

 

APPLY

APPLY는 일반적인 조인과 유사하지만, 조인하는 과정에서 인라인 뷰(Inline View)나 테이블 반환 함수의 매개변수로 값을 전달할 수 있다는 것에 차이가 있다.

출력 방식으로는 CROSS APPLY 와 OUTER APPLY로 나누어진다.

 

CROSS APLY 방식은 다음과 같다.

SELECT d.Dept_Name, d.Dept_No, e.Name
FROM emp.Department d CROSS APPLY 
(SELECT TOP 1 NAME 
    FROM emp.Employee e 
    WHERE e.Dept_No = d.Dept_No
    ORDER BY Emp_No DESC ) e

내부 조인한 결과에서 emp_no 열 기준 가장 높은 1건씩만 출력하는 것이다.

 

 

OUTER APPLY 방식은 다음과 같다.

SELECT d.Dept_Name, d.Dept_No, e.Name
FROM emp.Department d OUTER APPLY 
(SELECT TOP 1 NAME
	FROM emp.Employee e
	WHERE e.Dept_No = d.Dept_No
	ORDER BY Emp_No DESC ) e

 

CROSS APPLY는 INNER JOIN이랑 같고, OUTER APPLY는 LEFT OUTER JOIN과 같다.

위의 구문은 조인에 실패하는 행에 NULL 값이 입력되어 최종 결과 집합에 포함된다.

 

 

반응형