개발 같이해요/DB

[ SQL ] SQL 조인 이미지,실무포함 총정리 ( INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN, CROSS JOIN,SELF JOIN)

Rio - Moon 2025. 5. 22. 12:05
728x90
반응형

 

SQL 조인

 

SQL 조인 실무포함 총정리

 

데이터베이스를 다루는 개발자나 데이터 분석가라면 반드시 접하게 되는 개념이 바로 SQL 조인(JOIN) 입니다. SQL 조인은 데이터베이스 내 서로 다른 테이블에 있는 데이터를 연결해 보여질 때 원하는 정보들만 추려서 보기위함으로 주로 쓰입니다.

 

흔히 데이터베이스는 여러 테이블로 나누어 데이터를 저장하며, 실무에서는 이러한 테이블들을 연결하여 복잡한 질문에 대한 답을 얻어야 할 때가 많습니다. 이때 사용하는 기술이 바로 SQL 조인이며, 이를 잘 다루는 것은 데이터베이스 관련 업무의 핵심 역량 중 하나라고 할 수 있습니다.

 

하지만 SQL 조인은 종류가 다양하고 용도와 결과가 조금씩 달라 조인이 필요할 때 마다 항상 검색을 하곤 했습니다.

 

이 글에서는 SQL 조인의 개념부터 종류별 특징, 실제 사용 예시 를 정리해 SQL 조인이 필요할 때 찾아볼 수 있도록 정리했습니다.

 

✅  각종 팁 모음

 

[ 엑셀 ] 구글 스프레드시트 자주쓰는 함수 정리 (PDF 공유)

 

[ 엑셀 ] 구글 스프레드시트 자주쓰는 함수 정리 (PDF 공유)

구글 스프레드시트는 강력한 데이터 분석 도구로, 다양한 함수를 통해 복잡한 작업도 간단하게 처리할 수 있습니다. 이번 포스팅에서는 구글 스프레드시트에서 자주 사용하는 함수들을 소개하

it-ability.tistory.com

 

[ AI 툴 ] 2025년 주목해야 할 AI 일정 관리 & 스케줄링 툴 TOP 10

 

[ AI 툴 ] 2025년 주목해야 할 AI 일정 관리 & 스케줄링 툴 TOP 10

인공지능(AI)은 이제 에이전트 로 넘어가고 있습니다. 특히 시간 관리와 일정 조율은 생산성의 핵심 요소입니다.  AI와 자동화 기능을 탑재한 다양한 도구들이 이러한 업무 부담을 덜어주며, 개

it-ability.tistory.com

 

[ AI 툴 ] 2025년 주목해야 할 AI 코딩 툴 TOP 10

 

[ AI 툴 ] 2025년 주목해야 할 AI 코딩 툴 TOP 10

인공지능(AI)은 코딩 및 개발 분야에서 점점 더 중요한 역할을 하고 있습니다. 특히, 코드 자동 완성, 디버깅, 문서화 등의 작업에서 AI 도구는 개발자들의 생산성을 획기적으로 높이고 있습니다.

it-ability.tistory.com

 

 

[ AI 툴 ] 2025년 주목할만한 AI 이미지 생성 도구 TOP 20 ( 특징,장점,단점 분석,후기 )

 

[ AI 툴 ] 2025년 주목할만한 AI 이미지 생성 도구 TOP 20 ( 특징,장점,단점 분석,후기 )

[ AI 툴 ] 2025년 주목할만한 AI 이미지 생성 도구 TOP 20 ( 특징,장점,단점 분석 ) 최근 인공지능 기술의 눈부신 발전과 함께, 이미지 생성 도구들이 급격히 발전하고 있습니다.   디자이너, 마케터,

it-ability.tistory.com

 

[개발 같이해요/AI] - [ AI ] Model Context Protocol (MCP) 쉽게 이해하기

 

[ AI ] Model Context Protocol (MCP) 쉽게 이해하기

Model Context Protocol (MCP) 쉽게 이해하기 MCP(Model Context Protocol)는 LLM 애플리케이션과 외부 데이터 소스 및 도구 간의 원활한 통합을 가능하게 하는 개방형 프로토콜입니다. 이번 포스팅에서는 요즘

