조인(JOIN)은 관계형 데이터베이스의 핵심으로, 여러 테이블에 흩어져 있는 데이터를 하나의 테이블처럼 합쳐서 조회하는 기능임. 정규화를 통해 분리된 테이블들의 관계를 이용하여 의미 있는 데이터 집합을 생성함.
조인의 가장 근본적인 개념은 카티션 곱임. 이는 조인에 참여하는 모든 테이블의 각 행을 서로 가능한 모든 조합으로 연결하는 것을 의미함.
FROM table1, table2
또는 FROM table1 CROSS JOIN table2
와 같이 조인 조건을 명시하지 않으면 발생함./*
* -- 조인 조건이 없는 경우: 3개 부서 * 4명 사원 = 12개 행의 카티션 곱 발생
* CROSS JOIN 키워드를 명시적으로 사용할 수도 있음.
*/
SELECT
d.name AS department_name,
e.name AS employee_name
FROM
Department d, Employee e;
INNER JOIN
은 두 테이블에서 조인 조건을 만족하는(짝이 맞는) 행들만 결과에 포함시키는 가장 일반적인 조인 방식임.
INNER JOIN
문법FROM table1 INNER JOIN table2 ON (조인 조건)
형태로 작성함.ON
절에 두 테이블을 연결하는 컬럼이 동일하다는 조건을 명시함.INNER
키워드는 생략 가능하여 JOIN
만으로도 INNER JOIN
으로 동작함./*
* -- Post와 User 테이블을 INNER JOIN --
* Post 테이블의 user_id와 User 테이블의 user_id가 일치하는 행만 연결하여
* 게시물 내용과 작성자 이름을 함께 조회함.
*/
SELECT
p.content,
u.name
FROM
Post p
INNER JOIN
User u ON p.user_id = u.user_id;
JOIN
을 연쇄적으로 사용하여 여러 테이블을 연결할 수 있음.INNER JOIN
의 경우 결과 집합은 논리적으로 동일함.-- Comment, Post, User 세 테이블을 조인하여 댓글 내용, 원본 게시물 내용, 댓글 작성자 이름을 조회
SELECT
c.comment_text,
p.content AS post_content,
u.name AS commenter_name
FROM
Comment c
INNER JOIN Post p ON c.post_id = p.post_id -- 1. Comment와 Post 연결
INNER JOIN User u ON c.user_id = u.user_id; -- 2. Comment와 User 연결
OUTER JOIN
은 조인 조건을 만족하지 않더라도, 기준이 되는 테이블의 모든 행을 결과에 포함시키는 조인 방식임. 짝이 없는 상대 테이블의 컬럼은 NULL
로 채워짐.
조인 종류 | 설명 |
---|---|
LEFT OUTER JOIN | 왼쪽(먼저 선언된) 테이블의 모든 행을 포함함. |
RIGHT OUTER JOIN | 오른쪽(나중에 선언된) 테이블의 모든 행을 포함함. |
FULL OUTER JOIN | 양쪽 테이블의 모든 행을 포함함. |
/*
* -- LEFT OUTER JOIN 예시 --
* User 테이블(왼쪽)을 기준으로, 모든 사용자를 조회함.
* Profile을 작성한 사용자는 프로필 정보를, 작성하지 않은 사용자는 프로필 정보 컬럼을 NULL로 표시함.
*/
SELECT
u.name,
p.bio
FROM
User u
LEFT OUTER JOIN Profile p ON u.user_id = p.user_id;
-- OUTER 키워드는 생략 가능 (LEFT JOIN)
/*
* -- SELF JOIN 예시: 사원과 관리자 이름 조회 --
* User 테이블을 직원(e)과 관리자(m)로 별칭을 부여하여 조인.
* 직원의 manager_id와 관리자의 user_id를 연결고리로 사용함.
* 매니저가 없는 최상위 직원은 INNER JOIN 시 조회되지 않으므로,
* 모든 직원을 보고 싶다면 LEFT JOIN을 사용해야 함.
*/
SELECT
e.name AS employee_name,
m.name AS manager_name
FROM
User e
LEFT JOIN User m ON e.manager_id = m.user_id;
NATURAL JOIN
과 USING
ON
절을 간소화하는 방법.NATURAL JOIN
: 이름이 같은 모든 컬럼을 자동으로 조인 조건으로 사용함. 의도치 않은 컬럼이 포함될 위험이 있어 사용 시 주의가 필요함.USING(컬럼명)
: 이름이 같은 여러 컬럼 중 조인에 사용할 공통 컬럼을 명시하여 NATURAL JOIN
보다 안전함.※ 실전 팁 (SQLD 핵심 포인트):
NATURAL JOIN
이나USING
절에서 조인 기준으로 사용된 공통 컬럼은SELECT
절에서 테이블 별칭을 붙일 수 없음. (예:SELECT u.user_id
불가,SELECT user_id
가능)
-- USING 절을 사용한 조인
SELECT
user_id, -- 별칭 사용 불가
u.name, -- 나머지 컬럼은 별칭 사용 권장
p.bio
FROM
User u
INNER JOIN Profile p USING(user_id);
구분 | ANSI 표준 문법 | Oracle 구문법 |
---|---|---|
INNER JOIN | FROM T1 INNER JOIN T2 ON T1.c1 = T2.c2 | FROM T1, T2 WHERE T1.c1 = T2.c2 |
LEFT OUTER JOIN | FROM T1 LEFT JOIN T2 ON T1.c1 = T2.c2 | FROM T1, T2 WHERE T1.c1 = T2.c2 (+) |
RIGHT OUTER JOIN | FROM T1 RIGHT JOIN T2 ON T1.c1 = T2.c2 | FROM T1, T2 WHERE T1.c1 (+) = T2.c2 |
(+)
기호: 데이터가 부족하여 NULL
이 표시될 수 있는 비기준 테이블 쪽의 조건 컬럼 뒤에 붙임.FROM
절에 여러 테이블을 나열하고 WHERE
절에 조인 조건을 빠뜨리면 카티션 곱이 발생한다는 점을 이용한 문제가 출제됨.INNER JOIN
vs OUTER JOIN
: 게시물을 작성하지 않은 회원, 주문 이력이 없는 고객 등 특정 조건에 맞는 데이터가 없는 경우, 두 조인의 결과 행 수가 어떻게 달라지는지 묻는 문제가 단골로 출제됨.USING
절의 별칭 문제: USING(column)
으로 지정된 컬럼을 SELECT
절에서 table_alias.column
형태로 참조하면 오류가 발생한다는 점은 SQLD의 주요 함정 포인트임.SELF JOIN
의 개념: 하나의 테이블로 직원과 관리자 정보를 동시에 조회하는 등 SELF JOIN
의 개념과 활용 사례를 묻는 문제가 출제될 수 있음.(+)
기호의 위치가 LEFT JOIN
인지 RIGHT JOIN
인지를 판단하는 문제가 나올 수 있음. (+)
는 데이터가 없는 쪽에 붙는다는 것을 기억해야 함.