본문으로 건너뛰기

SELECT 문(2)

GROUP BY, HAVING, 집계 함수

GROUP BY

결과를 그룹으로 묶어줌

[ WITH <common_table_expression>]
SELECT select_list[ INTO new_table]
[ FROM table_source]
[ WHERE search_condition]
[ GROUP BY group_by_expression]
[ HAVING search_condition]
[ ORDER BY order_expression[ ASC | DESC ]]

SELECT userid AS [사용자아이디],
SUM(amount) AS [총구매개수]
FROM buyTblGROUP BY userid


SUM() 외의 자주 사용되는 집계 함수

정보

집계 함수를 잘 활용하면 일반 SQL 문보다 빠른 성능을 얻을 수 있다 함수 성능 측정시

SELECT * FROM tbl 보다 SELECT COUNT(*) FROM tbl 의 성능이 월등이 좋다

함수명설명
AVG()주어진 값들의 평균을 계산
MIN()주어진 값들 중 최소값을 반환
MAX()주어진 값들 중 최대값을 반환
COUNT()NULL 값을 제외한 행의 개수를 반환
COUNT_BIG()NULL 값을 제외한 행의 개수를 반환하며, 반환 타입이 BIGINT
STDEV()주어진 값들의 표준 편차를 계산
SELECT AVG(amount) AS [평균구매개수] FROM buyTbl

SELECT userid, AVG(amount*1.0) AS [평균구매개수]
FROM buyTblGROUP BY userid

SELECT Name, height FROM userTbl
WHERE height = (SELECT MAX(height)FROM userTbl)
OR height = (SELECT MIN(height)FROM userTbl)

HAVING 절

위험

집계 함수의 조건을 잘못 사용하는 경우

WHERE 절 사용

SELECT useridAS [사용자], SUM(price*amount)
FROM buyTbl
WHERE SUM(price*amount) > 1000
GROUP BY userid

정보

GROUP BY 사용 시 조건의 검색은

GROUP BY 이후 HAVING 절을 사용한다

SELECT useridAS [사용자], SUM(price*amount)
FROM buyTbl
GROUP BY userid
HAVING SUM(price*amount) > 1000



ROLLUP() / GROUPING_ID() / CUBE() 함수

ROLLUP()

총합 또는 중간합계가 필요한 경우

SELECT num, groupName, SUM(price * amount) AS [비용]
FROM buyTblGROUP
BY ROLLUP(groupName, num)

GROUPING_ID()

한눈에 데이터인지 합계인지 파악

SELECT groupName, SUM(price * amount) AS [비용],
GROUPING_ID(groupName) AS [추가행여부]
FROM buyTbl
GROUP BY ROLLUP(groupName) ;

CUBE()

다차원 정보의 데이터를 요약

SELECT prodName, color, SUM(amount) AS [수량합계]
FROM cubeTbl
GROUP BY CUBE(color, prodName);