MySQL에서 테이블끼리 연결할 때 쓰는 JOIN 종류, 언제 어떤 것을 쓰면 좋은지, JOIN과 UNION의 차이를 정리한 내용이다. 쿼리 작성 시 헷갈리기 쉬운 부분만 골라 기술하였다.
1. JOIN과 UNION이란
JOIN은 가로로 테이블을 붙이는 것이다. 조건에 맞는 컬럼을 기준으로 옆으로 이어 붙여 한 행에 여러 테이블의 컬럼이 나오게 한다.
UNION은 세로로 결과를 쌓는 것이다. SELECT 결과의 컬럼 개수·타입이 같을 때 위아래로 이어 붙여, 한 테이블에서 여러 번 조회한 결과를 합친 것처럼 보이게 한다.
가로로 붙임"] B["UNION
세로로 쌓음"] C["한 행에
여러 테이블 컬럼"] D["여러 SELECT 결과를
행으로 이어 붙임"] A --> C B --> D
2. JOIN 종류와 사용 시점
INNER JOIN
양쪽 테이블 모두에 조건에 맞는 값이 있을 때만 행이 나온다. 한쪽에만 있어도 그 행은 결과에서 제외된다.
SELECT a.id, a.name, b.order_no
FROM users a
INNER JOIN orders b ON a.id = b.user_id;
쓰기 좋을 때 — "주문이 있는 회원만 보고 싶다", "두 테이블 모두 매칭되는 것만 필요할 때". 기본적으로 가장 많이 쓰는 JOIN이다.
LEFT JOIN (LEFT OUTER JOIN)
왼쪽 테이블은 전부 나오고, 오른쪽은 조건에 맞으면 붙고 없으면 NULL이다.
SELECT a.id, a.name, b.order_no
FROM users a
LEFT JOIN orders b ON a.id = b.user_id;
쓰기 좋을 때 — "전체 회원은 다 보고, 주문이 있으면 주문 번호도 같이 보고 싶을 때". "몇 명이 주문을 안 했는지" 같은 통계·누락 확인할 때도 적합하다.
RIGHT JOIN (RIGHT OUTER JOIN)
LEFT와 반대이다. 오른쪽 테이블은 전부 나오고, 왼쪽은 매칭되면 붙고 안 되면 NULL이다. 실무에서는 LEFT만 써도 되므로(테이블 순서만 바꾸면 됨) RIGHT는 잘 쓰지 않는 편이다.
FULL OUTER JOIN
양쪽 모두 전부 나오고, 매칭되는 것은 붙이고 없으면 NULL이다. MySQL은 FULL OUTER JOIN 문법을 지원하지 않는다. 필요하면 LEFT 결과와 RIGHT 결과를 UNION으로 합치는 방식으로 우회한다.
CROSS JOIN
조건 없이 모든 행끼리 조합한다. 왼쪽 N행 × 오른쪽 M행 = N×M행이 나온다. 카테시안 곱이다.
SELECT a.name, b.code FROM users a CROSS JOIN codes b;
쓰기 좋을 때 — "모든 조합"이 필요할 때만 사용한다. 데이터가 많으면 행 수가 폭증하므로 신중하게 써야 한다.
3. JOIN vs UNION 한눈에
| 구분 | JOIN | UNION |
|---|---|---|
| 방향 | 가로 (컬럼 추가) | 세로 (행 추가) |
| 조건 | ON으로 테이블 간 관계 지정 | 각 SELECT 컬럼 개수·타입만 맞으면 됨 |
| 용도 | 여러 테이블 컬럼을 한 행에 합치기 | 여러 조회 결과를 하나의 결과셋으로 합치기 |
JOIN은 "users와 orders를 user_id 기준으로 붙여 한 줄에 회원명·주문번호를 보자"에 가깝고, UNION은 "2024년 주문 목록과 2025년 주문 목록을 위아래로 이어 한 번에 보자"에 가깝다.
4. UNION 사용 예시
UNION은 컬럼 개수·순서·타입이 같아야 한다. 기본적으로 중복 행은 제거하고, 전부 보려면 UNION ALL을 쓴다.
-- 연도별 주문을 하나의 목록으로
SELECT id, user_id, order_no, '2024' AS year FROM orders_2024
UNION ALL
SELECT id, user_id, order_no, '2025' AS year FROM orders_2025
ORDER BY id;
중복을 제거하려면 UNION만 쓰면 된다. 정렬은 맨 마지막 SELECT 뒤에 ORDER BY를 한 번만 붙이면 된다.
5. 정리
JOIN — 테이블을 가로로 이어 한 행에 여러 테이블 컬럼이 나오게 한다. INNER는 매칭된 것만, LEFT는 왼쪽 전부+오른쪽 매칭, CROSS는 모든 조합이다. UNION — SELECT 결과를 세로로 쌓을 때 사용한다. 컬럼 개수·타입만 맞추면 되며, JOIN과 용도가 다르다. 한 행을 넓히려면 JOIN, 결과 행을 쌓으려면 UNION으로 기억하면 된다.
한 줄 요약
JOIN은 가로(테이블 컬럼 합치기): INNER=매칭만, LEFT=왼쪽 전부+매칭, CROSS=전조합. UNION은 세로(여러 SELECT 결과 쌓기), 컬럼 수·타입만 맞추면 됨. 한 행을 넓히려면 JOIN, 결과를 쌓으려면 UNION.
댓글 0