# 그룹 필터링과 정렬
## 미션
---
HAVING, ORDER BY, LIMIT을 활용하여 [마켓컬리 DB](https://cloudstudying.kr/lectures/510) 관련 문제를푸시오.
#### DB 구조도
![홍팍-SQL-마켓-컬리-DB-스키마-예](http://drive.google.com/thumbnail?export=view&sz=w960&id=1YGLGqFe1UIt2INNEtw4Lnzcws6L5vILV)
## 개념
---
#### 그룹화와 함께 자주 사용되는 구문들
우리는 앞서 GROUP BY로 데이터를 분류해보았다. 더 상세한 분류 및 분석을 위해 다음 3가지 구문을 익혀보자.
![홍팍-SQL-HAVING-ORDER_BY-LIMIT](http://drive.google.com/thumbnail?export=view&sz=w960&id=1Z54_Gr2eoNP8OHM7MrIsUf7zVLrwqJCt)
#### HAVING, 그룹 필터링하기
분류된 그룹 중, 특정 조건을 만족하는 것만 가져오려면 어떻게 해야 할까? HAVING 절을 사용하면 된다.
![홍팍-SQL-HAVING-절-그룹-필터링](http://drive.google.com/thumbnail?export=view&sz=w960&id=1Z5wqJneZqHjwYMagkD8LIZYrwYovWJBA)
HAVING 절은 그룹 필터링을 수행한다. GROUP BY 절로 분류된 것들 중 원하는 그룹을 선별한다.
```
SELECT -- 6: 최종 결과 테이블에서 원하는 것만 조회!
...
FROM -- 1: 대상 테이블에
...
JOIN -- 2: 추가 테이블을 붙인 뒤,
...
WHERE -- 3: 원하는 조건으로 필터링!
...
GROUP BY -- 4: 이어서 그룹 별로 분류한 다음,
....
HAVING -- 5: 특정 조건으로 원하는 그룹을 선별!
...
;
```
#### ORDER BY, 정렬하기
정렬은 중요하다. 데이터가 정렬돼있어야 정보가 한눈에 들어오기 때문. 그렇다면 데이터 정렬은 어떻게 할까? ORDER BY 절을 사용하면 된다.
![홍팍-SQL-ORDER_BY-절-정렬](http://drive.google.com/thumbnail?export=view&sz=w960&id=1Z8EDxutjbWPEgQTkuEKkhaIPAjJgn4a3)
ORDER BY는 결과를 특정 기준으로 정렬한다. SELECT 절 이후에 수행되며, 오름차순은 ASC, 내림 차순은 DESC를 적는다.
```
SELECT -- 6: 최종 결과 테이블에서 원하는 것만 조회!
...
FROM -- 1: 대상 테이블에
...
JOIN -- 2: 추가 테이블을 붙인 뒤,
...
WHERE -- 3: 원하는 조건으로 필터링!
...
GROUP BY -- 4: 이어서 그룹 별로 분류한 다음,
....
HAVING -- 5: 특정 조건으로 원하는 그룹을 선별!
...
ORDER BY -- 7: 특정 컬럼을 기준으로 정렬(ASC: 오름차순, DESC: 내림차순)
some_column ASC
;
```
#### LIMIT, 조회 갯수 제한하기
정렬과 함께 자주 쓰이는 문법으로 LIMIT이 있다. 가져올 레코드 수를 제한하는 문법이다. 데이터를 한꺼번에 가져오기 어렵거나, 특정 일부분(BEST 3, WORST 5, ...)만 가져올 때 좋다.
![홍팍-SQL-LIMIT-조회-갯수-제한](http://drive.google.com/thumbnail?export=view&sz=w960&id=1Z8M2hHidT53VrEWYse3qjWCdNjJ3HlD2)
LIMIT 절은 ORDER BY 이후에 수행된다.
```
SELECT -- 6: 최종 결과 테이블에서 원하는 것만 조회!
...
FROM -- 1: 대상 테이블에
...
JOIN -- 2: 추가 테이블을 붙인 뒤,
...
WHERE -- 3: 원하는 조건으로 필터링!
...
GROUP BY -- 4: 이어서 그룹 별로 분류한 다음,
....
HAVING -- 5: 특정 조건으로 원하는 그룹을 선별!
...
ORDER BY -- 7: 특정 컬럼을 기준으로 정렬(ASC: 오름차순, DESC: 내림차순)
some_column ASC
LIMIT -- 8: 가져올 데이터 수 지정(5개)
5
;
```
## 실습
---
#### 1. 결제(payments) 테이블에서 수단별 평균 결제 금액이 다음과 같을 때, 평균 결제금액이 36,000원 이상인 것만 조회하시오.
![홍팍-SQL-HAVING-예제-실습1](http://drive.google.com/thumbnail?export=view&sz=w960&id=1Z9uEun9RdDr4FWX8_KkcsPFAZOvq0qls)
#### 2. 다음 쿼리는 상품명과 가격을 기준으로, 누적 판매정보를 조회한다. 이를 참고하여 주어진 문제를 푸시오.
```
-- 상품 이름과 가격을 기준으로, 누적 판매정보(판매량, 매출)를 조회
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
;
```
(a) 누적 매출이 35,000원 이상인 상품을 조회하시오.
![홍팍-SQL-HAVING-예제-실습2](http://drive.google.com/thumbnail?export=view&sz=w960&id=1ZDN9PEIEMRh2OJCfLvVi0lUEH8KsbvlF)
(b) 누적 매출이 2만원 이상이면서, 누적 판매량도 10개 이상인 상품을 조회하시오.
![홍팍-SQL-HAVING-예제-실습3](http://drive.google.com/thumbnail?export=view&sz=w960&id=1ZFY5UmMmjiz_NhqNM6BJA6fLgYFaQ7UD)
(c) 누적 매출이 없는 제품을, 가격을 기준으로 오름차순 정렬하여 조회하시오.
![홍팍-SQL-HAVING-ORDER_BY-예제-실습4](http://drive.google.com/thumbnail?export=view&sz=w960&id=1ZIkG6btdK4ipD8mzqQ6f4XgmyccVk2Gj)
(d) 누적 매출 상위 5개 상품을 조회하시오.
![홍팍-SQL-HAVING-ORDER_BY-LIMIT-예제-실습5](http://drive.google.com/thumbnail?export=view&sz=w960&id=1ZLhvSmmCVUGGgWa1rnrJdpPiXhcAm0ot)
## 훈련
---
#### 🔥 누적 판매량 상위 5개 상품을 조회하시오.
![홍팍-SQL-HAVING-ORDER_BY-LIMIT-훈련1](http://drive.google.com/thumbnail?export=view&sz=w960&id=1ZNh2pG_M5FdLjAnUq4yKfzMKD9K9AAYb)
#### 🔥 가격 하위 5개 상품의 누적 매출을 조회하시오.
![홍팍-SQL-HAVING-ORDER_BY-LIMIT-훈련2](http://drive.google.com/thumbnail?export=view&sz=w960&id=1ZRYTiQpC_XDoq2ypBR71TgntEWZhvmJh)
#### 🔥 장바구니에 담긴 것과 배송이 완료된 것을 구분하여, 모든 문제를 다시 푸시오.