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
Tags
more
Archives
Today
Total
관리 메뉴

개발 블로그

[데이터베이스]JOIN 본문

전공 공부/데이터베이스

[데이터베이스]JOIN

토산인 2022. 12. 10. 15:33

JOIN이란?

두 개 이상의 테이블의 정보를 결합해 원하는 데이터를 만들 수 있도록 돕는 메커니즘이다. 

JOIN을 사용하는 이유는 두 개 이상의 테이블을 결합해 유의미한 정보로 만들어내는 것이 목표이다.

 

예시로 게시글 테이블만으로는 게시글 작성자의 정보는 알 수 없다. 게시글 테이블과 작성자 테이블을 결합하면 더 쉽게 게시글의 정보와 회원 정보를 확인할 수 있다.

 

MEMBER 테이블
BOARD 테이블

두 개의 테이블이 있다. 만약 게시글과 게시글을 작성한 회원 정보를 알고 싶다면

SELECT BO_ID, BO_TITLE, BO_CONTENT, BO_M_ID, M_ID, M_MEMBER_ID, M_NAME
FROM BOARD INNER JOIN MEMBER
ON BO_M_ID = M_ID;

 

 

JOIN의 유형

두 개 이상의 테이블을 조인하는 여러가지 방법이 있는데, 어느 테이블을 기준으로 할 것인지에 따라 달라진다.

A 테이블
B 테이블

 

두 개의 테이블에서, A 테이블의 A_B_ID는 B_ID를 참조하고 있다. 

 

1. INNER JOIN

 

A와 B 테이블을 결합할 때 A_B_ID와 B_ID를 기준으로 행을 가져오는데 이때 교집합 부분만 가져오는 것을 INNER JOIN이라고 한다. A_B_ID가 NULL이 아닌 행들을 가져오고, A_B_ID와 동일한 B_ID 행을 가져온다. 

 

SELECT * FROM A INNER JOIN B ON A_B_ID = B_ID;

 

2. LEFT OUTER JOIN

A와 B 테이블을 결합할 때 A의 행은 다 가져오고 A_B_ID와 B_ID를 기준으로 교집합 부분만 가져오는 것을 LEFT OUTER JOIN이라고 한다. A의 모든 행들을 가져오고 A_B_ID와 B_ID가 동일한 B의 행을 가져온다. (빈 공간은 NULL로 채운다)

 

SELECT * FROM A LEFT OUTER JOIN B ON A_B_ID = B_ID;

 

3. RIGHT OUTER JOIN

위와 동일하지만 이번엔 기준이 B 테이블이다.

 

SELECT * FROM A RIGHT OUTER JOIN B ON A_B_ID = B_ID;

 

*LEFT OUTER JOIN과 RIGHT OUTER JOIN의 결과는 A와 B의 위치를 서로 바꾸면 동일하다. 

 

 

4. FULL OUTER JOIN

A, B 두 테이블을 결합할 때 A와 B에 해당하는 모든 행을 가져오고, A_B_ID와 B_ID가 동일한 행을 결합한다. 

 

SELECT * FROM A FULL OUTER JOIN B ON A_B_ID = B_ID;

 

5. A-B (또는 B-A)

A 차집합 B이며, A 테이블 기준 B와 결합되지 않은 모든 행들을 가져온다. 즉 A 테이블 기준 B 테이블을 참조하지 않은 행들이다. 

 

SELECT * FROM A LEFT OUTER JOIN B ON A_B_ID = B_ID;
WHERE B_ID IS NULL;

 

 

 

INNER JOIN과 LEFT OUTER JOIN만 정확히 알아도 문제 없다!

 

 

별칭과 조인

' . ' : 칼럼 앞에 . 연산자와 테이블 이름을 명시하면, 두 테이블에서 칼럼의 이름이 동일해도 구분할 수 있다. 

 

SELECT STUDENT.NAME AS STUDENT, TEACHER.NAME AS TEACHER
FROM STUDENT INNER JOIN TEACHER
ON TEACHER.TEACHER_ID = STUDENT.TEACHER_ID;

이것은 STUDENT 테이블과 TEACHER 테이블에 있는 동일한 이름의 NAME 칼럼을 AS로 다른 이름으로 지정하고, TEACHER_ID가 동일한 행들을 가져왔다.