서로 다른 테이블 조회하기
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 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
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;
설명:
Employees
(직원) 테이블과EmployeeProjects
(직원-프로젝트 매핑) 테이블을EmployeeID
를 기준으로JOIN
한다.EmployeeProjects
와Projects
(프로젝트) 테이블을ProjectID
를 기준으로JOIN
한다.WHERE
절을 사용하여 프로젝트 예산(Budget
)이 10,000 이상인 프로젝트만 필터링한다.
이렇게 하면 직원이 참여한 프로젝트 중 예산이 10,000 이상인 프로젝트만 출력할 수 있다.
'JS > TIL(Today I Learned)' 카테고리의 다른 글
2025-02-07 <최종 프로젝트 D-35> 주간 기록 (0) | 2025.02.07 |
---|---|
2025-02-06 <최종 프로젝트 D-36> 채팅 프로그램 구상하기 (0) | 2025.02.06 |
2025-02-04 <최종 프로젝트 D-38> (0) | 2025.02.04 |
2025-02-03 (0) | 2025.02.03 |
2025-01-31 <스레드 경쟁 상태 해소하기> (1) | 2025.01.31 |
댓글