it-ability.tistory.com

 

[개발 같이해요/DB] - [ mongodb ] 몽고db 설치 및 개발환경 세팅

 

[ mongodb ] 몽고db 설치 및 개발환경 세팅

MongoDB는 스키마가 유연하고 성능이 뛰어난 NoSQL 데이터베이스로 많은 개발자들에게 인기를 끌고 있습니다.이번 포스팅 에서는 MongoDB 설치 및 개발환경 세팅에 대해 알아보도록 하겠습니다.  다

it-ability.tistory.com

 


 

1. SQL 조인의 개념

 

데이터베이스 테이블과 관계의 이해

 

SQL 조인을 이해하기 전에 먼저 데이터베이스에서 테이블과 테이블 간의 관계를 이해할 필요가 있습니다.

  • 테이블(Table)은 데이터베이스에서 데이터를 저장하는 기본 단위로, 행(row)과 열(column)의 형태로 데이터를 구성합니다.
  • 데이터는 여러 테이블로 나누어 저장되며, 이들 간에는 보통 특정 키(key)를 통해 관계(relationship)가 맺어집니다.
  • 관계형 데이터베이스(Relational Database)는 이러한 테이블 간의 관계를 활용해 데이터를 효율적으로 관리하고, 필요한 정보를 빠르게 조회할 수 있도록 돕습니다.

예를 들어, 온라인 쇼핑몰의 경우 고객 정보는 '고객 테이블'에, 주문 정보는 '주문 테이블'에 별도로 저장되는데, 두 테이블을 연결하여 어떤 고객이 어떤 주문을 했는지 쉽게 확인할 수 있습니다.

 

 

SQL 조인의 기본 정의와 목적

 

SQL에서 조인이란, 두 개 이상의 테이블을 서로 연결하여 하나의 결과 집합으로 만드는 작업입니다.

조인은 공통 키(common key) 값을 기준으로 이루어지며, 일반적으로 두 테이블의 연관된 데이터를 함께 표시하는 데 사용됩니다.

즉, SQL 조인을 사용하는 목적은 

  1. 여러 테이블의 정보를 하나로 묶어 종합적으로 보여줌으로써 데이터의 의미를 보다 명확히 파악
  2. 중복 데이터를 줄이고 데이터의 일관성과 무결성을 유지
  3. 데이터 분석 및 보고서를 생성할 때 필수적인 정보들을 빠르게 조회 및 활용

이라고 볼 수 있습니다.

 

 

SQL 조인의 기본 문법

 

SELECT 컬럼명
FROM 테이블1
[INNER|LEFT|RIGHT|FULL OUTER|CROSS] JOIN 테이블2
ON 테이블1.공통키 = 테이블2.공통키;

 

이 중에서 INNER JOIN이 가장 자주 사용되는 기본 형태이며, 나머지 JOIN들은 필요에 따라 특정 상황에서 활용됩니다.

 

 

SQL 조인의 예시

 

고객 테이블 (customers)

customer_id customer_name
1 홍길동
2 김철수

 

주문 테이블(orders)

order_id customer_id product
101 1 노트북
102 2 스마트폰
103 1 키보드

 

두 테이블 조인 쿼리 ( customer_id 를 기준 으로 )

SELECT customers.customer_name, orders.product
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id;

 

결과 

customer_name product
홍길동 노트북
홍길동 키보드
김철수 스마트폰

 

 

 

2. SQL 조인의 종류 및 특징

 

INNER JOIN 

inner join

INNER JOIN은 두 테이블에서 조인 조건이 일치하는 행들만 반환하는 가장 기본적인 조인 방식입니다. 공통된 키 값이 존재하는 데이터만 결과로 나타나며, 실무에서 가장 흔히 사용됩니다.

 

문법

SELECT 컬럼명
FROM 테이블1
INNER JOIN 테이블2 ON 테이블1.공통키 = 테이블2.공통키;

 

예시

 

customers (고객 테이블)

