본문 바로가기
[IT 서비스기획 공부]

기획자의 SQL 맛보기(5) HAVING, ORDER BY

by 수제팥앙금 2024. 1. 23.

 

안녕하세요, 오늘도 기획자 팥씨입니다. 🥮

SQL 맛보기 5탄은, HAVING과 ORDER BY 입니다.

 

 

 

 

 

1. Having

  • Where = 테이블 자체에 필터를 거는 것. "테이블을 축소시킴. 테이블이 바뀜"
  • Having = 뽑아온 결과물에 필터를 걸어줌. 
    • Group by 한 그룹함수 결과에 대해서 --> 조건을 적용하는 경우 !
    • Group by 절 뒤에 작성함.
    • Where 구에서는 그룹함수가 포함된 조건은 사용 불가.

 

1-1. 데이터 조회 순서

  1. FROM - 어느 테이블로부터 가지고 와
  2. WHERE - 테이블에서 어떤 기준으로 필터를 걸지?
  3. GROUP BY - 어떤 칼럼을 기준으로 그룹화를 만들지? (~별)
  4. HAVING - 어떤 기준을 충족하는 그룹이지?
  5. SELECT - 어떤 컬럼을 최종 산출하지?

*WHERE이 GROUP BY 보다 먼저 조회되기 때문에, WHERE은 어떤 그룹으로 나뉠 건지 알 수 없다.

*WHERE 말고 HAVING이 따로 존재하는 이유.

 

1-2. 연습하기 | 예제 7

 

"CO_ORDER_ITEMS 사용해서 상품 ID당 주문 지표 (주문 수, 총 상품수량, 총 금액, 주문건당 거래액) 확인하고,

주문건당 평균 거래액이 100이상인 상품 ID 확인하기"

 

예제7 같이풀기
*총금액 = 주문 수 X 상품 수량 곱 !!
SELECT 
PRODUCT_ID,
--주문 수
count (distinct order_id) as order_cnt,
--총 상품수량
sum(quantity) as sum_quan,
--총 금액
sum(unit_price*quantity) as total_price,
--주문건당 거래액
sum(unit_price*quantity)/count(distinct order_id) as price_by_ord,

FROM `ls-data-literacy-410915.database.co_order_items`
group by PRODUCT_ID

--주문건당 평균 거래액이 100이상인 상품 ID 확인하기
having sum(unit_price*quantity)/count(distinct order_id) >= 100
--원칙상 별칭은 having에서 사용안됨 (아직 별칭 정의안됨 - 데이터 조회 순서에 따라)

 

2. ORDER BY | ~의 순서대로

| 나열하느라 데이터 과부하 걸릴 수 있음...ㅜ 추천하지는 않음. 구글스프레드시트에서 쓰는 것 추천

  • 테이블을 특정 컬럼의 값을 기준으로 정렬하기 위한 구문
  • 여러 개의 칼럼을 기준으로 정렬할 수 있음 (1. 단일칼럼 2. 복수 칼럼 모두 정렬 가능)
    • 1. order by 컬럼 1 asc (desc)
    • 2. order by 컬럼 1 asc, 컬럼 2 desc
  • 기본 정렬 값은 ASC (오름차순)으로, 별도 명시할 필요 없음
  • 모든 데이터를 산출한 후 마지막으로 데이터 정렬 > 리소스 많이 잡아먹는 편
  • 컬럼명이 아닌 SELECT 구문상에서 컬럼 순서로 작성 가능
ASC?DESC?

- ascending

  • 오르는, 상승적인; 위를 향한 [컴퓨터] 오름차순의

- descending

  • 내려가는, 강하하는, 하향의; [컴퓨터] 내림차순의

 

2-1. 데이터 조회 순서

SELECT까지 이루어진 다음에 --> 마지막에 순서대로 나열함.SELECT 뒤의 N번째 열을 기준으로 나열해줘. (기본값은 오름차순)

 

  1. FROM - 어느 테이블로부터 가지고 와
  2. WHERE - 테이블에서 어떤 기준으로 필터를 걸지?
  3. GROUP BY - 어떤 칼럼을 기준으로 그룹화를 만들지? (~별)
  4. HAVING - 어떤 기준을 충족하는 그룹이지?
  5. SELECT - 어떤 컬럼을 최종 산출하지?
  6. ORDER BY - 검색결과를 무슨 기준으로 나열하지?

 

 

2-2 연습하기 | 예제 8

 

"CO_ORDER-ITEM 사용해서 상품 ID당 주문지표 (주문수, 총 상품수량, 총금액, 주문건당 거래액) 확인하고,

주문건당 평균 거래액 상위 3개 확인하기"

 

예제8 같이풀기
SELECT 
PRODUCT_ID,
--주문 수
count (distinct order_id) as order_cnt,
--총 상품수량
sum(quantity) as sum_quan,
--총 금액
sum(unit_price*quantity) as total_price,
--주문건당 거래액
sum(unit_price*quantity)/count(distinct order_id) as price_by_ord,

FROM `ls-data-literacy-410915.database.co_order_items`
group by PRODUCT_ID

--order by는 select 뒤에 읽히기 때문에 별칭 써도 됨.
order by price_by_ord desc
limit 3

 

내림차순 desc, 상위 3개만 보고 싶으므로 limit 3

 

3. 오늘의 팥앙금🥮

  • select와 from은 필수 구문, 그 외에는 선택구문이다. 
  • 테이블 자체를 줄인다면 WHERE, 산출된 결과물에서 데이터를 뽑는다면 HAVING 이다.
  • 별칭까지 마무리된 결과를 단순 순서만 변경한다면 ORDER BY 로 오름차순/내림차순 설정하면 된다.