JS/TIL(Today I Learned)

2025-02-05

프린스 알리 2025. 2. 5.

서로 다른 테이블 조회하기

1. JOIN

(1) LEFT JOIN

LEFT JOIN은 왼쪽 테이블의 모든 데이터를 포함하며, 오른쪽 테이블에 일치하는 값이 없을 경우 NULL 값을 포함한다. 즉, 왼쪽 테이블을 기준으로 오른쪽 테이블과 매칭되는 데이터를 가져오는 방식이다.

 

 

SELECT a.order_id, a.customer_id, a.restaurant_name, a.price, b.name, b.age, b.gender
FROM food_orders a
LEFT JOIN customers b
ON a.customer_id = b.customer_id;

위 쿼리는 food_orders 테이블의 모든 데이터를 유지하면서 customers 테이블에 매칭되는 데이터가 있는 경우 함께 조회하고, 없는 경우 NULL 값을 출력한다.

(2) INNER JOIN(그냥 JOIN으로 표기하기도 함)

INNER JOIN은 두 테이블 간의 공통된 값이 있는 행만 조회하는 방식이다. 즉, JOIN에 사용된 컬럼의 값이 양쪽 테이블에 모두 존재할 때만 결과에 포함된다.

 

SELECT a.order_id, a.customer_id, a.restaurant_name, a.price, b.name, b.age, b.gender
FROM food_orders a
INNER JOIN customers b
ON a.customer_id = b.customer_id;

 

위 쿼리는 food_orders 테이블과 customers 테이블을 customer_id를 기준으로 INNER JOIN하여 두 테이블에 모두 존재하는 행만 조회한다.

(3) RIGHT JOIN

RIGHT JOINLEFT JOIN과 반대로 오른쪽 테이블을 기준으로 데이터를 조회하며, 왼쪽 테이블에 매칭되는 값이 없는 경우 NULL 값을 포함한다.

SELECT a.order_id, a.customer_id, a.restaurant_name, a.price, b.name, b.age, b.gender
FROM food_orders a
RIGHT JOIN customers b
ON a.customer_id = b.customer_id;

 

위 쿼리는 customers 테이블의 모든 데이터를 유지하면서 food_orders 테이블과 매칭되는 데이터를 가져오며, 매칭되지 않는 값은 NULL로 출력된다.

(4) FULL OUTER JOIN

FULL OUTER JOIN은 LEFT JOIN과 RIGHT JOIN을 합친 형태로, 두 테이블의 모든 데이터를 포함하고, 매칭되지 않는 값은 NULL로 채운다.

SELECT a.order_id, a.customer_id, a.restaurant_name, a.price, b.name, b.age, b.gender
FROM food_orders a
FULL OUTER JOIN customers b
ON a.customer_id = b.customer_id;

 

위 쿼리는 food_orders와 customers 테이블의 모든 데이터를 조회하며, 매칭되지 않는 값은 NULL로 출력한다.

(5) JOIN의 기본 구조

-- LEFT JOIN
select 조회 할 컬럼
from 테이블1 a left join 테이블2 b on a.공통컬럼명=b.공통컬럼명
-- INNER JOIN
select 조회 할 컬럼
from 테이블1 a inner join 테이블2 b on a.공통컬럼명=b.공통컬럼명

FROM … JOIN … ON

정리

JOIN 종류 설명
INNER JOIN(JOIN) 두 테이블에 공통된 값이 있는 행만 조회
LEFT JOIN 왼쪽 테이블의 모든 행을 포함하고, 오른쪽 테이블에 없는 값은 NULL
RIGHT JOIN 오른쪽 테이블의 모든 행을 포함하고, 왼쪽 테이블에 없는 값은 NULL
FULL OUTER JOIN 두 테이블의 모든 데이터를 포함하고, 매칭되지 않는 값은 NULL

실습 예제

Employees 테이블:

EmployeeID Name Department Salary
1 Alice HR 5000
2 Bob IT 7000
3 Charlie IT 6000
4 David HR 4500
5 Eve Sales 5500
6 Frank IT 7200

 

Projects 테이블:

ProjectID ProjectName Budget
101 Alpha 10000
102 Beta 15000
103 Gamma 12000
104 Delta 8000

 

EmployeeProjects 테이블:

EmployeeID ProjectID
1 101
2 101
3 102
4 103
5 104
6 102
6 103

문제

직원이 참여한 프로젝트 중 예산이 10,000 이상인 프로젝트만을 조회하는 SQL 쿼리를 작성해주세요. 출력 결과에는 직원 이름, 프로젝트 이름, 그리고 프로젝트 예산이 포함되어야 합니다.

 

(1) 필요한 열 : Name, ProjectName, Budget => Employees, Projects 테이블
(2) 두 테이블을 연결하기 위해서는 EmployeeProjects 테이블이 필요하다.
(3) 공통된 값(10,000 이상의 예산)을 조회해야 하므로 INNER JOIN(JOIN)을 사용한다.

SELECT e.Name, p.ProjectName, p.Budget 
FROM Employees e 
JOIN EmployeeProjects ep 
ON e.EmployeeID = ep.EmployeeID 
JOIN Projects p 
ON ep.ProjectID = p.ProjectID 
WHERE p.Budget >= 10000;

설명:

  1. Employees(직원) 테이블과 EmployeeProjects(직원-프로젝트 매핑) 테이블을 EmployeeID를 기준으로 JOIN한다.
  2. EmployeeProjectsProjects(프로젝트) 테이블을 ProjectID를 기준으로 JOIN한다.
  3. WHERE 절을 사용하여 프로젝트 예산(Budget)이 10,000 이상인 프로젝트만 필터링한다.

이렇게 하면 직원이 참여한 프로젝트 중 예산이 10,000 이상인 프로젝트만 출력할 수 있다.

댓글