[SQL] 표준 SQL의 조인 연산 - WHERE절 조인

2023. 9. 1. 05:18DATA PROGRAMMING/SQL

표준 SQL에서는 WHERE절 조인과 FROM절 조인을 사용한다. 조인연산은 '관계형데이터베이스'를 다룰 때 핵식적인 역할을 하는 개념이기 때문에 더 주의 깊게 공부를 해야겠다는 생각이 든다.

 

표준 SQL 조인

 

WHERE절 조인

기본적으로 where절 조인에서는 INNER JOIN만 가능하다.

 

예제1

SELECT o.orderNo, o.status, count(d.orderNo) '상품수', sum(d.priceEach*d.quantity)
FROM s_orders o, s_orderdetails d
WHERE o.orderNo = d.orderNo AND o.status <> 'Cancelled'
GROUP BY d.orderNo
ORDER BY count(d.orderNo) DESC, sum(d.priceEach*d.quantity) DESC;

 

 

예제2

SELECT o.orderNo, COUNT(d.productCode) AS '상품수', p.productLine
FROM s_orders o, s_orderdetails d, s_products p
WHERE o.orderNo = d.orderNo
AND d.productCode = p.productCode
GROUP BY o.orderNo
HAVING COUNT(d.productCode) > 1 AND COUNT(DISTINCT p.productLine) = 1
ORDER BY COUNT(d.productCode) DESC, o.orderNo ASC;

예제 2에서 포인트는 '한 종류의 상품라인에 속하는 상품만으로 구성된 주문을 검색하세요.'이 부분을 보고 어떤 칼럼을 기준으로 GROUP BY할지 정해주는 것이다. 이에 orderNo(상품번호)별로 GROUP BY를 하고 그에 대한 상품라인을 count한다면, 해당 조건을 쉽게 처리할 수 있다. WHERE 절 조인은 여러 테이블에 저장되어 있는 연결된 칼럼을 조건에서 활용하고 싶을 때 쓸 수 있다.

 

 

 

예제3

 

WITH orderTotal AS
(
	SELECT O.customerId, SUM(D.quantity * D.priceEach) AS 총주문액
	FROM s_orders O, s_orderDetails D
	WHERE O.orderNo = D.orderNo
	GROUP BY O.customerId
),
paymentTotal AS
(
	SELECT C.customerId, SUM(P.amount) AS 총결재액
	FROM s_customers C, s_payments P
	WHERE C.customerId = P.customerId
	GROUP BY C.customerId
)
SELECT PT.customerId, C.name, OT.총주문액, PT.총결재액
FROM orderTotal OT, paymentTotal PT, s_customers C
WHERE OT.customerId = PT.customerId
AND PT.customerId = C.customerId
AND OT.총주문액 = PT.총결재액
ORDER BY PT.customerId;

처음 이 문제를 시도할 때는 네 개의 테이블을 모두 조인한 후 한꺼번에 계산을 하려 했으나, 총 주문액과 총 결재액이 전혀 다른 계산이다 보니 그렇게 할 수가 없었다. 이에 필요한 네개의 테이블들중 총 주문액과 총 결재액을 구할 수 있는 두 개의 테이블로 각각 나누어 임시 테이블을 만들어 주었고, 이 두 임시테이블을 조인하기 위해서 공통 칼럼인 customer Id까지 넣어주었다. 각각의 임시테이블에서 원하는 값을 구한 뒤, 조인을 통해 두 테이블을 합쳐서 원하는 결과를 얻을 수 있었다.