본문 바로가기
SQLD

[SQLD] JOIN의 개념과 종류

by DUSTIN KANG 2024. 3. 1.

JOIN

JOIN은 두 개 이상의 테이블을 연결 혹은 결합하여 데이터를 출력하는 것이다.

  • 일반적으로 PK와 FK의 연관에 의해 성립된다. 없어도 논리적인 값들의 연관으로 성립이 가능하다.
  • 대표적인 조인의 종류로 내부조인, 외부조인, ANSI조인이 있다.
  • ORM에서 FK키를 참조할 때 발생하는 SQL문이다.
Oracle 문법에서는 `JOIN`이라는 명령어를 사용하지 않고 WHERE 조건절에서 JOIN을 지정한다.
반면, ANSI 표준 문법은 다른 SQL 프로그램에서도 공통적으로 사용 가능한 문법으로 JOIN 명령어를 사용 가능하다.

내부 조인(INNER)

EQUI JOIN(=)

2개의 테이블 간 컬럼이 정확하게 일치하는 경우 사용하는 JOIN이다.

SELECT A.USER_NAME, B.DEPT_ID, B.DEPT_NAME
FROM USER A, DEPT B
WHERE A.DEPT_ID = B.DEPT_ID;

ANSI 문법으로 명시적 표현

SELECT A.USER_NAME, B.DEPT_ID, B.DEPT_NAME
FROM USER A JOIN DEPT B ON A.DEPT_ID = B.DEPT_ID;

NON-EQUI JOIN

값을 비교하는 연산자를 이용해 두 테이블을 연결하는 JOIN이다. 반드시 투 컬럼의 값이 일치하지 않더라도 JOIN을 할 수 있는 경우이다.

`BETWEEN` 말고도 `<>=`등 연산자를 사용해도 된다.

SELECT A.USER_NAME, B.GRADES
FROM USER A, GRADE B
WHERE A.SCORE BETWEEN B.MINSCORE AND B.MAXSCORE;

ANSI 문법으로 명시적 표현

SELECT A.USER_NAME, B.GRADES
FROM USER A JOIN GRADE B ON A.SCORE BETWEEN B.MINSCORE AND B.MAXSCORE

SELF JOIN

한 테이블 내에 두 컬럼이 연관 관계가 있을 때, 동일한 테이블에서 조인하는 것을 말한다.

SELECT A.name, B.name
FROM USER A, USER B
WHERE A.no = B.id;

 


외부 조인(OUTER)

LEFT JOIN, RIGHT JOIN

같은 값이 없는 경우에도 기준이 되는 테이블의 모든 레코드를 출력하는 JOIN이다.

예를 들어, LEFT 기준이라면 RIGHT의 값에는 값이 없더라도 LEFT의 모든 레코드를 출력하는 것이다.

SELECT A.USER_ID, A.USER_NAME, B.DEPT_ID, B.DEPT_NAME 
FROM USER A, DEPT B
WHERE A.DEPT_ID = B.DEPT_ID(+);

 

해당 JOIN은 `USER` 테이블에 대한 LEFT JOIN이다. 그러므로 다음과 같이 출력될 수 있다.

SELECT A.USER_ID, A.USER_NAME, B.DEPT_ID, B.DEPT_NAME 
FROM USER A LEFT JOIN DEPT B ON A.DEPT_ID = B.DEPT_ID;

 

FULL JOIN

모든 데이터를 읽어 JOIN하고 중복데이터는 삭제하는 방식이다.

MYSQL에서는 명시적인 SQL 문법을 지원하지 않기 때문에 `UNION` 명령어를 사용해 완전 외부 조인을 수행할 수 있다.

SELECT A.USER_ID, A.USER_NAME, B.DEPT_ID, B.DEPT_NAME 
FROM USER A LEFT JOIN DEPT B ON A.DEPT_ID = B.DEPT_ID
UNION
SELECT A.USER_ID, A.USER_NAME, B.DEPT_ID, B.DEPT_NAME 
FROM USER A RIGHT JOIN DEPT B ON A.DEPT_ID = B.DEPT_ID;

 

해당 JOIN은 `USER` 테이블에 대한 LEFT JOIN이다. 그러므로 다음과 같이 출력될 수 있다.

SELECT A.USER_ID, A.USER_NAME, B.DEPT_ID, B.DEPT_NAME 
FROM USER A FULL JOIN DEPT B ON A.DEPT_ID = B.DEPT_ID;

 

 

집합 연산자
집합 연산자는 두개 이상의 테이블에서 조인을 사용하지 않고 연관된 데이터를 조회할 때 사용한다.
• UNION : 합집합, 중복행은 1개로 정렬
• UNION ALL : 합집합, 중복행도 표시
• INTERSECT : 교집합, 중복행은 1개로
• EXCEPT : A에 대해 B를 차(-)한 집합 중복행 은 1개로(A-B),  Oracle은 MINUS를 사용한다.
• CROSS JOIN : 곱집합(Product)

CROSS JOIN

두 테이블에 대해 카타시안 곱을 수행한 JOIN이다.

두 테이블의 행의 모든 조합을 반환한다고 생각하면 된다.

  • 레코드의 수 : 테이블 A의 레코드 X 테이블 B의 레코드
SELECT *
FROM STUDENT, BELONGING;


JOIN 알고리즘

Nested Loop Join

선행 테이블의 처리 범위를 하나씩 접근하면서 추출된 값으로 연결할 테이블을 조인하는 방식을 말한다.

다음 SQL 질의문을 보자.

먼저, 학과(DEPT)의 아이디 중 2라는 데이터를 찾아 추출하고 추출한 2를 바탕으로 `USER` 테이블을 조인하는 것으로 이해할 수 있다.

SELECT *
FROM USER A JOIN DEPT B ON A.DEPT_ID = B.DEPT_ID
WHERE B.DEPT_ID LIKE '2'

Sort Merge Join

양쪽 테이블의 처리범위를 각자 접근한 다음, 정렬 결과를 차례대로 SCAN하면서 조건으로 Merge하는 방식을 말한다.

SELECT *
FROM USER A JOIN DEPT B ON A.DEPT_ID = B.DEPT_ID
WHERE B.DEPT_ID =2 AND A.SCORE > 60

Hash Join

해시 조인은 해시 값을 이용해 테이블을 조인하는 방식이다. 

 


오늘도 저의 포스트를 읽어주셔서 감사합니다. ☕️

설명이 부족하거나 이해하기 어렵거나 잘못된 부분이 있으면 부담없이 댓글로 남겨주시면 감사하겠습니다.

'SQLD' 카테고리의 다른 글

[SQLD] 인덱스  (0) 2024.03.11
[SQLD] 정규화의 필요성  (0) 2024.03.02
[SQL] 터미널로 MySQL, PostgreSQL 설치하기 (MacOS)  (0) 2024.02.27
[SQLD] 윈도우 함수  (0) 2024.01.27
[SQL/DB]NoSQL과 SQL는 무슨 차이가 있는 걸까?  (0) 2024.01.08