한양과학기술고등학교

에듀테크 프로젝트 대시보드

조인 (JOIN)

INNER LEFT USING self join LATERAL

여러 테이블의 행을 조건으로 연결합니다. 대부분 INNER 와 LEFT 로 해결됩니다.

1. 종류

조인결과
INNER JOIN양쪽 다 매칭되는 행만
LEFT JOIN왼쪽 전부 + 매칭되는 오른쪽 (없으면 NULL)
RIGHT JOINLEFT 의 반대 (잘 안 씀)
FULL JOIN양쪽 모두 + 매칭 안 되면 NULL
CROSS JOIN곱집합 (모든 조합)

2. 기본형

SELECT s.name, c.room
FROM students s
JOIN classes c ON c.id = s.class_id;         -- INNER

SELECT s.name, e.score
FROM students s
LEFT JOIN exams e ON e.student_id = s.id     -- 시험 안 본 학생도 포함
                 AND e.exam_date = '2026-09-01';   -- ON 에 추가 조건
흔한 실수
  • LEFT JOIN 후 WHERE 오른쪽테이블.col = ... 를 쓰면 매칭 안 된 행이 걸러져 사실상 INNER 가 됨 → 그 조건은 ON 절로

3. self join · USING

-- 같은 테이블 두 번 (직원-상사)
SELECT e.name AS emp, m.name AS manager
FROM employees e
LEFT JOIN employees m ON m.id = e.manager_id;

-- 양쪽 컬럼명이 같으면 USING (결과에 컬럼 1개만)
SELECT * FROM orders JOIN customers USING (customer_id);

4. LATERAL — 행마다 서브쿼리

-- 각 학생의 최근 시험 3건
SELECT s.name, e.exam_date, e.score
FROM students s
LEFT JOIN LATERAL (
    SELECT exam_date, score FROM exams
    WHERE student_id = s.id
    ORDER BY exam_date DESC LIMIT 3
) e ON true;

LATERAL 서브쿼리는 FROM 의 앞 테이블 컬럼(s.id)을 참조할 수 있습니다. 'top-N per group' 의 정석.

"timestamptz 를 써라. 거의 항상."