# [ 살펴보기 ] Sql - Join

특정 데이터를 기준으로 서로 다른 테이블에서 데이터를 함께 조회할 때 Join을 사용할 수 있다. 만약 users라는 table과 orders라는 table 두 곳에서 특정 user에 대한 정보와 user가 주문한 데이터를 함께 조회해야 할 때 Join을 통해 두 table 모두에서 데이터를 조회할 수 있다. 그리고 이 때 두 테이블 간의 연결 수단으로 흔히 사용되는 것이 Foreign key다

데이터베이스에 users와 orders라는 두 개의 데이터을 만들어 간단한 데이터로 채워 Join의 차이점을 살펴보자

현재 users table에 있는 데이터는 다음과 같다

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1719990435279/0255bfce-0a08-424c-9138-94ec848f7bdd.png align="center")

그리고 orders 테이블에 존재하는 데이터는 아래와 같다. user\_id는 user 데이블의 id column에 대한 외래키로 설정되어 있다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1719990485377/eb4c46b8-ec11-42de-832f-eba34b64cd68.png align="center")

## Inner Join

Inner Join은 Join하는 조건을 충족하는 데이터만 검색 결과에 포함한다. 다음 예제를 살펴보자

```sql
SELECT users.name as userName, orders.title as orderName
FROM users 
INNER JOIN orders
ON users.id = orders.user_id;
```

위의 예제는 users와 orders 테이블 두 곳에서 필요한 데이터를 검색하며 JOIN의 조건으로 users 테이블의 id와 orders 테이블의 user\_id 값이 동일한 행을 검색 결과에 포함시킨다. 즉, 결과는 다음과 같다

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1719991019064/9b8c413a-3cfc-477b-8e3b-4d0a1a42a41f.png align="center")

## Left ( Outer ) Join

두 테이블을 Join할 때 왼쪽에 선언된 테이블의 데이터를 모두 출력하고 오른쪽에 선언된 테이블은 조건에 일치하는 행을 가지고 온다. 만약 오른쪽에 선언된 테이블에 매칭되는 행이 없으면 값을 NULL로 대체되어 들어간다

다음 예제를 살펴보자

```sql
SELECT users.name as userName, orders.title as orderName
FROM users
LEFT JOIN orders
ON users.id = orders.user_id;
```

위의 예제에서는 LEFT JOIN의 대상은 users 테이블이 된다. 즉 users 테이블의 데이터는 모두 출력되고 orders table 중에 조건에 만족하는 데이터가 없다면 NULL로 대체된다. 즉 결과는 다음과 같다

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1719990999113/7cb67240-8f66-4f93-8b9a-8503cea5c730.png align="center")

Left 또는 Right Join을 수행할 때 Outer 키워드는 선택사항이므로 위의 예제와 같이 JOIN JOIN만 기입해도 무관하지만 명확성을 중요시 한다면 아래와 같이 OUTER 키워드를 추가해도 무관하다. 쿼리 결과는 OUTER 키워드가 없을 때와 동일하다.

```sql
SELECT users.name as userName, orders.title as orderName
FROM users
LEFT OUTER JOIN orders
ON users.id = orders.user_id;
```

## Right ( Outer ) Join

Left Join의 반대되는 역할을 한다. RIGHT JOIN 구문 오른쪽에 오는 table의 데이터를 모두 출력하고 조건에 만족하는 데이터가 없으면 구문 왼쪽 테이블의 출력 데이터를 NULL로 대체된다

```sql
SELECT users.name as userName, orders.title as orderName
FROM orders
RIGHT JOIN users
ON users.id = orders.user_id;
```

위의 예제와 같이 RIGHT JOIN에 대상이 되는 Table을 users로 변경해서 다시 테스트 해보면 결과는 다음과 같다

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1719990995224/cd421c0c-8767-49b8-8096-c2e985023c57.png align="center")

## 3방향 Join

만약 세 개의 테이블을 통해 데이터를 검색해야 한다면 Join절을 하나 더 추가하여 작업을 수행한다. 3방향 Join 테스트를 위해 refunds이라는 이름의 table을 하나 더 만들고 다음과 같이 간단히 테이터를 삽입하여 테스트를 해보자

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1719992771675/c51fbf78-ba06-46b3-97fc-3dd7c543d945.png align="center")

위의 테이블에서 order\_id는 order table id column에 대한 외래키이고 user\_id는 user table id column에 대한 외래키이다.

위에서 살펴보았던 join 테스트 결과와 더불어 order id에 따라 refunds table의 reason 데이터로 조회하고 싶다면 아래와 같이 처리할 수 있다

```sql
SELECT users.name as userName, orders.id as orderId, 
orders.name as orderName, refunds.reason  as refundReason
FROM users
LEFT JOIN orders
ON users.id = orders.user_id
LEFT JOIN refunds
ON refunds.order_id = orders.id;
```

그리고 위의 쿼리를 실행한 결과는 다음과 같다

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1719992985676/7b4eabe8-833c-467f-bf08-a4b809873699.png align="center")

## Join에 추가 필터 적용하기

JOIN절과 더불어 추가적으로 검색에 필요한 필터를 추가해야 할 때 다음과 같이 추가 필터를 적용할 수 있다.

```sql
SELECT users.name as userName, orders.id as orderId, orders.name as orderName
FROM users
LEFT JOIN orders 
ON users.id = orders.user_id
WHERE users.name = 'jake' 
```

위의 쿼리는 users table에 대한 Left Join이후 user name이 jake인 데이터를 추가적으로 필터한다. 위 쿼리에 대한 결과는 다음과 같다

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1719993590637/7bb39806-159b-4cd3-8282-347a72a87203.png align="center")
