SQL, 데이터 분석!

SQL, 데이터 분석!

바로 보고 실습하는 SQL, 입문부터 활용까지!

17 그룹 필터링과 정렬(HAVING, ORDER BY, LIMIT)

# 그룹 필터링과 정렬 ## 미션 --- 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) #### 🔥 장바구니에 담긴 것과 배송이 완료된 것을 구분하여, 모든 문제를 다시 푸시오.