데이터 처리/SQL

[MySQL] JOIN

yourhm 2022. 8. 28. 20:23

1. JOIN

SQL에서 JOIN은 2개 이상의 테이블을 서로 연결하여 관련된 데이터를 검색할 때 사용하는 매우 중요한 기능이다. 

 

- 근데 왜 중요할까?

JOIN은 실무에서 정말 많이 사용하니까. 

 

- 그럼 JOIN을 왜 많이 사용하게 되는 걸까?

데이터베이스 설계 시 정규화(Normalization)를 통해 중복을 줄이고 데이터의 일관성을 유지하는데 그 결과, 관련된 정보가 여러 테이블에 분산되어 저장되게 된다. 근데 실무에서는 정보를 종합적으로 봐야할 일이 많기 때문에 두 테이블을 JOIN해서 결합해야 원하는 정보를 알 수 있게 된다. 즉, 관계형 데이터베이스에서 분리된 데이터를 의미 있게 연결하는 유일한 수단이기 때문에 매우 중요하다.

 

나도 실제로 실무에서 JOIN을 정말 많이 사용한다는 것을 느꼈다. 그래서 내가 원하는 정보를 찾기 위해 JOIN을 어떤 방식으로 다양하게 쓸 수 있는지, 어떻게 하면 효율적으로 사용할 수 있는지 고민하게 된다. JOIN을 똑똑하게 사용하기 위해 공부해보자.

 

 

2. JOIN의 종류

 

[참고] SQL JOIN Visualizer

👉 https://sql-joins.leopard.in.ua/

 

(1) INNER JOIN
두 테이블에 공통으로 존재하여 매칭되는 값만 한 행으로 합쳐서 반환한다. (매칭되지 않는 모든 값은 제외)

→ 정확한 매칭이 필요한 경우 주로 사용

 

(2)  LEFT JOIN (또는 LEFT OUTER JOIN)
- 왼쪽 테이블은 모든 행을 반환하고, 오른쪽 테이블은 왼쪽 테이블을 기준으로 매칭되는 값만 반환한다.

- 매칭되는 값이 있으면 한 행으로 합치고 오른쪽 테이블에 매칭되지 않는 값이 있다면 NULL로 채운다.

→ 기준 테이블이 있고, 보조 정보를 가져올 때 주로 사용

 

(3) RIGHT JOIN (또는 RIGHT OUTER JOIN)
- 오른쪽 테이블은 모든 행을 반환하고, 왼쪽 테이블은 오른쪽 테이블을 기준으로 매칭되는 값만 반환한다.

- 매칭되는 값이 있으면 한 행으로 합치고 왼쪽 테이블에 매칭되지 않는 값이 있다면 NULL로 채운다.

→ LEFT JOIN 반대 (거의 사용 안 함)

 

(4) FULL JOIN (또는 FULL OUTER JOIN)
- 양쪽 테이블의 모든 행을 반환한다.

- 매칭되는 값이 있으면 한 행으로 합치고, 매칭되지 않는 값이 있는 쪽은 NULL로 채운다.

→ 양쪽 다 비교하거나 결측 포함하고 싶을 때 주로 사용


(5) CROSS JOIN

모든 가능한 조합을 생성 (곱집합 = 카테시안 곱)

→ 경우의 수 계산으로 전수 조합이 필요할 때나 실험 설계 등 특수 목적

 

 

주의할 점
- 조인 조건(ON)을 빠뜨리면 전혀 다른 결과가 나올 수 있다. 예를 들어 조건 없는 조인은 CROSS JOIN → 폭발적 행 수 증가

SELECT * FROM users u, orders o;
-- CROSS JOIN 효과 → n * m 건 생김


- 조인이 많아질수록 성능에 영향을 줄 수 있으니 인덱스 사용 등을 고려해야 한다.

 

 

3. JOIN별 설명

FULL OUTER JOIN

: 매칭되는 값이 있으면 한 행으로 합치고, 한쪽만 존재하여 매칭되지 않으면 나머지 한쪽은 NULL 채움

 

만약 두 테이블 모두 NULL이 포함되는 경우, NULL과 NULL은 매칭되는 것으로 봐야 하나? 정답: X

