GROUP BY 및 HAVING그리고 집계함수

윤재열·2022년 1월 29일
1

Mysql

목록 보기
2/8

GROUP BY절

이 절이 말 그대로 그룹으로 묶어주는 역할을 한다.

  • sqlDB의 구매 테이블(buytbl)에서 사용자(userID)가 구매한 물품의 개수를 보려면 다음과 같이 하면된다.
SELECT userId, amount FROM buytbl ORDER BY userID;

  • 결과를 보면 사용자별로 여러 번 구매가 이루어져서 각각의 행이 별도로 출력된다. 이렇게 합계를 낼때 계산기를 쓰거나 암산을 해야한다면 MySQL을 사용할 이유가 없을겁니다.
  • 이럴 떄는 집계 함수를 사용합니다.
  • 집계함수는 주로 GROUP BY절과 함께 쓰이며 데이터를 그룹화해주는 기능을 합니다.
  • SUM()과 GROUP BY절을 사용합니다.
  • 즉 사용자(userID)별로 GROUP BY로 묶어준 후에 SUM()함수로 구매 개수를 합쳐줍니다.
SELECT userID, SUM(amount) FROM buytbl GROUP BY userID;
  • 그런데 SUM(amount)의 결과 열에는 제목이 함수 이름 그대로 나왔습니다.전에 배웠던 별칭AS를 사용해서 결과를 보기 편하게 만들어 봅시다.
SELECT userID, SUM(amount) FROM buytbl GROUP BY userID;

  • 이번에는 구매액의 총합을 출력해봅시다.구매액은 가격*수량이므로 총합은 SUM()을 사용하면 됩니다.
SELECT userID, SUM(amount) FROM buytbl GROUP BY userID;

집계 함수 종류

함수명설명
AVG()평균을 구한다.
MIN()최소값을 구한다.
MAX()최대값을 구한다.
COUNT()행의 개수를 센다.
COUNT(DISTINCT)행의 개수를 센다(중복되는 값은 1개만 인정)
STDEV()표준편차를 구한다.
VAR_SAMP()분산을 구한다.
  • 전체 구매자가 구매한 물품의 개수의 평균을 구해보자
SELECT AVG(amount) '평균 구매 개수' FROM buytbl;

  • 이번에는 각 사용자 별로 한 번 구매시 물건을 몇개 구매했는지 평균을 구해보자.
SELECT userid,AVG(AMOUNT)'사용자별 평균 구매 개수'FROM buytbl GROUP BY USERID;

  • 가장 큰 키와 작은 키의 회원 이름과 키를 출력하는 쿼리를 만들어보자
SELECT name, MAX(height) '최고 키', MIN(height) '최저 키'	FROM usertbl GROUP BY Name;

  • 내가 원했던 결과가 나오지 않았다.원했던 것은 최고키의 사람이름과,최저키의 사람이름을 출력하고싶은데 모두 나왔다.
  • 이런 경우는 앞에서 배운 서브쿼리와 조합을 하는것이 제일 수월하다.
SELECT name, height FROM usertbl 
	WHERE height=(SELECT MAX(HEIGHT)FROM USERTBL) 
	OR HEIGHT = (SELECT MIN(HEIGHT)FROM USERTBL);

  • 이번에는 휴대폰이 있는 사용자의 수를 카운트하자.
SELECT COUNT(mobile1) FROM usertbl;

Having절

  • 앞에서 했던 내용중에 사용자별로 총구매액을 구해보자.
SELECT userid '사용자',sum(price*amount)'총구매액' FROM buytbl GROUP BY userid;
  • 그런데, 이 중에서 총 구매액이 1,000이상인 사용자에게만 사은품을 증정하고 싶다면 앞에서 배운 조건을 포함하는 WHERE구문을 생각할 수 있을겁니다.
  • 하지만 WHERE절에는 집계함수가 나타낼 수가 없습니다.
  • 그럴 떄 사용되는 것이 HAVING절입니다.
  • HAVING은 WHERE와 비슷한 개념으로 조건을 제한하는 것이지만, 집계 함수에 대해서 조건을 제한하는 것이라고 생각하면 됩니다.
  • 그리고 HAVING절은 꼭 GROUP BY절 다음에 나와야 합니다.(순서가 바뀌면 안된다.)
SELECT userid '사용자',sum(price*amount)'총구매액' FROM buytbl GROUP BY userid;

ROLL UP

총합 또는 중간 합계가 필요하다면 GROUP BY절과 함꼐 WITH ROLLUP문을 사용하면 됩니다.

  • 만약 분류 별로 합계 및 그 총합을 구하고 싶다면
SELECT num,groupname,sum(price*amount)'비용' FROM buytbl GROUP BY groupname, num with rollup;

  • 중간에 num열이 NULL로 되어 있는 추가된 행이 각 그룹의 소합계를 의미합니다.
  • 또 마지막 행은 각 소합계의 합계,즉 총합계의 결과가 나왔습니다.
  • 위 구문에서 num은 PK이며,각 항목이 보이는 효과를 위해서 넣어준 것 입니다.
  • 만약 소합계 및 총합계만 필요하다면 num을 뺴면 됩니다.

이로써 기본적인 SELECT문의 틀을 살펴 보앗습니다.
SELECT문은 가장 많이 사용되는 쿼리문이며, 가장 쉬우면서도 가장 어려운 부분이기도 합니다.
다음 공부 내용은 SQL문의 분류에 대해서 살펴보고 INSERT/UPDATE/DELETE를 익혀봅니다.

profile
블로그 이전합니다! https://jyyoun1022.tistory.com/

0개의 댓글