[SQL] 데이터 분석, 활용 _ 필터링과 정렬

강지영·2023년 2월 21일
0

📚 HAVING

  • 분류된 그룹들 중 특정 그룹만 가져오는 것
    ex ) 다음 도형들을 분류하고 개수가 3개 이상인 것

    📌 HAVING절 순서
SELECT   -- 6: 최종 결과 테이블에서 원하는 것만 조회!
  ...
FROM     -- 1: 대상 테이블에
  ...
JOIN     -- 2: 추가 테이블을 붙인 뒤,
  ...
WHERE    -- 3: 원하는 조건으로 필터링!
  ...
GROUP BY -- 4: 이어서 그룹 별로 분류한 다음,
  ....
HAVING   -- 5: 특정 조건으로 원하는 그룹을 선별!
  ...
;

💡 WHERE절과 HAVING절의 차이점

WHERE절은 일반 레코드를 필터링하지만 HAVING절은 그룹화된 레코드만 필터링함!


📚 ORDER BY

  • 결과를 정렬하는 문법
  • 정렬 기준을 잡고 오름차순 ASE, 내림차순은 DESC

📚 LIMIT

  • 가져온 레코드의 개수를 제한하는 구문
  • 데이터가 너무 많아서 가져오기 힘들다거나 일부 몇 개만 가져오고 싶을 때 사용

--

실습

📑 결제(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원 이상인 상품을 조회하시오.
-- 누적 매출이 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개 이상인 상품을 조회하시오.
-- 누적 매출이 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
;
  • 누적 매출이 없는 제품을, 가격을 기준으로 오름차순 정렬하여 조회하시오.
    📌 Null값을 비교할 때는 IS를 사용한다
-- 누적 매출이 없는 제품을, 가격을 기준으로 오름차순 정렬하여 조회
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개 상품을 조회하시오.
-- 누적 매출 상위 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
;
profile
Hello World!

0개의 댓글