SUM, AVG, MIN, MAX, COUNT DISTINCT와 달리 GROUP BY는기준이 되는 값으로 하나로 묶어두기 때문에 값이 제거되지 않는다. COUNT 함수는 값이 NULL인 경우 출력하지 않는다.예제 코드▼
-- GROUP BY 실습
SELECT addr AS '주소', COUNT(*)
FROM usertbl
GROUP BY addr;
-- DISTINCT를 쓰면 위의 결과와 유사하지만 내부적으론 다름
SELECT DISTINCT addr AS '주소', COUNT(*)
FROM usertbl;
-- 얘는 서울 10 이렇게만 나옴
-- 위의 결과 이유는 DISTINCT는 중복된 애들을 제거하지만,
-- GROUP BY의 경우 addr를 기준으로 하나로 묶어뒀기 때문에 값들이 제거되지는 않음.
-- 전체 사원 급여 합계
SELECT SUM(salary) AS '급여합계'
FROM employee;
-- 사원 급여 평균
SELECT AVG(salary) AS '급여합계'
FROM employee;
-- 사원 급여 최대값
SELECT MAX(salary) AS '급여합계'
FROM employee;
-- 사원 급여 최솟값
SELECT MIN(salary) AS '급여합계'
FROM employee;
-- 부서별 급여 합계
SELECT dept_code AS '부서코드',
SUM(salary) AS '급여합계',
AVG(salary) AS '급여평균'
FROM employee
GROUP BY dept_code
ORDER BY '급여평균';
-- 회원 아이디, 구매 개수 조회
SELECT userID AS '아이디',
SUM(amount) AS ' 구매개수'
FROM buytbl
GROUP BY userID;
ORDER BY '구매개수' DESC;
-- 사용자별 구매 금액의 총 합
SELECT userID AS '아이디',
SUM(price * amount) AS '결제총액'
FROM buytbl
GROUP BY userID;
-- 전체 구매자가 구매한 물품 개수의 평균
SELECT SUM(amount) AS '전체물품개수',
AVG(amount) AS '평균'
FROM buytbl;
-- 사용자 별 평균 구매 개수
SELECT userID AS '아이디',
AVG(amount) AS '평균구매개수'
FROM buytbl
GROUP BY userID;
-- 휴대폰이 있는 사원의 총원 수
SELECT COUNT(*)
FROM usertbl
WHERE mobile1 IS NOT NULL;
-- COUNT 함수는 mobile1에 있는 값 중 값이 있는 행들만 계산함
-- NULL인 애들은 출력되지 않음
SELECT COUNT(mobile1)
FROM usertbl;
-- 참고
-- NULL 제외, 중복된 값은 한 번만 COUNT 함
SELECT COUNT(DISTINCT mobile1)
FROM usertbl;
위에서 본 집계 함수에 대한 조건을 제한할 때 사용하는 구문이다. 집계 함수 조건 제한에 WHERE은 사용할 수 없기 때문이다.
예제 코드▼
-- 총 구매액이 1000만원 이상인 회원 ID 조회
SELECT userID AS '고객 아이디' ,
SUM(price * amount) AS '총 구매 금액'
FROM buytbl
GROUP BY userID
HAVING SUM(price * amount) >= 1000;
-- 사용자 별 구매 평균 개수가 3개 이상인 아이디, 평균 구매 개수 조회
SELECT userID AS '아이디',
AVG(amount) AS '평균 구매 개수'
FROM buytbl
GROUP BY userID
HAVING AVG(amount) >= 3;