SQL INNER JOIN이란?
SQL에서 INNER JOIN은 두 개 이상의 테이블을 연결할 때 사용하는 가장 기본적인 JOIN 방식입니다. 데이터베이스에서는 하나의 테이블에 모든 정보를 저장하지 않고, 성격에 따라 여러 테이블로 나누어 관리하는 경우가 많습니다.
예를 들어 회원 정보는 MEMBER 테이블에 저장하고, 주문 정보는 ORDERS 테이블에 저장할 수 있습니다. 이때 특정 회원이 어떤 주문을 했는지 확인하려면 두 테이블을 연결해야 합니다. 이런 상황에서 사용하는 것이 바로 JOIN입니다.
그중 INNER JOIN은 두 테이블에서 조건이 일치하는 데이터만 조회합니다. 즉, 양쪽 테이블에 모두 존재하는 값만 결과로 가져옵니다.
초보자 입장에서는 JOIN이라는 개념이 어렵게 느껴질 수 있지만, 핵심은 단순합니다. 공통된 컬럼을 기준으로 두 테이블을 합쳐서 필요한 데이터를 조회하는 것입니다.
INNER JOIN이 필요한 이유
실무 데이터베이스에서는 하나의 테이블에 모든 정보를 넣지 않습니다. 데이터 중복을 줄이고 관리 효율을 높이기 위해 여러 테이블로 나누어 저장합니다.
예를 들어 다음과 같은 두 테이블이 있다고 가정해보겠습니다.
MEMBER 테이블
| member_id | name |
|---|---|
| 1 | 김민수 |
| 2 | 이지은 |
| 3 | 박현우 |
ORDERS 테이블
| order_id | member_id | product |
|---|---|---|
| 101 | 1 | 노트북 |
| 102 | 2 | 키보드 |
| 103 | 1 | 마우스 |
MEMBER 테이블에는 회원 이름이 있고, ORDERS 테이블에는 주문 내역이 있습니다.
그런데 주문 내역을 조회하면서 회원 이름까지 함께 보고 싶다면 어떻게 해야 할까요?
ORDERS 테이블에는 회원 이름이 없고 member_id만 있습니다. 따라서 MEMBER 테이블과 연결해야 합니다. 이때 member_id를 기준으로 두 테이블을 연결하면 됩니다.
INNER JOIN 기본 문법
INNER JOIN의 기본 문법은 다음과 같습니다.
SELECT 컬럼명
FROM 테이블1
INNER JOIN 테이블2
ON 테이블1.공통컬럼 = 테이블2.공통컬럼;여기서 가장 중요한 부분은 ON 조건입니다.ON은 두 테이블을 어떤 기준으로 연결할지 지정하는 역할을 합니다.
예제를 보면 더 쉽게 이해할 수 있습니다.
SELECT
m.member_id,
m.name,
o.product
FROM member m
INNER JOIN orders o
ON m.member_id = o.member_id;위 SQL은 member 테이블과 orders 테이블을 member_id 기준으로 연결합니다.
결과는 다음과 같습니다.
| member_id | name | product |
|---|---|---|
| 1 | 김민수 | 노트북 |
| 1 | 김민수 | 마우스 |
| 2 | 이지은 | 키보드 |
여기서 박현우는 결과에 나오지 않습니다. 이유는 orders 테이블에 member_id = 3인 주문 내역이 없기 때문입니다.
이것이 INNER JOIN의 핵심입니다.
두 테이블에 모두 존재하는 데이터만 조회됩니다.
INNER JOIN의 동작 방식
INNER JOIN은 두 테이블을 비교하면서 ON 조건에 맞는 행만 결과로 가져옵니다.
앞의 예제에서 조건은 다음과 같습니다.
ON m.member_id = o.member_id이 조건은 member 테이블의 member_id와 orders 테이블의 member_id가 같은 행만 연결하겠다는 의미입니다.
즉, 데이터베이스는 다음과 같이 판단합니다.
- MEMBER의 1번 회원과 ORDERS의 1번 주문 데이터 연결
- MEMBER의 2번 회원과 ORDERS의 2번 주문 데이터 연결
- MEMBER의 3번 회원은 ORDERS에 없으므로 제외
그래서 INNER JOIN 결과에는 양쪽 테이블에서 조건이 맞는 데이터만 남게 됩니다.
테이블 별칭을 사용하는 이유
JOIN을 사용할 때는 테이블 이름이 길어지는 경우가 많습니다. 그래서 보통 별칭을 사용합니다.
FROM member m
INNER JOIN orders o여기서 member 테이블의 별칭은 m, orders 테이블의 별칭은 o입니다.
별칭을 사용하면 컬럼을 작성할 때 더 간단하게 쓸 수 있습니다.
SELECT m.name, o.product만약 별칭을 사용하지 않으면 다음처럼 작성해야 합니다.
SELECT member.name, orders.product테이블이 2개일 때는 큰 차이가 없어 보이지만, 3개 이상 JOIN하는 경우 별칭을 사용하는 것이 훨씬 깔끔합니다.
또한 서로 다른 테이블에 같은 이름의 컬럼이 있을 때는 반드시 어느 테이블의 컬럼인지 명확히 지정해야 합니다.
예를 들어 두 테이블 모두 member_id 컬럼을 가지고 있다면 다음과 같이 작성하는 것이 안전합니다.
SELECT m.member_id, m.name, o.productINNER JOIN과 WHERE 조건 함께 사용하기
INNER JOIN으로 테이블을 연결한 뒤, 원하는 조건만 추가로 조회할 수도 있습니다.
예를 들어 주문 상품이 노트북인 데이터만 조회하고 싶다면 다음과 같이 작성합니다.
SELECT
m.name,
o.product
FROM member m
INNER JOIN orders o
ON m.member_id = o.member_id
WHERE o.product = '노트북';결과는 다음과 같습니다.
| name | product |
|---|---|
| 김민수 | 노트북 |
여기서 ON은 테이블을 연결하는 조건이고, WHERE는 연결된 결과 중에서 원하는 데이터를 필터링하는 조건입니다.
초보자가 자주 헷갈리는 부분이 바로 이 차이입니다.
ON: 두 테이블을 연결하는 조건WHERE: 조회 결과를 제한하는 조건
둘 다 조건처럼 보이지만 역할이 다릅니다.
INNER JOIN과 일반 JOIN의 차이
SQL에서 다음 두 문장은 사실상 같은 의미로 사용됩니다.
SELECT *
FROM member m
JOIN orders o
ON m.member_id = o.member_id;SELECT *
FROM member m
INNER JOIN orders o
ON m.member_id = o.member_id;JOIN이라고만 작성하면 대부분의 데이터베이스에서는 기본적으로 INNER JOIN으로 처리됩니다.
하지만 초보자라면 처음에는 INNER JOIN이라고 명확하게 작성하는 것을 추천합니다. 그래야 나중에 LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN과 비교할 때 차이를 이해하기 쉽습니다.
3개 테이블 INNER JOIN 예제
실무에서는 두 개의 테이블만 JOIN하는 경우보다 세 개 이상의 테이블을 JOIN하는 경우도 많습니다.
예를 들어 회원, 주문, 상품 테이블이 있다고 가정해보겠습니다.
MEMBER 테이블
| member_id | name |
|---|---|
| 1 | 김민수 |
| 2 | 이지은 |
ORDERS 테이블
| order_id | member_id | product_id |
|---|---|---|
| 101 | 1 | 10 |
| 102 | 2 | 20 |
PRODUCT 테이블
| product_id | product_name |
|---|---|
| 10 | 노트북 |
| 20 | 키보드 |
회원 이름과 상품명을 함께 조회하려면 다음과 같이 작성합니다.
SELECT
m.name,
p.product_name
FROM member m
INNER JOIN orders o
ON m.member_id = o.member_id
INNER JOIN product p
ON o.product_id = p.product_id;결과는 다음과 같습니다.
| name | product_name |
|---|---|
| 김민수 | 노트북 |
| 이지은 | 키보드 |
이처럼 여러 테이블을 JOIN할 때는 테이블 간의 연결 관계를 순서대로 생각하면 됩니다.
- 회원 테이블과 주문 테이블을
member_id로 연결 - 주문 테이블과 상품 테이블을
product_id로 연결 - 필요한 컬럼만 SELECT에서 조회
INNER JOIN과 LEFT JOIN 차이
INNER JOIN을 이해할 때 가장 많이 비교되는 것이 LEFT JOIN입니다.
간단히 말하면 차이는 다음과 같습니다.
| 구분 | INNER JOIN | LEFT JOIN |
|---|---|---|
| 조회 기준 | 양쪽 테이블에 모두 있는 데이터 | 왼쪽 테이블 전체 |
| 조건 불일치 데이터 | 제외됨 | NULL로 표시됨 |
| 사용 목적 | 매칭된 데이터만 확인 | 기준 테이블 전체 확인 |
예를 들어 회원은 3명인데 주문한 회원은 2명뿐이라면 INNER JOIN은 주문한 회원 2명만 조회합니다.
반면 LEFT JOIN은 주문 여부와 관계없이 회원 3명을 모두 조회하고, 주문이 없는 회원의 주문 정보는 NULL로 표시합니다.
따라서 다음과 같이 구분하면 됩니다.
- 주문한 회원만 보고 싶다 →
INNER JOIN - 주문하지 않은 회원까지 모두 보고 싶다 →
LEFT JOIN
INNER JOIN 사용 시 주의할 점
1. 연결 조건을 정확히 작성해야 한다
JOIN에서 가장 중요한 것은 ON 조건입니다.
ON m.member_id = o.member_id이 조건이 잘못되면 전혀 다른 결과가 나올 수 있습니다. 특히 컬럼명이 비슷한 경우 실수하기 쉽기 때문에 테이블 구조를 먼저 확인하는 것이 좋습니다.
2. 같은 이름의 컬럼은 테이블명을 붙여야 한다
두 테이블에 같은 컬럼명이 있을 경우, 단순히 컬럼명만 작성하면 오류가 발생하거나 의도하지 않은 결과가 나올 수 있습니다.
SELECT member_id
FROM member m
INNER JOIN orders o
ON m.member_id = o.member_id;이런 경우에는 다음처럼 명확히 작성하는 것이 좋습니다.
SELECT m.member_id
FROM member m
INNER JOIN orders o
ON m.member_id = o.member_id;3. INNER JOIN은 매칭되지 않는 데이터를 제외한다
INNER JOIN은 조건이 맞지 않는 데이터를 결과에서 제외합니다.
따라서 “데이터가 누락된 것처럼 보이는” 상황이 생길 수 있습니다. 실제로 데이터가 없는 것이 아니라 JOIN 조건에 맞지 않아서 조회되지 않는 것일 수 있습니다.
이럴 때는 LEFT JOIN으로 바꿔서 기준 테이블의 데이터가 모두 나오는지 확인해보는 것도 좋은 방법입니다.
실무에서 INNER JOIN을 사용하는 경우
INNER JOIN은 실무에서 매우 자주 사용됩니다. 대표적인 상황은 다음과 같습니다.
회원별 주문 내역을 조회할 때 사용할 수 있습니다.
SELECT
m.name,
o.order_id,
o.order_date
FROM member m
INNER JOIN orders o
ON m.member_id = o.member_id;상품별 주문 정보를 조회할 때도 사용합니다.
SELECT
p.product_name,
o.order_id
FROM product p
INNER JOIN orders o
ON p.product_id = o.product_id;부서별 직원 정보를 조회할 때도 활용할 수 있습니다.
SELECT
e.employee_name,
d.department_name
FROM employee e
INNER JOIN department d
ON e.department_id = d.department_id;이처럼 INNER JOIN은 서로 관련 있는 테이블에서 필요한 정보를 함께 조회할 때 사용합니다.
INNER JOIN을 쉽게 이해하는 방법
INNER JOIN은 어렵게 생각할 필요가 없습니다.
두 테이블에 공통으로 있는 값을 기준으로 연결한다고 생각하면 됩니다.
예를 들어 학생 테이블과 성적 테이블이 있다고 가정합니다.
학생 테이블에는 학생 번호와 이름이 있고, 성적 테이블에는 학생 번호와 점수가 있습니다.
학생 이름과 점수를 함께 보고 싶다면 학생 번호를 기준으로 두 테이블을 연결하면 됩니다.
이것이 INNER JOIN입니다.
핵심은 다음 문장으로 정리할 수 있습니다.
INNER JOIN은 두 테이블에서 조건이 일치하는 행만 연결해서 보여주는 SQL 문법입니다.
정리
INNER JOIN은 SQL에서 가장 기본적이고 중요한 JOIN 방식입니다. 데이터베이스에서는 정보를 여러 테이블로 나누어 저장하기 때문에, 원하는 결과를 얻으려면 테이블을 연결하는 과정이 필요합니다.
INNER JOIN은 두 테이블에서 공통 조건이 일치하는 데이터만 조회합니다. 따라서 주문한 회원, 상품이 등록된 주문, 부서가 지정된 직원처럼 양쪽 테이블에 모두 연결 정보가 있는 데이터를 조회할 때 적합합니다.
기본 문법은 다음과 같습니다.
SELECT 컬럼명
FROM 테이블1
INNER JOIN 테이블2
ON 테이블1.공통컬럼 = 테이블2.공통컬럼;초보자가 반드시 기억해야 할 점은 세 가지입니다.
첫째, ON은 테이블을 연결하는 조건입니다.
둘째, WHERE는 JOIN 결과를 다시 필터링하는 조건입니다.
셋째, INNER JOIN은 매칭되지 않는 데이터를 제외합니다.
SQL을 처음 공부한다면 INNER JOIN을 단순히 암기하기보다 직접 예제 테이블을 만들어 실행해보는 것이 좋습니다. JOIN은 SQLD 시험뿐만 아니라 데이터 분석, 실무 쿼리 작성, 리포트 생성 업무에서도 자주 사용되는 핵심 개념입니다.