customer_id customer_name
1 홍길동
2 김철수
3 박영희

orders (주문 테이블)

order_id customer_id product
101 1 노트북
102 2 스마트폰
103 4 태블릿

SQL 쿼리

SELECT customers.customer_name, orders.product
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id;

 

결과

customer_name product
홍길동 노트북
김철수 스마트폰

 

고객 ID가 양쪽 테이블 모두 존재하는 데이터만 결과로 나타납니다.

 

주의점 및 활용 팁

  • INNER JOIN은 공통 키가 없는 데이터는 결과에 나타나지 않습니다.
  • 반드시 데이터가 양쪽 테이블에 모두 존재할 때만 활용해야 합니다.

 

 

LEFT JOIN 

LEFT JOIN은 왼쪽 테이블의 모든 데이터를 포함하여 오른쪽 테이블에서 일치하는 데이터를 결합합니다. 오른쪽 테이블에 매칭되는 데이터가 없으면 NULL 값으로 채워집니다.

 

문법

SELECT 컬럼명
FROM 테이블1
LEFT JOIN 테이블2 ON 테이블1.공통키 = 테이블2.공통키;

 

예시

 

customers (고객 테이블)

customer_id customer_name
1 홍길동
2 김철수
3 박영희

orders (주문 테이블)

order_id customer_id product
101 1 노트북
102 2 스마트폰
103 4 태블릿

SQL 쿼리

SELECT customers.customer_name, orders.product
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;

 

결과

customer_name product
홍길동 노트북
김철수 스마트폰
박영희 NULL

 

왼쪽 테이블(customers)의 모든 고객이 표시되며, 박영희 고객은 주문이 없으므로 product 컬럼이 NULL로 표시됩니다.

 

주의점 및 활용 팁

  • 메인 테이블의 모든 데이터를 기준으로 데이터를 조회할 때 유용합니다.
  • 데이터 누락이나 미기록 항목을 확인할 때 유용합니다.

 

RIGHT JOIN 

RIGHT JOIN은 오른쪽 테이블의 모든 데이터를 기준으로 왼쪽 테이블과 결합합니다. 왼쪽 테이블에 매칭 데이터가 없으면 NULL 값을 채워 넣습니다.

 

문법

SELECT 컬럼명
FROM 테이블1
RIGHT JOIN 테이블2 ON 테이블1.공통키 = 테이블2.공통키;

 

예시

 

customers (고객 테이블)

customer_id customer_name
1 홍길동
2 김철수
3 박영희

orders (주문 테이블)

order_id customer_id product
101 1 노트북
102 2 스마트폰
103 4 태블릿

SQL 쿼리

SELECT customers.customer_name, orders.product
FROM customers
RIGHT JOIN orders ON customers.customer_id = orders.customer_id;

 

결과

customer_name product
홍길동 노트북
김철수 스마트폰
NULL 태블릿

 

오른쪽 테이블(orders)의 모든 주문이 표시되며, customer_id가 없는 주문(태블릿 주문)은 customer_name이 NULL로 표시됩니다.

 

주의점 및 활용 팁

  • 일반적으로 LEFT JOIN선호하며 RIGHT JOIN은 명확한 이유가 있을 때만 사용합니다.
  • 데이터베이스 설계상 주 테이블이 오른쪽일 때 유용하게 사용됩니다.

 

 

FULL OUTER JOIN 

FULL OUTER JOIN은 양쪽 테이블의 모든 데이터를 포함하여 일치하지 않는 데이터는 NULL로 표시합니다.

 

문법

SELECT 컬럼명
FROM 테이블1
FULL OUTER JOIN 테이블2 ON 테이블1.공통키 = 테이블2.공통키;

 

예시

 

customers (고객 테이블)

customer_id customer_name
1 홍길동
2 김철수
3 박영희

orders (주문 테이블)

order_id customer_id product
101 1 노트북
102 2 스마트폰
103 4 태블릿

SQL 쿼리

SELECT customers.customer_name, orders.product
FROM customers
FULL OUTER JOIN orders ON customers.customer_id = orders.customer_id;

 

결과

