FreeHand

[MySQL] GROUP BY와 집계 함수 본문

Database

[MySQL] GROUP BY와 집계 함수

Jinn 2023. 10. 30. 20:02

buytbl 테이블

 

사용자가 구매한 물품의 개수를 보려면 어떻게 해야 할까

SELECT userID, amount FROM buytbl
ORDER BY userID;

이렇게 조회하면 각 사용자마다 개수를 더해야 한다.

group by와 집계 함수를 사용하면 원하는 결과를 얻을 수 있다.

SELECT userID, SUM(amount) FROM buytbl
GROUP BY userID;

칼럼 이름이 함수 그대로 나오기 때문에 별칭을 사용한다.

SELECT userID '사용자 아이디', SUM(amount) '총 구매 개수' FROM buytbl
GROUP BY userID;

 

사용자별 총 구매액을 조회하려면 이렇게 할 수 있다.

SELECT userID '사용자 아이디', SUM(price*amount) '총 구매액' FROM buytbl
GROUP BY userID;

 

이렇게 group by와 집계 함수는 자주 같이 사용된다.

 

 

집계 함수

SUM() 합계를 구한다.
AVG() 평균을 구한다.
MIN() 최소값을 구한다.
MAX() 최대값을 구한다.
COUNT() 행의 개수를 센다. (NULL은 제외한다.)
COUNT(DISTINCT) 행의 개수를 센다. (중복은 1번만 센다.)
STDEV() 표준편차를 구한다.
VAR_SAMP() 분산을 구한다.

 

위에서 조회했던 사용자별 총 구매액에서 총 구매액이 1000 이상인 사용자만 조회하려면 어떻게 할까

SELECT userID '사용자 아이디', SUM(price*amount) '총 구매액' FROM buytbl
WHERE SUM(price*amout) >= 1000
GROUP BY userID;

where를 사용하면 오류가 발생한다. 집계 함수는 WHERE절에 사용할 수 없다.

대신 HAVING을 사용해서 다음과 같이 조회할 수 있다.

SELECT userID '사용자 아이디', SUM(price*amount) '총 구매액' FROM buytbl
GROUP BY userID
HAVING SUM(price*amount) >= 1000;

HAVING절은 GROUP BY절 다음에 나와야 한다.

 

총합이나 중간 합계가 필요하면 GROUP BY와 함께 WITH ROLLUP을 사용하면 된다.

SELECT groupName '분류', SUM(price*amount) '구매 비용' FROM buytbl
GROUP BY groupName
WITH ROLLUP;

분류별 구매 비용과 그 총합이 나온다.

SELECT num '번호', groupName '분류', SUM(price*amount) '구매 비용' FROM buytbl
GROUP BY groupName, num
WITH ROLLUP;

속성을 하나 추가하면 중간 합계가 나오고 마지막에 총합이 나온다.

 

'Database' 카테고리의 다른 글

[MySQL] UPDATE  (0) 2023.11.01
[MySQL] INSERT  (0) 2023.10.31
[MySQL] 테이블 복사  (0) 2023.10.30
[MySQL] 서브쿼리와 ANY, ALL  (0) 2023.10.30
[MySQL] SELECT 절  (0) 2023.10.30