조인과 집합
내부 조인("INNER JOIN" )은 두 테이블의 교집합을 찾는 것과 같다. 두 집합(테이블)에서 공통된 원소(연결 컬럼의 값이 일치하는 데이터)만을 결과로 반환한다.
- A 집합: "orders" 테이블에 있는 모든 사용자들의 "user_id" 집합
- B 집합: "users" 테이블에 있는 모든 "user_id" 집합
"INNER JOIN"은 은 A 집합과 B 집합에 모두 포함된"user_id"에해당하는 데이터만을 결합하여 보여준다.
벤 다이어그램으로 이해하기

- "orders" 집합 (왼쪽 원): 지금까지 들어온 모든 주문을 나타낸다. 주문 데이터에 기록된 "user_id"는 {1, 2, 3, 4, 5}가 있다. (참고로 집합은 중복 값은 제거하고 표현한다)
- "users" 집합 (오른쪽 원): 우리 쇼핑몰에 가입한 모든 회원을 나타낸다. "user_id'가 {1, 2, 3, 4, 5, 6}이 있다.
교집합

- 교집합 (가운데 영역): "users"와 "orders" 양쪽에 모두 존재하는 "user_id"의 집합 {1, 2, 3, 4, 5}이다. 내부 조인의 결과는 바로 이 교집합에 해당하는 데이터들이다.
집합의 관점에서 제외되는 데이터
1. 주문 기록이 없는 회원

- "user_id"가 6인 "레오나르도 다빈치"는 "users" 테이블에는 존재하지만, 아직 한 번도 주문한 적이 없으므로 "orders" 테이블에는 해당 "user_id" 가 없다. 따라서 이 회원은 "users" 집합에는 속하지만 교집합에는 속하지 않으므로 "INNER JOIN" 결과에서 제외된다.
2. 존재하지 않은 회원의 주문

- 만약 "orders" 테이블에 "user_id"가 99인 주문이 있는데, "users" 테이블에 "user_id"가 99인 회원이 없다면 어떻게 될까?
- 이 주문 데이터는 "orders" 집합에는 속하지만 교집합에는 포함되지 않으므로 "INNER JOIN" 결과에서 제외된다.
- 실제로는 데이터 무결성을 위해 외래 키(FOREIGN KEY) 제약조건을 사용하므로 이런 경우는 발생하지 않는다.
결론적으로, "INNER JOIN"은 어느 한쪽에만 데이터가 존재하는 경우는 결과에 포함시키지 않고, 양쪽 모두에 명확하게 연결고리가 있는 데이터만을 짝지어 보여준다.
SQL로 확인하기
Inner Join 확인하기(user_id= {1,2,3,4,5}만 나오는지 확인)
select
orders.order_id,
orders.order_date,
orders.user_id as orders_user_id,
users.User_id as users_user_id,
users.name
from orders
inner join users
on orders.user_id = users.user_id
order by order_id
;

- "user_id" 가 양쪽에 모두 있는 {1,2,3,4,5}가 선택되었다.
- 주문 기록이 없는 "user_id"가 6인 "레오나르도 다빈치"는 포함되지 않은 것을 다시 한번 확인할 수 있다.
내부 조인과 조인 방향
내부 조인은 양방향이다. A 테이블과 B 테이블이 있다고 하면, A -> B로 조인할 수 있다면 반대로 B -> A로 조인할 수 있다. 그리고
그 결과는 항상 동일하다.
Order -> Users


Users -> Order


- 교집합은 항상 {1,2,3,4,5}이다.
- orders -> users
- "orders" 테이블을 한 줄씩 읽으며, 각 주문의"user_id"에 해당하는 "users" 정보를 찾아 옆에 붙인다
- users -> orders
- "users" 테이블을 한 줄씩 읽으며, 각 사용자의"user_id"와 일치하는 모든 "orders" 정보를 찾아 옆에 붙인다.
- 예를 들어"users"의 "order_id:1" , "order_id:2"와 연결된다.
- 두 방식 모두 "ON" 조건을 만족하는 모든 조합을 찾아내므로, 논리적으로 완전히 동일한 결과를 생성한다.
SQL로 확인하기
-- orders -> users
select
orders.order_id,
orders.order_date,
orders.user_id as orders_user_id,
users.User_id as users_user_id,
users.name
from orders
inner join users
on orders.user_id = users.user_id
order by order_id
;
-- users -> orders
select
orders.order_id,
orders.order_date,
orders.user_id as orders_user_id,
users.User_id as users_user_id,
users.name
from users
inner join orders
on users.user_id = orders.user_id
order by order_id
;
- 두 쿼리의 결과는 동일하다.
'데이터 베이스 > 데이터베이스 기본' 카테고리의 다른 글
| Ch04. UNION - UNION (0) | 2026.05.31 |
|---|---|
| Ch03. 서브쿼리 - 서브쿼리 VS Join (0) | 2026.05.30 |
| Ch01. 내부 조인 - 내부 조인(3) (0) | 2026.05.24 |
| Ch01. 내부 조인 - 내부 조인(1) (0) | 2026.05.24 |
| Ch01. 내부 조인 - 조인이 필요한 이유 (0) | 2026.05.23 |