GROUP BY & HAVING & ORDER BY 간단 정리

3944 단어 sqlTILTIL

어제에 이어 데이터 분석을 위해 알아야 할 쿼리 명령어를 쉽게 간단 정리해보자.

GROUP BY, HAVING, ORDER BY는 "선택 구문"이다.

순서
1. GROUP BY 구
2. HAVING 구
3. ORDER BY 구
4. 가상 연습문제로 이해 체크 (난이도 하)


1. GROUP BY 구

  • 데이터를 특정 컬럼 기준으로 그룹화시키는 명령어
    EX) 연령별 평균 매출액 → 연령별로 그룹화
  • 그룹을 나누고 다시 그 그룹 안에서 세부그룹으로 나눌 수 있다
    • GROUP BY COL1, COL2 ⇒ COL1안에서 다시 COL2로 나누기 가능
      EX) 연령별 성별 평균 매출액 → 연령별로 먼저 그룹, 다음 성별로 그룹
  • 각 그룹에 대한 연산 결과(합, 평균, 갯수 등)를 산출하기 위해서는 집계함수가 필요
  • GROUP BY 구에 있는 컬럼은 반드시 SELECT 절에도 존재해야 한다
  • GROUP BY 구에도 다양한 함수 사용 가능하다 (SUBSTR, INSTR 등등..)

📌 그룹함수

  • 하나 이상의 행을 그룹으로 묶어 연산하기 위한 함수
  • GROUP BY 기준으로 나눠진 각 그룹을 연산하는 역할
  • COUNT 함수를 제외한 나머지 그룹함수는 NULL 값 제외하고 계산! (COUNT는 NULL을 포함)
함수종류정의참고
COUNT'행'의 개수데이터 NULL인 경우도 COUNT
SUM합계NULL 값 제외하고 연산
AVG평균NULL 값 제외하고 연산. BUT, NULL값 포함해 평균 계산하고 싶다면 NULL을 0으로 채워줘야 함
MAX최댓값NULL 값 제외하고 연산
MIN최솟값NULL 값 제외하고 연산
STDDEV표준편차NULL 값 제외하고 연산
VARIANCE분산NULL 값 제외하고 연산

2. HAVING 구

  • GROUP BY 절에 대한 조건을 걸고 싶을 때 사용하는 명령어
  • 그룹화 된 결과에 조건을 걸어주는 역할
  • HAVING 뒤에는 SELECT 구문에서 사용하는 AS 별칭 사용 불가

WHERE절과 헷갈리지 않게 조심하기

  • 처음부터 테이블 자체에 조건을 걸고 싶다면? → WHERE 절
  • 그룹별로 묶인 컬럼에 조건을 걸고 싶다면? → HAVING 절

3. ORDER BY

  • 테이블을 특정 컬럼값을 기준으로 정렬하기 위한 명령어
  • 즉, '정렬'의 역할
  • 여러개 컬럼을 기준으로 정렬 가능
    ex) ORDER BY COL1, COL2...
  • 기본 정렬값은 ASC(오름차순)로 설정되어있으므로 오름차순 정렬시에는 입력 필요 X, 내림차순의 경우 DESC
  • SELECT절의 컬럼 순서 혹은 별칭으로도 정렬 가능
    ex) ORDER BY 1, 2,...

4. 연습문제로 이해 체크!

Q. ORDERS라는 테이블에서 2021년의 데이터만 추려내어 각 월의 카테고리별 주문금액이 10000원 이상인 경우를 찾아 월, 카테고리, 총주문금액을 산출하고 날짜별로 정렬해보아라.
(orders라는 테이블이 있다고 가정)

SELECT MONTH(ORDER_DATE) AS, CATEGORY, SUM(UNIT_PRICE) AS 총주문금액
FROM ORDERS
WHERE ORDER_DATE >= '2021-01-01'
GROUP BY MONTH(ORDER_DATE), CATEGORY
HAVING SUM(UNIT_PRICE) >= 10000
ORDER BY 1;

이 정도의 구만 알고 있어도 몇 번 연습하다보면 간단한 분석은 가능하다. 여기서 더해서 이제 sql의 꽃이라고 불리는 join과 서브쿼리 등을 곁들인다면 매우 다양한 분석을 할 수 있다.
그만큼 복잡하기도 하지만 본격적이라 개인적으로 공부하면서 재미를 느꼈었다.

좋은 웹페이지 즐겨찾기