customer_name  product
홍길동 노트북
김철수 스마트폰
박영희 NULL
NULL 태블릿

 

모든 고객과 주문이 표시되며, 대응되는 데이터가 없으면 NULL로 처리됩니다.

 

주의점 및 활용 팁

  • 데이터 전체를 비교 분석하거나, 데이터 누락을 파악할 때 유용합니다.
  • 데이터 양이 많아지면 성능이 떨어질 수 있으므로 주의합니다.

 

CROSS JOIN 

CROSS JOIN은 두 테이블의 모든 데이터를 조합하여 카테시안 곱(Cartesian Product)을 생성합니다.

 

문법

SELECT 컬럼명
FROM 테이블1
CROSS JOIN 테이블2;

 

주의점 및 활용 팁

  • CROSS JOIN은 테이블의 크기가 클 경우 결과가 기하급수적으로 많아지므로 매우 조심해서 사용해야 합니다.
  • 모든 조합 데이터를 만들어 분석하거나 특별한 목적이 있을 때만 사용합니다.

 

SELF JOIN 

SELF JOIN은 같은 테이블을 자신과 조인하는 것입니다. 주로 계층형 데이터나 동일 테이블 내의 데이터 간 관계를 분석할 때 사용합니다.

 

예시

 

사원과 매니저가 같은 테이블에 있을 때 활용 가능합니다.

SELECT e.employee_name, m.employee_name AS manager_name
FROM employees e
INNER JOIN employees m ON e.manager_id = m.employee_id;

 

직원의 이름과 그 직원의 매니저 이름을 함께 출력합니다.

 

주의점 및 활용 팁

  • 동일한 테이블에서 상위 하위 관계를 찾을 때 유용합니다.

 

 

 

 

3. 실전 프로젝트에서 SQL 조인 사용 예시

 

지금까지 배운 SQL 조인의 개념과 특징을 토대로, 실무에서 자주 접할 수 있는 SQL 조인의 실제 활용 예시를 알아보겠습니다.

 

 

고객과 주문 테이블을 활용한 사례

 

온라인 쇼핑몰에서 특정 고객이 어떤 상품을 주문했는지 조회하는 예시입니다.

 

테이블 구조 예시

  • customer 테이블
customer_id customer_name email
1 홍길동 hong@example.com
2 김철수 kim@example.com

 

  • orders 테이블
order_id customer_id product_name order_date
1001 1 노트북 2024-12-10
1002 2 스마트폰 2024-12-11
1003 1 키보드 2024-12-12

 

SQL 쿼리 예시 (INNER JOIN 활용)

SELECT c.customer_name, o.product_name, o.order_date
FROM customers c
INNER JOIN orders o ON c.customer_id = o.customer_id
ORDER BY c.customer_name, o.order_date;

 

 

결과

customer_name  product_name  order_date
김철수 스마트폰 2024-12-11
홍길동 노트북 2024-12-10
홍길동 키보드 2024-12-12

 

이렇게 INNER JOIN을 통해 고객별 주문 목록을 쉽게 확인할 수 있습니다.

 

 

상품과 재고 테이블을 활용한 사례

 

상품 목록과 해당 상품의 재고 수량을 확인하는 경우입니다. 일부 상품은 재고가 없을 수도 있습니다.

 

테이블 구조 예시

  • products 테이블
product_id product_name category
1 노트북 전자기기
2 스마트폰 전자기기
3 이어폰 액세서리

 

  • inventory 테이블
inventory_id product_id quantity
10 1 5
11 2 0

 

 

SQL 쿼리 예시 (LEFT JOIN 활용)

SELECT p.product_name, p.category, IFNULL(i.quantity, 0) AS quantity
FROM products p
LEFT JOIN inventory i ON p.product_id = i.product_id;

 

결과

product_name category quantity
노트북 전자기기 5
스마트폰 전자기기 0
이어폰 액세서리 0

 

사원과 부서 테이블을 활용한 사례

 

사원 목록과 각 사원이 소속된 부서명을 함께 조회하는 예시입니다.

 

테이블 구조 예시

  • employees 테이블
