sungyup's.

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

sql
SELECT user_id FROM comments GROUP BY user_id;

결과를 시각화

  1. 우선 user_id의 unique set을 만듦
    1. grouped comments라는 테이블이 있다고 생각
    2. 이 테이블은 맨 왼쪽에 GROUPED user_id라는 열이 있고, 이 열 안에는 원래 데이터의 원래 데이터들이 속하게 됨
    3. 테이블의 각 데이터를 해당되는 user_id에 할당해서 결과 반환

⇒ 이렇게 묶인 데이터가 좀 더 실용적으로 활용되려면 AGGREGATE랑 함께 쓰여야함

AGGREGATE FUNCTIONS

  1. COUNT() : group에 얼마나 value들이 있는지 수 반환
  2. SUM() : group에 있는 수 더함
  3. AVG() : group에 있는 수 평균
  4. MIN() : group에 있는 수 중 최솟값
  5. MAX() : group에 있는 수 중 최댓값
sql
SELECT MAX(id) FROM comments;

이렇게 AGGREGATE FUNCTION을 쓰면 일반 row는 함께 못 SELECT함(보여주려고 해도 보여줄 수가 없음)

Combining GROUP BY and AGGREGATES

유저별로 작성한 comments 수

sql
SELECT user_id, COUNT(id) FROM comments GROUP BY user_id;
  • 주의 : COUNT로 수를 셀 때 null 값이 value로 있으면 세지 않음
    • row 수만 세려면 SELECT COUNT(*) FROM photos

각 사진별 달린 comments 수

  • 생각해보면 이 케이스는 여러 테이블을 JOIN할 필요 없이, comments 테이블만으로 가능
sql
SELECT photo_id, COUNT(*) FROM comments GROUP_BY photo_id;

Filtering Groups with HAVING

필터를 하는 순서는 아래와 같음

  1. FROM : starting set of rows to work with
  2. JOIN : merges in data from additional tables
  3. WHERE : filtering the set of rows
  4. GROUP BY : groups rows by a unique set of values
  5. HAVING : filters the set of groups
    1. WHERE과 꽤 비슷하나, WHERE는 row에 적용되고 HAVING은 group에 적용
    2. GROUP BY가 없으면 HAVING도 없음
  • photo_id가 3보다 작고 photo가 2개 이상의 커멘트를 가진 사진들의 커멘트 수 구하기