레슨 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처럼 접두어를 붙이는 것이 좋습니다.