employee_id employee_name department_id
101 이영수 1
102 정민아 2
103 박진우 NULL

 

  • departments 테이블
department_id department_name
1 영업부
2 개발부

 

 

SQL 쿼리 예시 (LEFT JOIN 활용)

SELECT e.employee_name, IFNULL(d.department_name, '부서 없음') AS department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;

 

결과

employee_name department_name
이영수 영업부
정민아 개발부
박진우 부서 없음

 

 

 

 

 

 

4. SQL 조인 팁

 

인덱스(Index) 활용 하기

 

SQL 조인의 성능을 최적화하는 가장 중요한 요소 중 하나는 바로 인덱스(Index) 입니다. 인덱스는 데이터베이스가 데이터를 빠르게 찾을 수 있도록 돕는 자료구조로, 검색 성능을 획기적으로 향상시킵니다.

 

인덱스 적용이 필요한 컬럼

 

  • JOIN 조건에 자주 사용되는 컬럼 (FK, PK 등)
  • WHERE 절에서 필터링할 때 자주 쓰는 컬럼
  • ORDER BY 또는 GROUP BY 절에서 자주 쓰이는 컬럼

 

인덱스 생성 예시

CREATE INDEX idx_orders_customer_id ON orders(customer_id);

 

인덱스를 생성하면 데이터베이스가 조인을 수행할 때 더 빠르게 데이터를 찾고 처리할 수 있습니다.

 

 

필요한 데이터만 선택(Projection)하기

 

조인 시 모든 컬럼을 불러오는 것은 성능 저하를 일으킬 수 있습니다. 필요한 컬럼만 선택하는 습관을 기르면 데이터 처리 속도가 훨씬 빨라집니다.

 

성능에 좋지 않은 예시

SELECT *
FROM customers c
INNER JOIN orders o ON c.customer_id = o.customer_id;

 

성능 최적화 예시

SELECT c.customer_name, o.product_name, o.order_date
FROM customers c
INNER JOIN orders o ON c.customer_id = o.customer_id;

 

 

조건을 조인(ON)에 명시적으로 기술하기

 

조인 조건을 명시적으로 ON 절에 기술하면 데이터베이스가 더욱 효율적으로 데이터를 필터링할 수 있습니다.

 

비효율적인 예시

SELECT c.customer_name, o.product_name
FROM customers c, orders o
WHERE c.customer_id = o.customer_id AND o.order_date > '2025-01-01';

 

성능 최적화 예시

SELECT c.customer_name, o.product_name
FROM customers c
INNER JOIN orders o ON c.customer_id = o.customer_id AND o.order_date > '2025-01-01';

 

서브쿼리(Subquery)보다는 JOIN 사용하기

 

일반적으로 서브쿼리보다 조인이 성능이 더 뛰어납니다. 서브쿼리는 처리 방식에 따라 성능이 떨어질 수 있으므로, 가능하면 조인을 사용하는 것을 추천합니다.

 

서브쿼리를 사용한 예시 (비효율적)

SELECT customer_name
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders);

 

JOIN을 사용한 최적화 예시 (효율적)

SELECT DISTINCT c.customer_name
FROM customers c
INNER JOIN orders o ON c.customer_id = o.customer_id;

 

 

조인 순서(Join Order)를 고려하기

 

여러 테이블을 조인할 때는 테이블의 크기와 필터링 정도를 고려하여 조인 순서를 최적화하면 성능 향상에 도움을 줍니다.

 

  • 작은 테이블이나 필터링 조건으로 크기를 줄인 테이블을 먼저 조인하기

 

비효율적인 예시

SELECT *
FROM orders o
INNER JOIN large_table lt ON o.id = lt.order_id
INNER JOIN small_table st ON o.id = st.order_id;

 

효율적인 예시

SELECT *
FROM orders o
INNER JOIN small_table st ON o.id = st.order_id
INNER JOIN large_table lt ON o.id = lt.order_id;

 

 

데이터베이스 쿼리 플랜(Query Plan) 점검하기

 

