0. Group by절과 집계함수의 연관성
Group by절을 사용하는 이유는 카테고리 별로 데이터들을 모아보고 싶기 때문일 것이다.
그런데 Group by로 카테고리를 묶게되면 필연적으로 해당 카테고리에 속했던 데이터의 값들도 합해질 수밖에 없다.
이 데이터의 값들을 합할 때(집계할 때) 우리는 각 값을 셀 건지, 더할 건지, 평균을 낼 건지 정해야 한다.
이 때 집계함수 COUNT, SUM, AVG, MIN, MAX함수 등이 사용된다.
※ 단, Group by절을 사용할 때 집계함수가 쓰이는 것은 맞지만, 집계함수가 꼭 Group by가 있을 때만 쓰이는 것은 아님!
Group by절과 집계함수는 쿼리문에서 어떻게 이용되는지 좀 더 자세히 알아보자.
1. Group By
▶ Group by절의 기본 구조
SELECT 카테고리컬럼(원하는컬럼 아무거나),
집계함수(계산 컬럼)
FROM 테이블명
WHERE 조건식
Group By 카테고리컬럼(원하는컬럼 아무거나)
Having 그룹조건식
▶ Group by절 / 집계함수/ Having절 사용법 및 참고사항
Group by절
- Group by절로 카테고리 별 기준을 정한 뒤, SELECT절에서 기준이 된 컬럼과 집계함수 적용된 값 조회.
- Group by 뒤에 컬럼명을 다 적을 수도 있지만 Group by 1, 2 로 적을 수도 있음.
- 여기서 1, 2의 의미는 SELECT절의 첫 번째 컬럼과 두 번째 컬럼을 기준으로 그룹화할 것이라는 의미
- 1 이렇게 하나만 적어도 됨. 그럼 SELECT절의 첫 번째 컬럼을 기준으로 그룹화할 것이라는 의미
집계 함수
- 집계함수는 WHERE절에 올 수 없음. 집계함수의 특성 상 여러 행의 데이터 값을 하나의 값으로 모아주기 때문에 WHERE절 조건에서 집계함수를 써버리면 SELECT문에서 조회할 데이터가 마땅히 없음.
- [참고 사이트] https://velog.io/@tolerance/TIL-WHERE-%EC%A0%88%EA%B3%BC-%EC%A7%91%EA%B3%84%ED%95%A8%EC%88%98-%EA%B7%B8%EB%9F%B0-%EA%B1%B0-%EC%97%86%EC%9D%8C
- 또 쿼리문 시행 순서 상 Group by절보다 WHERE절이 먼저 수행되기 때문에 집계함수를 사용할 수 있는 Group by절이 전체 데이터를 그룹으로 나누기도 전에 WHERE절이 (자신의 조건에 따라) 행들을 미리 제거해버림.
- Group by로 그룹화 된 데이터에 조건을 주고 싶으면 Having절에 집계함수 사용 가능. Having절에서는 집계함수를 사용할 수 있음.
- 집계함수의 통계 정보는 NULL 값을 가진 행을 제외하고 수행함.
예를 들어 ,
학생 | 점수 |
A | 55 |
B | 75 |
C | NULL |
여기서 학생 A, B, C의 점수 값 평균(AVG함수)을 구하면,
① (55 + 75 + ?) / 3
② (55 + 75) / 2
둘 중에 정답은..?!?!
이미 위에 설명해놨지만 정답은.... 페이지 마지막에 (^-^)b
Having절
- Group by절의 뒤에 위치하며, Group by로 [이미 그룹화되어 집계된 데이터]에 대한 조건을 걸 때 사용.
2. 실습 문제
2-1) 음식 종류 별 주문 금액 합계
- 컬럼명: cuisine_type(음식 타입)과 price(주문 금액) 이용
▶ cuisine_type(음식 타입) 별로 그룹화한 뒤 각 카테고리 안의 주문 금액 값들을 다 더해줌.
SELECT cuisine_type ,
sum(price)
FROM food_orders fo
Group By cuisine_type
2-2) 음식점별 주문 금액 최댓값 조회하기
▶ cuisine_type(음식 타입) 별로 그룹화한 뒤 각 카테고리 안의 주문 금액 값들 중 최댓값을 조회함.
SELECT cuisine_type ,
MAX(price)
FROM food_orders fo
Group By cuisine_type
2-3) 결제 타입별 가장 최근 결제일 조회하기
- 컬럼명: pay_type(결제 타입)과 date(날짜) 이용
▶ pay_type(결제 타입) 별로 그룹화한 뒤 각 카테고리 안의 날짜들 중 가장 최근날짜를 조회함.
: 가장 최근 날짜를 구하려면 MAX 함수를 이용해야 함. 시간이 지날수록 날짜는 점점 커지기 때문이라고 생각하자. 2023년, 2024년, 2025년 ... 2099년 (? 급발진)
SELECT pay_type ,
MAX(date)
FROM payments p
Group By pay_type
2-4) 이메일 도메인 별 고객 수와 평균 연령 구하기
(참고) 이 데이터에서는 email 컬럼의 데이터 값을 @(도메인) 앞의 글자 수 = 9글자가 되도록 동일하게 맞춰놓음.
SELECT SUBSTR(email, 10) email_domain,
COUNT(customer_id) count_customer,
AVG(age) avg_age
FROM customers c
Group By SUBSTR(email, 10)
Q. 그렇다면 @앞의 아이디 글자 수가 제각각일 경우에는 어떤 쿼리문을 짜야 도메인만 뽑아낼 수 있을까??
: 내가 나에게 내는 숙제.. 해결하면 게시글 올리고, 링크 걸어두러 다시 오겠습니다요~
.
.
.
[드디어 해결!]
[IT 교육/SQL] - SQL | REPLACE / SUBSTR / SUBSTRING_INDEX / CONCAT 함수 정리 + 실습 문제
*정답: ②
[참고 게시글]
Q. [Group by절의 집계함수]와 [윈도우 함수]의 공통점은 뭘까요?
[IT 교육/SQL] - SQL | 윈도우 함수(Window Function) 사용법 정리 | RANK함수, SUM함수
'데이터분석 과정 > SQL' 카테고리의 다른 글
SQL | 윈도우 함수(Window Function) 사용법 정리 | RANK함수, SUM함수 (1) | 2024.01.07 |
---|---|
SQL | DISTINCT 탐구_뜻밖의 여정 | Group by절과의 사용법 차이 (1) | 2024.01.06 |
SQL | SUM함수, COUNT함수 사용법 정리 (1) | 2024.01.05 |
SQL 1주차 강의 노트정리 [국비지원_스파르타 코딩클럽] (0) | 2024.01.03 |
SQL 4주차 강의 노트정리[국비지원_스파르타 코딩클럽] (0) | 2023.01.19 |
댓글