본문 바로가기
[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 확인하기"

     

    더보기
    *총금액 = 주문 수 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 구문상에서 컬럼 순서로 작성 가능
    더보기

    - 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개 확인하기"

     

    더보기
    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 로 오름차순/내림차순 설정하면 된다.