본문 바로가기

문돌이 존버/DB 및 SQL 스터디

Postgresql 테이블 Join, Group by 사용법

반응형

아래는 기본적인 WHERE, AND, ORDER BY 조합의 쿼리문입니다. AND는 조건절을 추가하는 것으로 얼마든지 추가할 수 있습니다. 

SELECT "CustomerID", "OrderDate"
FROM Orders
WHERE "ShipCountry" = 'France' # AND "ShippedDate" = '1996-07-17'
ORDER BY "OrderDate";

1. INNER JOIN: 테이블 간 교집합! 

- Customer 테이블의 각 튜블에 대해 CustomerID 필드값을 Orders 테이블의 모든 튜플에 있는 CustomerID 필드값을 비교
- 값이 같은 경우 두 테이블의 모든 필드를 포함하는 튜플 리턴 

쉽게 말해, 고객 A가 상품 'ABC'를 주문했다고 가정해보면 고객 테이블에 A 정보가, 주문 테이블에 ABC 정보 + 이를 주문한 고객 A가 저장될 것이다. 이때 고객 테이블과 주문 테이블에 있는 고객 A의 모든 정보를 가져오는 것이다. 

SELECT * 
FROM Customers
INNER JOIN Orders ON Customers."CustomerID"=Orders."CustomerID";

<830 rows 생성>

2. LEFT JOIN: 왼쪽 테이블 기준!

- Customer 테이블을 기준으로 CustomerID 필드값을 Orders 테이블의 CustomerID 필드값과 비교
- 값이 같은 경우 두 테이블의 모든 필드를 포함하는 튜플 리턴
- 값이 다른 경우 Customer 테이블의 필드는 포함하고, Orders 테이블의 필드값은 Null로 채워 표시 

INNER JOIN은 두 테이블의 공통 부분만 가져와서 표시했다면, LEFT JOIN은 왼쪽 테이블이 기준이 된다. 일단 왼쪽 테이블의 모든 정보는 다 표시한다고 생각하면 된다. 

만약 고객 테이블에 있는 고객 B가 아무 상품도 주문하지 않았다면 주문 테이블에는 고객 B 정보가 없을 것이다. 이때 고객 B의 기본 정보는 나타내되, 주문 내역이 없기 때문에 주문 테이블의 필드값은 존재하지 않는다. 

SELECT *
FROM Customers
LEFT JOIN Orders ON Customers."CustomerID"=Orders."CustomerID";

<832 rows 생성>

3. RIGHT JOIN: 오른쪽 테이블 기준!

- LEFT JOIN과 똑같이 작동되며, 기준이 되는 테이블만 오른쪽 테이블로 변경
SELECT *
FROM Customers
RIGHT JOIN Orders ON Customers."CustomerID"=Orders."CustomerID";

<830 rows 생성>

4. FULL JOIN: 테이블 합집합!

- Customer 테이블 모든 튜플의 CustomerID 필드값과 Orders 테이블 CustomerID 필드값과 비교
- 값이 같은 경우 두 테이블의 모든 필드를 포함하는 튜플 리턴
- 값이 다른 경우 Customer 테이블의 필드는 포함하고, Orders 테이블의 필드값은 Null로 채워 표시 
- Orders 테이블 모든 튜플의 CustomerID 필드값과 Customer 테이블 CustomerID 필드값과 비교
- 값이 다른 경우 Orders 테이블의 필드는 포함하고, Customers 테이블의 필드값은 Null로 채워 표시

간단히 말해 FULL JOIN은 LEFT JOIN과 RIGHT JOIN을 합친 결과라고 볼 수 있다. 왼쪽 테이블을 기준으로 살펴보고 값이 같은 경우와 다른 경우 모두 표시했기 때문에 오른쪽 테이블을 기준으로 살펴볼 땐 값이 다른 경우만 보면 된다. 

SELECT *
FROM Customers
FULL JOIN Orders ON Customers."CustomerID"=Orders."CustomerID";

<832 rows 생성>


아래는 Group by 명령어를 사용해본 쿼리문입니다. Products 테이블의 ProductName을 기준으로 나머지 필드들을 그룹화시킵니다. 예를 들어, 고객 A, B, C, D 총 4명이 "엄마손쿠키"를 주문했고, "엄마손쿠키"의 개당 가격은 1,000원이라 한다면 Group by "엄마손쿠키"를 했을 때 SUM(엄마손쿠키 가격)은 4,000원이 됩니다. 

Order_Details 테이블의 UnitPrice 필드값은 상품의 가격이겠죠. "엄마손쿠키"가 10번 주문되었다면, Order_Details 테이블에는 10개의 rows가 생성되고, 이들을 "엄마손쿠키"로 그룹화해주면 총 얼마를 벌었는지 알 수 있습니다. 

SELECT "ProductName", SUM(Order_Details."UnitPrice")
FROM Order_Details
JOIN Products ON Order_Details."ProductID"=Products."ProductID"
GROUP BY Products."ProductName"
ORDER BY SUM(Order_Details."UnitPrice") desc; # 내림차순

728x90
반응형