[SQL] 다중 테이블 사용하기: JOIN

jul ee·2025년 4월 4일

데이터 성장기

목록 보기
16/139

🖇  JOIN
🖇  JOIN의 종류
🖇  ON 대신 USING 사용하기


데이터를 분석할 때, 하나의 테이블만으로는 충분하지 않은 경우가 많다.

실제 데이터베이스 환경에서는 정보가 여러 테이블에 분산되어 저장되기 때문에
이들 테이블을 연결하여 의미 있는 정보를 추출하는 과정이 필수적이다.

     이때 사용되는 핵심 문법이 바로 JOIN 이다.

     JOIN 은 SQL의 핵심이자 관계형 데이터베이스의 가장 큰 장점 중 하나이다.

     제대로 이해하게 된다면 분산된 데이터 속에서 필요한 정보를 빠르게 추출할 수 있을 것이다.


특히 이 글에서는

JOIN을 사용할 때 참고하면 좋을 Tip 과 함께
실제로 이해가 잘 되지 않았던 문제 상황부터 해결까지 솔직하게 담아 보았다 :)



🖇  JOIN

JOIN 이란?

JOIN 은 관계형 데이터베이스의 핵심 요소로,

관계형 데이터베이스에서 두 개 이상의 테이블을 연결하여 데이터를 조회한다.

JOIN 의 주요 특징

  •  여러 테이블을 공통된 컬럼 기준으로 묶을 수 있다.
  •  주로 기본키(PK)와 외래키(FK)를 기준으로 연결한다.
  •  JOIN 키워드를 사용하며, 조건을 지정할 수 있다.

     ->  조인 유형을 지정하지 않으면 서버는 기본적으로 INNER JOIN 을 실행한다.

  •  두 테이블을 조인할 때 사용한 열의 이름이 동일할 경우, ON 대신 USING을 사용할 수 있다.

여기에서 INNER JOIN 은 뭐고, ONUSING 은 무엇일까?




예제와 함께 JOIN 의 실제 사용법을 살펴보자.

2개의 테이블 JOIN

SELECT 컬럼명
FROM 테이블명 AS A
JOIN 테이블명 AS B
ON A.id = B.id

-- 두 테이블을 조인하되,
-- orders 테이블의 customerId가 customers 테이블의 customerId와 일치하는 경우에만 결과 조회

SELECT : 조회할 컬럼 지정

FROM : 조회할 기준 테이블 지정

JOIN : 연결할 테이블 지정

ON : 두 테이블을 합치는 기준(조인 조건) 작성 -> 기준 컬럼/공통 컬럼



2개의 테이블 JOIN 예시

SELECT *
FROM orders AS o
JOIN customers AS c
     ON o.customerId = c.customerId

orders.customerIdcustomers.customerId 를 기준으로 연결하였고,

이렇게 orders 테이블과 customers 테이블을 조인하여 주문 + 고객 정보를 함께 조회할 수 있다.



3개의 테이블 JOIN

SELECT 컬럼명
FROM 테이블명 AS A
JOIN 테이블명 AS B
ON A.id = B.id
JOIN 테이블명 AS C
ON A.id = C.id

먼저 2개의 테이블을 JOIN 하고,
그 결과를 확인한 후에 나머지 1개의 테이블을 JOIN 해야 실수를 줄일 수 있다.

3개의 테이블 JOIN 예시

SELECT *
FROM orders AS o
JOIN customers AS c
     ON o.customerId = c.customerId
JOIN employees AS e
     ON c.employeesId = e.employeesId

orders.customerIdcustomers.customerId 를 기준으로 연결한 후에,
customers.employeesIdemployees.employeesId 를 기준으로 연결하였다.

주문 + 고객 정보와 함께 고객이 어떤 직원의 담당인지까지 조회할 수 있도록 확장한 것이다.
실제로 이런 다중 조인 구조는 자주 사용된다.


 쿼리 작성 Tip

💡  테이블에 별칭(A, B 등) 을 주면 쿼리가 가독성이 올라가고 효율적으로 쿼리문을 작성할 수 있다.

💡  가장 중심이 되는 테이블을 가장 먼저 작성한다.
       FROM 절 작성시 중심 데이터 먼저 작성하면 로직 파악이 수월해진다.

💡  JOIN 을 해야하는 테이블이 여러 개일 때, JOIN 할 때마다 결과를 확인하는 것도 방법이다.




🖇  JOIN의 종류

어느 부분의 데이터를 가져올 것인가에 따라 JOIN의 종류가 달라진다.

종류설명포함 데이터
INNER JOIN공통된 데이터만 조회교집합
LEFT JOIN왼쪽 테이블 기준, 오른쪽은 없으면 NULL왼쪽 전체 + 공통
RIGHT JOIN오른쪽 테이블 기준, 왼쪽은 없으면 NULL오른쪽 전체 + 공통

INNER JOIN

SELECT *
FROM orders AS o
JOIN customers AS c
ON o.customerId = c.customerId
  • 기본 JOIN 형태 (INNER 생략 가능)

  • 두 테이블 모두에 해당 값이 존재할 때만 결과로 나옴

  • 공통된 데이터를 연결할 때 사용

  • ON 뒤에 서로 공통적인 KEY를 기준으로 JOIN 한다.