모든 데이터베이스 시스템은 실행 계획(Execution Plan)을 제공하며, 이를 통해 쿼리가 어떻게 실행되는지 분석할 수 있습니다.

  • EXPLAIN 명령어나 관련 툴을 활용하여 쿼리 실행 계획 확인 하고 체크하기
  • 실행 계획에서 Full Table Scan이나 비효율적인 처리가 있다면 인덱스 추가 및 조인 조건을 개선 필요

 

예시

EXPLAIN SELECT customer_name FROM customers WHERE customer_id = 1;

 

이 결과를 통해 인덱스가 제대로 사용되고 있는지 확인할 수 있습니다.

 

 

5. SQL 조인 할 때 많이 하는 실수 와 해결방법

 

조인 조건 누락으로 인한 카테시안 곱 발생

 

조인 조건을 실수로 누락하면 예상보다 매우 큰 결과(카테시안 곱)가 생성될 수 있습니다.

 

문제 예시

SELECT *
FROM customers c, orders o;  -- 조건이 누락됨

 

조건이 없기 때문에 고객 수 × 주문 수 만큼의 매우 많은 결과가 반환됩니다.

 

해결 방법

 

항상 ON 조건을 명확하게 하기.

SELECT *
FROM customers c
INNER JOIN orders o ON c.customer_id = o.customer_id;

 

 

 

 

잘못된 조인 타입 선택으로 데이터 누락 발생

 

INNER JOIN과 LEFT JOIN을 잘못 선택하면 예상치 못한 데이터 누락이 발생할 수 있습니다.

 

문제 예시

SELECT customers.customer_name, orders.product_name
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id;

 

주문 내역이 없는 고객을 보여주지 못합니다.

 

해결 방법

 

모든 고객 데이터를 보려면 LEFT JOIN 사용하기

SELECT customers.customer_name, orders.product_name
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;

 

중복된 데이터가 포함된 결과 발생

 

조인된 테이블에 중복된 키 값이 존재하면 예상치 못한 중복 데이터가 결과에 나타날 수 있습니다.

 

 

문제 예시 (중복 데이터 발생)

 

테이블 예시

  • orders 테이블
 order_id customer_id product_name
1 100 노트북
2 100 노트북
 
SELECT customers.customer_name, orders.product_name
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id;
 

중복된 주문이 각각 별도의 행으로 나타납니다.

 

해결 방법

 

중복 데이터 방지를 위해 DISTINCT를 활용하기

 
SELECT DISTINCT customers.customer_name, orders.product_name
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id;

 

 

OUTER JOIN 시 NULL 처리 실수

 

OUTER JOIN을 사용하면 데이터가 없는 행에 NULL이 반환됩니다. 이때 NULL 처리를 하지 않으면 이후 데이터 처리 과정에서 오류가 발생할 수 있습니다.

 

문제 예시 (NULL 처리 실수)

SELECT c.customer_name, o.product_name
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id;

 

주문하지 않은 고객은 product_name이 NULL입니다.

 

해결 방법

 

명시적으로 NULL 처리 하기

 

SELECT c.customer_name, IFNULL(o.product_name, '주문 내역 없음') AS product_name
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id;

 

6. 정리

 

 

INNER JOIN은 양쪽 테이블에서 일치하는 데이터만 반환하며, 가장 많이 사용됩니다.

LEFT JOIN, RIGHT JOIN은 특정 테이블을 기준으로 데이터를 모두 조회할 때 유용하며, 누락된 데이터는 NULL로 처리됩니다.

FULL OUTER JOIN은 양쪽 테이블의 모든 데이터를 확인하고자 할 때 적합합니다.

CROSS JOIN은 모든 데이터를 조합하는 카테시안 곱으로 결과가 많아지므로 조심스럽게 사용합니다.

SELF JOIN은 동일한 테이블 내의 데이터 관계를 확인할 때 효과적입니다.

 

또한 SQL 조인의 성능을 높이기 위해서는 반드시 인덱스를 활용하고, 필요한 데이터만 조회하며, 조인 조건을 명확히 설정하는

것들이 중요합니다.

 

sql thumbnail

 

 

반응형