PostgreSQL / SQL Basics / 2.5 Aggregation and Grouping
2.5Aggregation and Grouping
Intro
Grouping과 Aggregates로 큰 데이터를 묶기
Grouping vs Aggregates
- Grouping
- Reduces many rows to fewer rows
- Done by using
GROUP BY
keyword - Visualizing the result is key to use
- Aggregates
- Reduces many values down to one
- Done by using aggregate functions
Picturing GROUP BY
sqlSELECT user_id FROM comments GROUP BY user_id;
결과를 시각화
- 우선 user_id의 unique set을 만듦
- grouped comments라는 테이블이 있다고 생각
- 이 테이블은 맨 왼쪽에 GROUPED user_id라는 열이 있고, 이 열 안에는 원래 데이터의 원래 데이터들이 속하게 됨
- 테이블의 각 데이터를 해당되는 user_id에 할당해서 결과 반환
⇒ 이렇게 묶인 데이터가 좀 더 실용적으로 활용되려면 AGGREGATE랑 함께 쓰여야함
AGGREGATE FUNCTIONS
COUNT()
: group에 얼마나 value들이 있는지 수 반환SUM()
: group에 있는 수 더함AVG()
: group에 있는 수 평균MIN()
: group에 있는 수 중 최솟값MAX()
: group에 있는 수 중 최댓값
sqlSELECT MAX(id) FROM comments;
이렇게 AGGREGATE FUNCTION을 쓰면 일반 row는 함께 못 SELECT함(보여주려고 해도 보여줄 수가 없음)
Combining GROUP BY and AGGREGATES
유저별로 작성한 comments 수
sqlSELECT user_id, COUNT(id) FROM comments GROUP BY user_id;
- 주의 : COUNT로 수를 셀 때 null 값이 value로 있으면 세지 않음
- row 수만 세려면 SELECT COUNT(*) FROM photos
각 사진별 달린 comments 수
- 생각해보면 이 케이스는 여러 테이블을 JOIN할 필요 없이, comments 테이블만으로 가능
sqlSELECT photo_id, COUNT(*) FROM comments GROUP_BY photo_id;
Filtering Groups with HAVING
필터를 하는 순서는 아래와 같음
FROM
: starting set of rows to work withJOIN
: merges in data from additional tablesWHERE
: filtering the set of rowsGROUP BY
: groups rows by a unique set of valuesHAVING
: filters the set of groups- WHERE과 꽤 비슷하나, WHERE는 row에 적용되고 HAVING은 group에 적용
- GROUP BY가 없으면 HAVING도 없음
- photo_id가 3보다 작고 photo가 2개 이상의 커멘트를 가진 사진들의 커멘트 수 구하기