본문 바로가기
개발일지/SQL

SQL 기초 21 GROUP BY (ft.postgreSQL 개느리네 진짜..)

by 다니엘의 개발 이야기 2022. 8. 25.
320x100

아... postgreSQL을 버릴까도 생각했는데,

강의 자체가 이걸로 진행되는걸 내가 어떻게 하냐..

그래서 혹시 몰라 지우고 다시 설치해봤다.

 

그랬더니 마찬가지로 처음 10쿼리정도는 쌩쌩하게 잘 돌아가더니

이후 쿼리부터는 진짜 대중이 없다. 오바 안하고

빠르면 2초 (매우 드뭄)

보통은 1분 30초쯤 (매우 잦음)

보통 다음 빈도로는 3분 이상... 하... (약간 잦음)

 

왜 이걸 쓰지? 싶기도 한데

postgreSQL이 ANSI 표준을 가장 잘지키는 오픈소스라 호환성이 좋다고 한다.

진짜 아.... 근데 왜 이렇게 느리며, 느린걸 잡을 만한 정보가 이리도 없다는게 이상하다 싶었다.

쿼리 느린거 관련해서 검색하면 어떻게 로그남기는지나 나오지

어디에 정확히 기입을 해야하는지에 대한 정보도 불분명하고

그 쿼리를 어떻게 확인하는지, 확인해서 어떻게 활용을 해야하는지도 안나온다

그냥 로그 남기는 것만 찾을 수있었다 여태까지는

 

암튼 하...

잡설은 여기까지하고

GROUP BY 시작!


# GROUP BY

 

SELECT category_col, AGG(data_col)

FROM table

GROUP BY category_col

 

이라고 할때

 

#1 AGG는 집계함수로써 sum, avg, min 등을 의미한다.

#2 AGG를 제외하고, SELECT에서 특정 컬럼을 선택해주었다면 해당 컬럼은 반드시

GROUP BY에서도 쓰여야 한다.

 

#3 GROUP BY에서는 필터링으로 HAVING을 사용한다. WHERE를 쓰면 안된다고 한다.

더 정확히는, 사용은 가능하지만 집계함수를 SELECT했을때 문제가 되는것같다.

 

예시1

회사별 총 판매액을 구한다.

 

SELECT company, SUM(sales)

FROM finance_table

GROUP BY company

ORDER BY SUM(sales)

 

물론 마지막의 ORDER BY 순서를 정렬해주는 것이기 때문에 중요한 내용은 아니다.


# 예제

 

select customer_id, sum(amount) from payment

group by customer_id

order by sum(amount) DESC;

 

위와같이 집계함수를 select 해주게 되면

보통의 경우에는 order by 정리를 집계함수 기준으로 하는게 일반이다.


#문풀1

 

what is the average replacement cost per MPAA rating?

plus, use ROUND function for avoid many significant digits

 

answer

 

select ROUND(AVG(replacement_cost),2), rating

FROM film

group by rating

 

#문풀2

 

What are the customer ids of the top 5 customers by total spend?

 

answer

 

SELECT customer_id, ROUND(SUM(amount),2)

FROM payment

GROUP BY customer_id

ORDER BY SUM(amount) DESC

LIMIT 5

300x250