아래는 기본적인 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";
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";
3. RIGHT JOIN: 오른쪽 테이블 기준!
- LEFT JOIN과 똑같이 작동되며, 기준이 되는 테이블만 오른쪽 테이블로 변경
SELECT *
FROM Customers
RIGHT JOIN Orders ON Customers."CustomerID"=Orders."CustomerID";
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";
아래는 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; # 내림차순
'문돌이 존버 > DB 및 SQL 스터디' 카테고리의 다른 글
Postgresql function, as keyword, typecasting 사용하기 (0) | 2021.02.09 |
---|---|
Neo4j import csv & create node (0) | 2021.02.07 |
Neo4j 그래프 DB 개념 및 cyper 쿼리 예제 (0) | 2021.02.07 |
Postgresql 기본키 auto_increment 및 테이블 수정 (0) | 2021.02.04 |
윈도우 terminal 및 파이썬 MySQL DB 생성, 데이터 입력 (0) | 2021.01.21 |