[MySQL] JOIN 사용법과 예제

Serin Yoon·2021년 1월 15일
3

Database

목록 보기
1/2
post-thumbnail

1월부터 서버를 공부하고 있다. Datagrip과 같은 데이터베이스 IDE에서 테이블을 생성하는 작업을 할 수 있도록 명령어를 텍스트 파일로 내보낼 수 있는 사이트 AqueryTool(https://aquerytool.com/)에서 ERD(개체-관계 모델)를 생성하고, 명령어를 텍스트 파일로 내보낸 후 Datagrip에 가져와 query를 작성하고 있다.

query를 작성할 때 선배가 조언한 내용 중 하나는 가능한 데이터를 한 번에 SELECT 해와야 한다는 것이다. 데이터를 한 번에 SELECT 해와야 하는 이유는 하나하나 따로 가져오면 그만큼 서버 측에서, 그리고 클라이언트 측에서 처리해야 하는 횟수가 늘기 때문에 비효율적이기 때문이다. 그래서 데이터를 한 번에 가져오도록 돕는 JOIN의 사용법과 예제를 작성해보도록 하겠다.

위 사진을 보면 LEFT JOIN, LEFT JOIN(& IS NULL), RIGHT JOIN, RIGHT JOIN(& IS NULL), INNER JOIN, FULL OUTER JOIN으로 구성되어 있는 것을 확인할 수 있다. LEFT JOIN의 원리를 알면 RIGHT JOIN의 원리도 이해할 수 있으므로 RIGHT JOIN에 대한 설명은 생략하겠다. 예제를 보면 key1과 key2가 있는데, 두 key는 동일해도 되고, 달라도 된다. (필요에 따라 설정하면 된다.)

1. LEFT JOIN

A, B 두 테이블 중에 A의 값 전체와, A의 해당 key 값과 B의 해당 key 값이 같은 경우 그 값을 SELECT 해온다.

SELECT <id> FROM <A> LEFT JOIN <B> ON <A.key> = <B.key>

2. LEFT JOIN & IS NULL

A, B 두 테이블 중에 A의 값을 SELECT 해오는데, 그중 A의 해당 key 값과 B의 해당 key 값이 같지 않은 경우에만 SELECT 해온다.

SELECT <id> FROM <A> LEFT JOIN <B> ON <A.key> = <B.key> WHERE <B.key> IS NULL

3. INNER JOIN

A의 해당 key 값과 B의 해당 key 값이 같은 경우 그 값을 SELECT 해온다.

SELECT <key1> FROM <A> INNER JOIN <B> ON <A.key2> = <B.key2>

4. FULL OUTER JOIN

A, B 두 테이블의 값 전체를 SELECT 해온다. 참고로 MySQL에는 FULL OUTER JOIN 사용이 불가하다. LEFT JOIN과 RIGHT JOIN을 사용하는 것으로 대체할 수 있다. (FULL OUTER JOIN과 무관한 내용이지만, JOIN을 여러 번 사용할 수 있으므로 2개뿐 아니라 3개 이상의 테이블을 엮는 것 역시 가능하다.)

SELECT <key1> FROM <A> FULL OUTER JOIN <B> ON <A.key2> = <B.key2>

MySQL의 경우,
SELECT <key1> FROM <A> LEFT JOIN <B> ON <A.key2> = <B.key2> UNION SELECT <key1> FROM <A> RIGHT JOIN <B> ON <A.key2> = <B.key2>

5. FULL OUTER JOIN & IS NULL

A, B 두 테이블 값을 SELECT 해오는데, 그중 A의 해당 key 값과 B의 해당 key 값이 같지 않은 경우에만 SELECT 해온다.

SELECT <id> FROM <A> FULL OUTER JOIN <B> ON <A.key> = <B.key> WHERE <A.key> IS NULL OR <B.key> IS NULL

MySQL의 경우,
SELECT <key1> FROM <A> LEFT JOIN <B> ON <A.key2> = <B.key2> WHERE <A.key> IS NULL OR <B.key> IS NULL UNION SELECT <key1> FROM <A> RIGHT JOIN <B> ON <A.key2> = <B.key2> WHERE <A.key> IS NULL OR <B.key> IS NULL

profile
티스토리로 이사했습니다 🏠

0개의 댓글