SELECT -- 6: 최종 결과 테이블에서 원하는 것만 조회!
...
FROM -- 1: 대상 테이블에
...
JOIN -- 2: 추가 테이블을 붙인 뒤,
...
WHERE -- 3: 원하는 조건으로 필터링!
...
GROUP BY -- 4: 이어서 그룹 별로 분류한 다음,
....
HAVING -- 5: 특정 조건으로 원하는 그룹을 선별!
...
;
💡 WHERE절과 HAVING절의 차이점
WHERE절은 일반 레코드를 필터링하지만 HAVING절은 그룹화된 레코드만 필터링함!
--
📑 결제(payments) 테이블에서 수단별 평균 결제 금액이 다음과 같을 때, 평균 결제금액이 36,000원 이상인 것만 조회하시오.
-- 36000이상인 결제 수단 조회!
SELECT
PTYPE AS "결제수단",
ROUND(AVG(AMOUNT),2) AS "평균 결제금액"
FROM
PAYMENTS
GROUP BY
PTYPE
HAVING -- 그룹 필터링 : 그룹화된 것들을 조건으로 선별!
AVG(AMOUNT) >= 36000
;
📑 다음 쿼리는 상품명과 가격을 기준으로, 누적 판매정보를 조회한다. 이를 참고하여 주어진 문제를 푸시오.
-- 상품 이름과 가격을 기준으로, 누적 판매정보(판매량, 매출)를 조회
SELECT -- 4
products.name AS "상품명",
products.price AS "가격",
SUM(order_details.count) AS "누적 판매량",
SUM(products.price * order_details.count) AS "누적 매출"
FROM -- 1
products
LEFT JOIN order_details ON -- 2
order_details.product_id = products.id
GROUP BY -- 3
products.name,
products.price
;
-- 누적 매출이 35,000원 이상인 상품을 조회하시오.
SELECT -- 4
products.name AS "상품명",
products.price AS "가격",
SUM(order_details.count) AS "누적 판매량",
SUM(products.price * order_details.count) AS "누적 매출"
FROM -- 1
products
LEFT JOIN order_details ON -- 2
order_details.product_id = products.id
GROUP BY -- 3
products.name,
products.price
HAVING
SUM(products.price * order_details.count) >= 35000
;
-- 누적 매출이 2만원 이상이면서, 누적 판매량도 10개 이상인 상품을 조회
SELECT -- 4
products.name AS "상품명",
products.price AS "가격",
SUM(order_details.count) AS "누적 판매량",
SUM(products.price * order_details.count) AS "누적 매출"
FROM -- 1
products
LEFT JOIN order_details ON -- 2
order_details.product_id = products.id
GROUP BY -- 3
products.name,
products.price
HAVING
SUM(products.price * order_details.count) >= 20000
AND
SUM(order_details.count) >= 10
;
-- 누적 매출이 없는 제품을, 가격을 기준으로 오름차순 정렬하여 조회
SELECT -- 4
products.name AS "상품명",
products.price AS "가격",
SUM(order_details.count) AS "누적 판매량",
SUM(products.price * order_details.count) AS "누적 매출"
FROM -- 1
products
LEFT JOIN order_details ON -- 2
order_details.product_id = products.id
GROUP BY -- 3
products.name,
products.price
HAVING
SUM(products.price * order_details.count) IS Null
ORDER BY
products.price
;
-- 누적 매출 상위 5개 상품을 조회
SELECT -- 5
products.name AS "상품명",
products.price AS "가격",
SUM(order_details.count) AS "누적 판매량",
SUM(products.price * order_details.count) AS "누적 매출"
FROM -- 1
products
LEFT JOIN order_details ON -- 2
order_details.product_id = products.id
GROUP BY -- 3
products.name,
products.price
HAVING -- 4
SUM(products.price * order_details.count) IS NOT NULL
ORDER BY -- 6
"누적 매출" DESC -- 내림차순
LIMIT -- 6
5
;