왜냐하면 SQL에서 NULL은 “unknown”을 의미하기 때문에 두 NULL을 비교하여 같은지 틀린지를 판단할 수 없다. 따라서 NULL = NULL은 unknown 즉, 비교 불가이기 때문에 → 두 테이블에 똑같이 NULL이 존재하더라도 매칭되지 않는다.

 

▼ 빅쿼리에서 직접 테스트 해보기

-- A 테이블 생성 (임시)
WITH A AS (
  SELECT 'A' AS name UNION ALL
  SELECT 'B' UNION ALL
  SELECT 'C' UNION ALL
  SELECT NULL UNION ALL
  SELECT NULL
),

-- B 테이블 생성 (임시)
B AS (
  SELECT 'B' AS name UNION ALL
  SELECT 'C' UNION ALL
  SELECT 'E' UNION ALL
  SELECT NULL
)

-- FULL OUTER JOIN 실행
SELECT A.name AS A_name
     , B.name AS B_name
FROM A
FULL OUTER JOIN B ON A.name = B.name
ORDER BY A_name NULLS LAST, B_name NULLS LAST

 

<상황>

A 테이블에는 NULL 2개

B 테이블에는 NULL 1개

 

- 만약 NULL끼리 매칭되었다면 -> 결과 행에 (NULL, NULL)인 행이 2개만 존재해야 함.

- 근데 NULL끼리 매칭되지 않으므로, 각 테이블의 NULL은 상대 테이블의 NULL과 합쳐지지 않고 각각 독립 행으로 남아 -> 결과 행에 (NULL, NULL)인 행이 총 3개 존재함.

 

A_name B_name
null ( A 테이블에만 존재하는 NULL )
-> B 테이블에 매칭 값 없으므로 B_name이 null로 채워짐  
null 
null ( A 테이블에만 존재하는 NULL )
-> B 테이블에 매칭 값 없으므로 B_name이 null로 채워짐  
null 
null null ( B 테이블에만 존재하는 NULL )
-> A 테이블에 매칭 값 없으므로 A_name이 null로 채워짐  



 

 

4. 특별한 조인

참고 1. 셀프 조인

나의 테이블을 가지고 마치 다른 테이블인 것처럼 JOIN하는 것도 가능 -> 셀프 조인

  

 

 

참고 2. 테이블 3개 이상 연결하는 경우

일반적으로 테이블 2개을 연결하기 위해 조인한다. 근데 만약 3개의 테이블을 연결하기 위해서는 어떻게 해야할까? 두번의 조인이 필요하다.

 

👉 JOIN(JOIN(table 1, table 2), table 3)

 

이해하기 쉽게 내 마음대로 위와 같이 적어봤다. 첫번째 JOIN된 결과를 또 다른 테이블과 다시 JOIN하는 것이다. 이처럼 SQL에서는 JOIN을 순차적으로 연결하기 때문에 논리적으로는 두 테이블씩 JOIN하는 연쇄 작업이라고 생각하면 된다. 꼭 순서를 지켜야 논리적으로 올바른 결과가 나올 수 있고, ON 조건이 정확해야 한다. 

 

 

 

https://blog.bytebytego.com/p/ep90-how-do-sql-joins-work

 

EP90: How do SQL Joins Work?

This week’ system design refresher: How Does Linux Boot Process Work? (Youtube video) How do SQL Joins Work? What are the differences between cookies and sessions? How do DevOps, NoOps change the software development lifecycle (SDLC)? Get paid to build f

blog.bytebytego.com

https://towardsdatascience.com/take-your-sql-from-good-to-great-part-3-687d797d1ede

 

Take your SQL from Good to Great: Part 3

Time to join the JOIN movement.

towardsdatascience.com

https://schatz37.tistory.com/2

 

[SQL] 성능 관점에서 보는 결합(Join)

0. 들어가며 결합(Join) 은 SQL 사용하게 되면 반드시 활용하는 기능입니다. Inner Join, Outer Join 등 다양한 결합 방법이 존재하고 우리는 이를 활용해서 DB에 있는 여러 테이블을 활용할 수 있습니다.

schatz37.tistory.com