언어/MySQL

[MySQL] JOIN, LEFT JOIN, RIGHT JOIN

icodesiuuuu 2025. 2. 21. 18:02

💡 JOIN, LEFT JOIN, RIGHT JOIN 개념

SQL에서 JOIN은 여러 개의 테이블을 조합하여 하나의 결과 집합을 만드는 데 사용됨
각 JOIN의 차이를 이해하려면, 기준 테이블(LEFT)과 조인할 테이블(RIGHT) 개념을 알아야 함

 

1. INNER JOIN (기본 JOIN)

두 테이블에서 일치하는 데이터만 가져옴
일치하지 않는 데이터는 결과에서 제외됨

SELECT A.컬럼명, B.컬럼명
FROM A
INNER JOIN B ON A.공통컬럼 = B.공통컬럼;

 INNER는 생략 가능 (JOIN = INNER JOIN)

 

예시

SELECT employees.name, departments.dept_name
FROM employees
JOIN departments ON employees.dept_id = departments.dept_id;
  • employees와 departments에서 dept_id가 일치하는 데이터만 가져옴
  • employees에 dept_id가 있지만 departments에 없으면 해당 직원은 출력되지 않음

 

 

2. LEFT JOIN (또는 LEFT OUTER JOIN)

왼쪽(기준) 테이블의 모든 데이터 + 오른쪽 테이블에서 일치하는 데이터 포함
오른쪽 테이블에 매칭되는 값이 없으면 NULL을 반환함

SELECT A.컬럼명, B.컬럼명
FROM A
LEFT JOIN B ON A.공통컬럼 = B.공통컬럼;

LEFT OUTER JOIN = LEFT JOIN (일반적으로 OUTER는 생략)

 

예시

SELECT employees.name, departments.dept_name
FROM employees
LEFT JOIN departments ON employees.dept_id = departments.dept_id;
  • employees 테이블의 모든 직원을 가져오고, departments 테이블에서 일치하는 부서 정보가 있으면 추가
  • departments에 해당 dept_id가 없으면 NULL 반환
name dept_name
Alice HR
Bob Marketing
Charlie NULL

Charlie는 부서 정보가 없지만, employees 기준이므로 출력됨! (NULL 값 포함)

 

 

 

3. RIGHT JOIN (또는 RIGHT OUTER JOIN)

오른쪽(조인 대상) 테이블의 모든 데이터 + 왼쪽 테이블에서 일치하는 데이터 포함
왼쪽 테이블에 매칭되는 값이 없으면 NULL을 반환함.

SELECT A.컬럼명, B.컬럼명
FROM A
RIGHT JOIN B ON A.공통컬럼 = B.공통컬럼;

RIGHT OUTER JOIN = RIGHT JOIN (일반적으로 OUTER는 생략)

 

예시

SELECT employees.name, departments.dept_name
FROM employees
RIGHT JOIN departments ON employees.dept_id = departments.dept_id;
  • departments 테이블의 모든 부서를 가져오고, employees 테이블에서 일치하는 직원이 있으면 추가
  • employees에 해당 dept_id가 없으면 NULL 반환
name dept_name
Alice HR
Bob Marketing
NULL IT

✔ IT 부서는 존재하지만, 직원이 없어서 name이 NULL로 출력됨!

 

 

JOIN 종류 비교 정리

JOIN 종류 일치하는 데이터만 왼쪽(기준) 테이블 전체 오른쪽(조인) 테이블 전체
INNER JOIN ✅ 포함 ❌ 제외 ❌ 제외
LEFT JOIN ✅ 포함 ✅ 포함 ❌ 제외
RIGHT JOIN ✅ 포함 ❌ 제외 ✅ 포함

 

  • INNER JOIN → 일치하는 데이터만 가져옴.
  • LEFT JOIN → 왼쪽 테이블(기준)의 모든 데이터 + 오른쪽에서 일치하는 데이터
  • RIGHT JOIN → 오른쪽 테이블(조인 대상)의 모든 데이터 + 왼쪽에서 일치하는 데이터

 

 

💡 왜 LEFT JOIN과 RIGHT JOIN 둘 다 존재할까?

1. 기준이 되는 테이블이 중요할 때

  • 우리가 항상 왼쪽 테이블을 기준으로 쿼리를 짜는 건 아님
  • 예를 들어, 데이터를 가져올 때 주 테이블이 무엇인지에 따라 LEFT JOIN 또는 RIGHT JOIN을 사용하게 됨

직원 정보 + 부서 정보 (employees 기준, LEFT JOIN)

SELECT employees.name, departments.dept_name
FROM employees
LEFT JOIN departments ON employees.dept_id = departments.dept_id;

 

직원은 반드시 가져오고, 부서 정보가 없으면 NULL

 

 

부서 정보 + 직원 정보 (departments 기준, RIGHT JOIN)

SELECT employees.name, departments.dept_name
FROM employees
RIGHT JOIN departments ON employees.dept_id = departments.dept_id;

부서는 반드시 가져오고, 해당 부서에 직원이 없으면 NULL

 

 

2. 테이블의 크기와 성능 이슈

  • 만약 조인하는 테이블이 매우 클 경우, 어떤 테이블을 왼쪽에 두느냐에 따라 쿼리 성능이 달라질 수 있음
  • LEFT JOIN을 쓰면 왼쪽 테이블의 모든 데이터를 가져오고, RIGHT JOIN을 쓰면 오른쪽 테이블의 모든 데이터를 가져옴
  • RIGHT JOIN이 필요할 때도 있지만, 대부분의 경우 LEFT JOIN을 선호하는 이유는 성능 때문

 

3. 실제로는 LEFT JOIN이 더 많이 쓰인다!

  • RIGHT JOIN은 흔하게 사용되지 않음
  • 이유는 우리가 대부분 "기준 테이블"을 왼쪽에 두고 생각하기 때문
  • 만약 RIGHT JOIN이 필요하다면, 테이블 순서를 바꿔서 LEFT JOIN을 쓰는 게 더 일반적

 

결론

  • 기준이 되는 테이블을 왼쪽에 둘 수 있으면 LEFT JOIN을 사용하면 된다.
  • RIGHT JOIN이 필요하면, 테이블 순서를 바꾸고 LEFT JOIN을 쓰는 게 일반적.
  • 하지만 특정 경우에는 RIGHT JOIN이 더 자연스러울 수도 있다.
    (예: 부서 목록을 기준으로 직원 데이터를 가져올 때)
  • 실무에서는 LEFT JOIN을 훨씬 더 많이 사용한다!

'언어 > MySQL' 카테고리의 다른 글

[MySQL] case 구문  (0) 2025.01.25
[MySQL] concat 함수  (0) 2025.01.25