Learning
레슨 3 / 8·20분

JOIN

JOIN으로 테이블 연결하기

JOIN은 두 개 이상의 테이블을 관련된 열을 기준으로 연결합니다. 가장 많이 사용되는 것은 INNER JOIN이며, 양쪽 테이블 모두에 일치하는 데이터만 반환합니다.

sql
-- 예제 테이블:
-- employees: id, name, department_id
-- departments: id, dept_name, location

-- INNER JOIN — 양쪽 모두 일치하는 행만
SELECT e.name, d.dept_name, d.location
FROM employees e
INNER JOIN departments d
  ON e.department_id = d.id;

-- LEFT JOIN — 왼쪽 테이블 전체 + 오른쪽 일치 행
-- 부서가 없는 직원도 포함
SELECT e.name, d.dept_name
FROM employees e
LEFT JOIN departments d
  ON e.department_id = d.id;

JOIN 종류 비교

  • INNER JOIN — 양쪽 모두 일치하는 행만 반환
  • LEFT JOIN — 왼쪽 전체 + 오른쪽 일치 (없으면 NULL)
  • RIGHT JOIN — 오른쪽 전체 + 왼쪽 일치 (없으면 NULL)
  • FULL OUTER JOIN — 양쪽 전체, 일치 없으면 NULL
  • CROSS JOIN — 두 테이블의 모든 조합 (카르테시안 곱)
sql
-- 여러 테이블 JOIN
-- employees, departments, projects 세 테이블 연결
SELECT e.name AS 직원,
       d.dept_name AS 부서,
       p.project_name AS 프로젝트
FROM employees e
INNER JOIN departments d ON e.department_id = d.id
INNER JOIN project_members pm ON e.id = pm.employee_id
INNER JOIN projects p ON pm.project_id = p.id
WHERE p.status = '진행중'
ORDER BY d.dept_name, e.name;

-- 셀프 JOIN — 같은 테이블을 두 번 참조
-- 직원과 그 매니저 이름 조회
SELECT e.name AS 직원,
       m.name AS 매니저
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;
sql
-- 서브쿼리와 함께 사용
SELECT e.name, e.salary
FROM employees e
WHERE e.salary > (
    SELECT AVG(salary) FROM employees
)
ORDER BY e.salary DESC;

-- 서브쿼리 대신 JOIN 활용
SELECT e.name, e.salary, d.avg_salary
FROM employees e
INNER JOIN (
    SELECT department_id,
           AVG(salary) AS avg_salary
    FROM employees
    GROUP BY department_id
) d ON e.department_id = d.department_id
WHERE e.salary > d.avg_salary;
💡

테이블에 별칭(alias)을 붙이면 쿼리가 훨씬 간결해집니다. FROM employees e처럼 짧은 이름을 사용하세요. JOIN 시 어느 테이블의 열인지 명확히 하기 위해 e.name처럼 접두어를 붙이는 것이 좋습니다.