SQL _ Join의 이해 (Inner Join과 Outer Join)

Cherry·2022년 11월 8일
1

Linux

목록 보기
5/5
post-thumbnail

📌 Inner Join

Inner Join을 간단하게 설명하자면 조건에 부합하는 행만 가져온다.
위의 사진을 참고하여 교집합을 떠올리면 가장 적합하다.

예를 들어보자, 위의 직책번호에서 교집합이 되는 직책번호가 있다.
이를 참고하여 Join 명령문을 작성해보자.

SELECT * FROM 사원 INNER JOIN 직책 ON 사원.직책번호 = 직책.직책번호;
SELECT * FROM 사원 INNER JOIN 직책 WHERE사원.직책번호 = 직책.직책번호;

🔨 조인하려는 테이블 명을 JOIN을 기준으로 양쪽에 써줍니다.
🔨 교집합이 되는 각 테이블의 칼럼명을 ON이나 혹은 WHERE로 위와 같이 명시해 줍니다.

이렇게 Join 명령문을 작성한다면,


위와 같이 겹치는 칼럼이 존재하는 경우에만 생성이 되는 것을 확인 할 수 있다.
만약 겹치지 않는 칼럼도 생성하고 싶은 경우에는 어떻게해야할까 ?
Outer Join으로 이어 알아보자.


📌 Outer Join

Outer Join을 설명하는 사진이다.

Inner Join과 동일하게 두가지의 테이블 정보를 가져오게 되는데
차이점은 outer 조인의 경우 교집합뿐만 아닌 교집합이 되지 않는 테이블의 정보도 가져온다.
또한 기준이 되는 테이블이 필요하다.

기준이되는 테이블대상이되는 테이블로 되어있다.
여기서 기준이되는 테이블을 드라이빙 테이블이라고 한다.

Outer join에는 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN 세가지 종류가 있다.


왼쪽 테이블 명은 A, 오른쪽 테이블명은 B라고 생각하고, 위 사진을 예시로 알아보자.


🔹 1. LEFT OUTER JOIN

LEFT OUTER JOIN은 기준 테이블을 왼쪽에 두고, OUTER JOIN을 수행한다.
기준 테이블은 움직이거나 변형이 없고, 대상이 되는 테이블이 변형된다.

SELECT *FROM A LEFT OUTER JOIN B ON A.학번 = B.학번

🔨 조인하려는 테이블 명을 LEFT OUTER JOIN 을 기준으로 양쪽에 써줍니다.
🔨 교집합이 되는 각 테이블의 칼럼명을 ON이나 혹은 WHERE로 위와 같이 명시해 줍니다.

기준이되는 왼쪽테이블은 그대로 유지가 되며, 오른쪽에서 교집합이 되는 테이블은 생성이 된 것을 확인 할 수 있다. 교집합이 되지 않는 테이블도 NULL값으로 표시하며 나타나있는 것을 확인 할 수 있다.


🔹 2. RIGHT OUTER JOIN

RIGHT OUTER JOIN은 기준 테이블을 오른쪽에 두고, OUTER JOIN을 수행한다.
기준 테이블은 움직이거나 변형이 없고, 대상이 되는 테이블이 변형된다.

SELECT *FROM A RIGHT OUTER JOIN B ON A.학번 = B.학번

🔨 조인하려는 테이블 명을 RIGHT OUTER JOIN 을 기준으로 양쪽에 써줍니다.
🔨 교집합이 되는 각 테이블의 칼럼명을 ON이나 혹은 WHERE로 위와 같이 명시해 줍니다.

기준이되는 B테이블은 전부 유지가 되어있는 모습을 확인 할 수 있으며,
B테이블과 교집합이 되는 A테이블의 칼럼들이 생성되었다. 또한 교집합이 되지 않는 칼럼들도 NULL값으로 표시되어 나타나있다.


🔹 3. FULL OUTER JOIN

FULL OUTER JOIN은 왼쪽과 오른쪽 테이블의 모든 데이터를 읽어 결과를 생성한다.
RIGHT OUTER JOIN과 LEFT OUTER JOIN의 결과를 합한 결과라고 보면된다.

SELECT *FROM A FULL OUTER JOIN B ON A.학번 = B.학번

🔨 조인하려는 테이블 명을 FULL OUTER JOIN 을 기준으로 양쪽에 써줍니다.
🔨 교집합이 되는 각 테이블의 칼럼명을 ON이나 혹은 WHERE로 위와 같이 명시해 줍니다.

A테이블과 B테이블 모두 유지가 되며, 교집합이 되지 않는 부분들은 NULL값으로 표시되어 나타나있는 것을 확인 할 수 있다.


🚨 OUTER JOIN은 테이블의 모든 영역을 가지고 오기때문에 쿼리의 성능에 있어서도 많은 영향을 끼칠수있다 ㅠ 그래서 주의해서쓰자 !

참조 : https://bramhyun.tistory.com/39

profile
🍒의 공부공간

0개의 댓글