SQL Join 치트시트
검색과 인쇄가 가능한 SQL join 참고자료입니다: inner, left, right, full, anti, semi join, self join, ON 대 WHERE, LATERAL까지. 무료입니다.
Basic join types
9SELECT * FROM a INNER JOIN b ON a.id = b.a_id;
SELECT * FROM a LEFT JOIN b ON a.id = b.a_id;
SELECT * FROM a RIGHT JOIN b ON a.id = b.a_id;
SELECT * FROM a FULL OUTER JOIN b ON a.id = b.a_id;
JOIN = INNER JOIN
LEFT OUTER JOIN = LEFT JOIN
LEFT JOIN ... UNION ... RIGHT JOIN ...
ON a.id = b.a_id AND a.type = b.type
ON a.qty BETWEEN p.min_qty AND p.max_qty
Anti-joins (no match)
8LEFT JOIN b ON a.id = b.a_id WHERE b.a_id IS NULL
WHERE NOT EXISTS (SELECT 1 FROM b WHERE b.a_id = a.id)
WHERE a.id NOT IN (SELECT a_id FROM b)
WHERE a.id NOT IN (SELECT a_id FROM b WHERE a_id IS NOT NULL)
RIGHT JOIN a ... WHERE a.id IS NULL
SELECT id FROM a EXCEPT SELECT a_id FROM b;
users without orders = LEFT JOIN + IS NULL
Prefer NOT EXISTS over NOT IN
Semi-joins (has a match)
8WHERE EXISTS (SELECT 1 FROM b WHERE b.a_id = a.id)
WHERE a.id IN (SELECT a_id FROM b)
JOIN b ... GROUP BY a.id
SELECT DISTINCT a.* FROM a JOIN b ON ...
EXISTS stops at the first match
EXISTS (SELECT 1 ...) vs (SELECT * ...)
IN: uncorrelated / EXISTS: correlated
users WITH orders = EXISTS subquery
Self joins
8FROM emp e JOIN emp m ON e.manager_id = m.id
FROM emp e LEFT JOIN emp m ON e.manager_id = m.id
SELECT e.name, m.name AS manager FROM ...
ON a.id < b.id
ON a.id <> b.id
ON b.day = a.day + INTERVAL 1 DAY
ON a.city = b.city AND a.id <> b.id
WITH RECURSIVE tree AS (... UNION ALL ...)
Cross & multi-table joins
8SELECT * FROM sizes CROSS JOIN colors;
FROM sizes, colors
FROM users u JOIN orders o ON ... JOIN items i ON ...
JOIN dates d CROSS JOIN users u LEFT JOIN ...
u LEFT JOIN o ON ... LEFT JOIN i ON i.o_id = o.id
u LEFT JOIN o ... INNER JOIN i ON i.o_id = o.id
FROM a JOIN (b LEFT JOIN c ON ...) ON ...
Written order is logical, not execution order
ON vs WHERE (the gotcha)
8LEFT JOIN b ON a.id = b.a_id AND b.status = 1
LEFT JOIN b ON a.id = b.a_id WHERE b.status = 1
WHERE b.a_id IS NULL OR b.status = 1
LEFT JOIN b ON ... AND a.type = 'x'
WHERE a.type = 'x'
INNER JOIN: ON and WHERE are equivalent
COALESCE(b.total, 0)
COUNT(b.id) vs COUNT(*)
USING, NATURAL & set ops
9JOIN b USING (user_id)
USING outputs ONE shared column
NATURAL JOIN b
Avoid NATURAL JOIN in production
SELECT ... UNION SELECT ...
UNION ALL
JOIN adds columns, UNION adds rows
INTERSECT
UNION needs same column count and types
LATERAL & performance
9CROSS JOIN LATERAL (SELECT ... WHERE b.a_id = a.id LIMIT 3) t
LEFT JOIN LATERAL (...) t ON TRUE
CROSS APPLY / OUTER APPLY
LATERAL sees columns of preceding tables
CREATE INDEX idx ON orders (user_id);
EXPLAIN SELECT ...;
Filter early: join the smallest set first
ON DATE(a.created_at) = b.day
Join on same-type, same-collation columns
“:q”와 일치하는 항목이 없습니다.
SQL Join 치트시트 소개
이 SQL join 치트시트는 한 가지를 철저히 다룹니다: 테이블을 결합하는 모든 방법을 설명합니다. 8개 섹션에서 기본 join 종류, 일치하지 않는 행을 위한 anti-join, 일치하는 행을 위한 semi-join, self join, cross join과 다중 테이블 join, 고전적인 ON 대 WHERE 함정, USING, NATURAL과 집합 연산, 그리고 성능 참고 사항이 포함된 LATERAL join까지 다룹니다.
join은 SQL 결과가 조용히 잘못되기 쉬운 지점입니다: WHERE 절에서 필터링된 LEFT JOIN은 조용히 INNER JOIN이 되어버리고, NULL이 포함된 NOT IN은 아무것도 반환하지 않습니다. 이런 함정들이 올바른 대안 패턴과 함께 각각의 행으로 다뤄집니다.
이 그룹의 다른 치트시트와 마찬가지로 무료이며 클라이언트 측에서 동작합니다: 검색창으로 실시간으로 행을 필터링하고, 고정된 목차로 섹션을 이동하고, 클릭 한 번으로 문을 복사하고, 책상에서 참고할 수 있도록 페이지를 인쇄할 수 있습니다.
SQL Join 치트시트 사용 방법
- 시트를 열고 기본 join 종류부터 LATERAL & 성능까지 섹션을 검토하세요.
- LEFT JOIN, EXISTS, NOT IN 같은 키워드를 검색해 모든 행을 실시간으로 필터링하세요.
- 행이 너무 적게 반환되는 LEFT JOIN을 디버깅하기 전에 ON vs WHERE 섹션을 읽어보세요.
- 문이나 복사 아이콘을 클릭해 SQL을 클립보드에 복사하세요.
- 전체 join 참고자료를 종이로 보려면 인쇄를 사용하세요.