서로 공통된 부분만 가져와 출력한다.

  • 벤다이어그램으로 표시하면 교집합에 해당한다.

ON 절의 조건을 만족하는 데이터만 가져온다.

  • 테이블에 일치하는 행이 있으면 가져오고, 일치하는게 없으면 가져오지 않는다.

🧐  의문이 생겼다.

위의 예제 코드에서 ON 절의 조건을 만족하지 못하는 경우가 과연 뭘까?
orders 테이블에 있는 주문에 대한 customerId가 customers 테이블에 무조건 있는 거 아닌가? '고객'이 주문을 한 것이니까 customers 테이블에 무조건 customerId가 있어야 하지 않나? 그렇다면 제외되는 행이 없을 텐데?

💡  아래의 상황을 가정해 보자.

예를 들어
데이터가 누락되었거나, 임시 데이터가 들어간 경우, 또는 외래키 제약조건이 설정되지 않은 경우에는 customers 테이블에 customerId가 없는 경우가 생길 수 있다.

[참고] 외래키 제약 조건
외래 키 제약 조건은 한 테이블의 컬럼이 다른 테이블의 기본 키(Primary Key) 또는 고유 키(Unique Key)를 참조하도록 만드는 제약 조건이다. 이를 통해 테이블 간의 관계를 정의하고, 데이터 무결성을 보장할 수 있다.

그래서 SQL에서는 항상 조건에 따라 데이터가 존재하지 않을 수도 있다는 것을 가정하고 처리하는 것이다 !





OUTER JOIN

조건을 만족하지 않은 행도 모두 출력하기 위한 조인 기법

  • INNER JOIN 조건을 만족하지 못해서 누락되는 행을 출력하기 위해 사용한다.

  • 일치하지 않는 데이터를 출력하고자 할 때 유용하다.

LEFT JOIN

SELECT *
FROM orders AS o  
LEFT JOIN customers AS c
ON o.customerId = c.customerId
ORDER BY o.customerId

왼쪽 테이블의 데이터를 유지한 채 오른쪽 테이블의 데이터를 가져온다.

  • LEFT (OUTER) JOIN 형태 (OUTER 생략 가능)

  • 왼쪽 테이블의 모든 행이 결과값에 한 줄 이상 나오는 것이 보장된다.

  • 왼쪽 테이블의 모든 행이 유지되며, 오른쪽에 해당 테이블의 값이 없으면 NULL 값으로 채워진다.
    ->   조인 안 되는 행까지 모두 확인하고 싶을 때 사용

    실제로 데이터를 다루게 되면 JOIN 혹은 LEFT JOIN 을 많이 사용한다.



RIGHT JOIN

-- pandasql에서는 RIGHT JOIN 지원 안 함
-- 일반 SQL에서는 다음과 같이 사용 가능

SELECT *
FROM orders AS o
RIGHT JOIN customers AS c
ON o.customerId = c.customerId

오른쪽 테이블의 데이터를 유지한 채 왼쪽 테이블의 데이터를 가져온다.
LEFT JOIN과 반대 개념

  • RIGHT (OUTER) JOIN 형테 (OUTER 생략 가능)

  • 오른쪽 테이블의 모든 행이 결과값에 한 줄 이상 나오는 것이 보장된다.

  • 오른쪽 테이블의 모든 행이 유지되며, 왼쪽의 해당 테이블의 값이 없으면 NULL 값으로 채워진다.

    실무에서는 JOIN 혹은 LEFT JOIN을 많이 사용하므로 RIGHT JOIN은 잘 사용하지 않는다.




🖇  ON 대신 USING 사용하기

두 테이블을 조인할 때

아래와 같이 조인 기준 컬럼 이름이 달라도 값(행)이 같다면 조인할 수 있다.

ON o.customer_id = c.id

이때는 반드시 ON 을 사용해야 한다.


그런데
조인 기준 컬럼의 이름이 같은 경우, ON 대신 USING(컬럼명) 을 사용할 수 있다.

-- 두 테이블에 customerId가 모두 있을 경우

SELECT *
FROM orders
JOIN customers
USING(customerId)

ON 절 대신 USING 을 사용하면 쿼리를 더 간결하게 작성할 수 있다.

이처럼 JOIN 을 사용하면서

단순히 데이터를 연결하는 것을 넘어
코드를 효율적이고 가독성 있게 작성하는 방법까지 고려할 수 있다.




지금까지 JOIN 역할과 기능을 알아보았다.

JOIN 은 SQL에서 관계형 데이터의 핵심 으로
관계형 데이터베이스의 테이블 내의 행들을 논리에 따라 연결할 수 있다.

    이렇게 JOIN이 두 개 이상의 테이블을 "가로로" 연결하는 방법이라면,
    데이터를 "세로로" 합치는 방식도 궁금하지 않은가? 😊

다음 글에서 UNION 을 통해 여러 테이블의 데이터를 합치는 방법을 다뤄볼 예정이다.



[해당 글에서 사용된 이미지는 아이펠 캠퍼스 LMS에서 제공한 이미지로 무단 복제 및 사용을 금지합니다.]

profile
AI에 관심을 가지고, 데이터로 가치를 만들어 나가는 과정을 기록합니다.

0개의 댓글