개발은 처음이라 개발새발

Left Join 퀴즈 풀어보기 [LeetCode] 본문

mysql

Left Join 퀴즈 풀어보기 [LeetCode]

leon_choi 2023. 5. 6. 22:51
반응형

https://leetcode.com/problems/customers-who-never-order/description/

 

Customers Who Never Order - LeetCode

Can you solve this real interview question? Customers Who Never Order - Table: Customers +-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | name | varchar | +-------------+---------+ id is the primary key column for t

leetcode.com

오늘은 JOIN 함수 두번째 퀴즈이자 LEFT JOIN에 대해 풀어보겠습니다. 사실 현업에서는 그냥 JOIN은 많이 사용하지만 LEFT, OUTER, INNER는 잘 사용하지 않는데요. 그럼에도 JOIN을 이해하는데 알아두면 좋으니 한번 풀어보겠습니다. 

Input: 
Customers table:
+----+-------+
| id | name  |
+----+-------+
| 1  | Joe   |
| 2  | Henry |
| 3  | Sam   |
| 4  | Max   |
+----+-------+
Orders table:
+----+------------+
| id | customerId |
+----+------------+
| 1  | 3          |
| 2  | 1          |
+----+------------+
Output: 
+-----------+
| Customers |
+-----------+
| Henry     |
| Max       |
+-----------+

문제를 보면 CUSTOMERS라는 테이블과 ORDERS라는 두개의 테이블이 있는데요. 둘을 보게 되면 customerId가 3, 4인 Sam, JOE는 주문을할 이력이 보입니다. 반면 결과는 주문을 한번도 안한 Henry와 Max를 표출하는 것이 퀴즈입니다. 그러면 우선 그냥 JOIN으로 코드를 실행해보겠습니다.

select *
from Customers
join Orders
on Customers.id = Orders.customerId

____________________________________________________________________________
output:
| id | name | id | customerId |
| 1  | Joe  | 2  | 1          |
| 3  | Sam  | 1  | 3          |

결과물을 보면 그냥 join을 하니 Customers 테이블을 기준으로 조회했기 때문에 id와 customerId가 모두 있는 즉, 주문이력이 있는 Sam, Joe만 결과가 나왔습니다. 이렇게 결과가 나오게 된 이유는 그냥 join을 쓸 경우 inner join이 기본이기 때문에 두 테이블의 교집합이 나옵니다. 하지만 우리는 Orders의 Null값이 필요하기 때문에 교집합이 아니라 합집의 결과가 필요하기 때문에 OUTER JOIN이 기본인 LEFT JOIN을 활용해야 합니다. 이번에는 LEFT JOIN을 활용한 결과를 표출해보겠습니다.

select *
from Customers
left join Orders
on Customers.id = Orders.customerId

_____________________________________________________________________________
 output:
| id | name  | id   | customerId |
| 1  | Joe   | 2    | 1          |
| 2  | Henry | null | null       |
| 3  | Sam   | 1    | 3          |
| 4  | Max   | null | null       |

 네 이렇게 customerId가 null인 값도 도출했습니다. 이제 거의 정답에 근접했는데요. 답은 customerId가 null인 name만 도출하면됩니다. 결과를 보겠습니다. 

select (Customers.name) as Customers
from Customers
left join Orders
on Customers.id = Orders.customerId
where Orders.customerId is null

___________________________________
output:
| Customers |
| Henry     |
| Max       |
반응형