[SQL] 표준 SQL의 조인 연산 - WHERE절 조인
2023. 9. 1. 05:18ㆍDATA 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까지 넣어주었다. 각각의 임시테이블에서 원하는 값을 구한 뒤, 조인을 통해 두 테이블을 합쳐서 원하는 결과를 얻을 수 있었다.
'DATA PROGRAMMING > SQL' 카테고리의 다른 글
[SQL] 윈도우 함수 총정리 (0) | 2023.09.04 |
---|---|
[SQL] 표준 SQL의 조인 연산 - FROM절 JOIN, 재귀 JOIN (0) | 2023.09.02 |
[SQL] sql tip - count함수를 활용하여 NULL값 처리하기 (0) | 2023.09.01 |
[SQL] DML 다중 테이블 검색문 - 집합 연산자 (0) | 2023.08.31 |
SQL 반정규화 정리 (0) | 2023.08.31 |