- OUTER JOIN이 필요한 이유
Users
id | 로그인 아이디 | 주소 |
1 | A | 광진구 자양동 |
2 | B | 송파구 석촌동 |
3 | C | 분당구 판교동 |
Orders
userid | orderid | 구매 상품 | 가격 | 결제 수단 |
1 | 1234 | 샴푸 | 5000 | 국민 카드 |
2 | 5678 | 식빵 | 7000 | 신한 카드 |
이런 두 테이블이 있다고 해보자.
id가 3인 사람은 가입은 했지만 아직 구매를 하지 않았다.
이 상태에서 inner join을 하게 되면 id가 3인 데이터는 겹치지 않으므로 출력되지 않는다.
만약, 유저와 그 유저들의 주문 사항을 출력하는데 한번도 주문하지 않은 유저들의 정보도 같이 출력하려면 outer join이 필요하다.
- LEFT JOIN
1. 위와 같은 사례에서 작성할 수 있는 코드
SELECT *
FROM Users
LEFT JOIN Orders ON User.id = Orders.userid
Orders에는 없는 id 정보를 user가 갖고 있는거니까 user를 기준으로 left join
2. 한번도 구매를 하지 않은 유저만 출력하고 싶다면
SELECT *
FROM Users
LEFT JOIN Orders ON Users.id = Orders.userid
WHERE Orderid IS NULL
where문에 orderid가 null값인 조건을 걸어서 출력하기
- RIGHT JOIN
left join과 반대 개념
위 같은 사례에서는 User를 오른쪽으로 놓고 Orders가 왼쪽에 오면서 id가 1,2번인 사람들의 데이터만 출력하는 것임
(Orders에는 있지만 Users에는 없는걸 제외하고 출력 >> id가 3인 사람의 모든 정보)
SELECT *
FROM Users
RIGHT JOIN Orders ON Orders.useid = Users.id
대부분 LEFT JOIN 쓰고, 기준 잡기에 더 편하다.
데이터베이스에 따라 LEFT OUTER JOIN이라고 쓰기도 한다. (LEFT JOIN과 동일하게 동작)
- ALIASES
테이블명에 별칭 지정
테이블명이 길어서 코드 작성 시 오래 걸릴 때 편의를 위해 사용
AS로 나타내고 이후부터는 c라고만 표기해도됌
SELECT *
FROM Customers AS c
- 리트코드 예제 풀이
Customers Who Never Order
https://leetcode.com/problems/customers-who-never-order/description/
Table: Customers
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| name | varchar |
+-------------+---------+
id is the primary key (column with unique values) for this table.
Each row of this table indicates the ID and name of a customer.
Table: Orders
+-------------+------+
| Column Name | Type |
+-------------+------+
| id | int |
| customerId | int |
+-------------+------+
id is the primary key (column with unique values) for this table.
customerId is a foreign key (reference columns) of the ID from the Customers table.
Each row of this table indicates the ID of an order and the ID of the customer who ordered it.
Write a solution to find all customers who never order anything.
Return the result table in any order.
The result format is in the following example.
Example 1:
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 |
+-----------+
풀이 접근
1. customers 테이블을 왼쪽에 두고 left join
2. customerId is a foreign key (reference columns) of the ID from the Customers table >> Customers테이블의 id가 Orders테이블의 customersId와 같음
+) foreign key는 '참조 열'이라는 뜻
3. customers라는 새 칼럼 지정 >> as 사용
4. 한번도 order하지 않은거니까 is null 사용
5. 테이블 별칭 사용 >> aliases
최종 코드
SELECT Customers.name AS Customers
FROM Customers AS c
LEFT JOIN Orders AS o ON c.id = o.customerId
WHERE customerId IS NULL
'SQL' 카테고리의 다른 글
프로그래머스 SQL - 상품 별 오프라인 매출 구하기(Lv.2) (0) | 2024.10.11 |
---|---|
UNION/UNION ALL/FULL OUTER JOIN (+해커랭크 예제) (0) | 2024.10.10 |
INNER JOIN (+ 해커랭크 예제) (1) | 2024.10.10 |
프로그래머스 SQL - 평균 일일 대여 요금 구하기/재구매가 일어난 상품과 회원 리스트 구하기 (3) | 2024.10.09 |
GROUP BY/HAVING (+해커랭크 예제) (0) | 2024.10.09 |