DB/SQL

[세무민의 코딩일기] 쉬우면서 어려운 집계함수에 대해서 알아보자!

세기루민 2021. 7. 22. 22:58
728x90

최근에 재택근무를 하다보니 시간이 많은건 아니지만 

통근시간을 아껴서 이렇게 포스팅을 할 수 있다는 것에 감사할 뿐이다. 

오늘 포스팅 할 내용은 집계함수입니다. 


집계함수에 종류를 간략하게 표로 나열해보겠습니다. 

함수 명 설명
MIN() / MAX() 최소/최대값을 구할 때 사용한다.
SUM() 총합을 구할 때 사용한다.
AVG() 평균값을 구할 때 사용한다.
COUNT() 행의 개수를 구할 때 사용한다.
STDDEV() 표준편차를 구할 때 사용한다.
VAR_SAMP() 분산을 구할 수 있다. 

여기서 STDEV와 VAR_SAMP를 제외하고는 다들 많이 익숙한 함수입니다. 

그렇다면 예시를 통해서 한번 보도록 하겠습니다. 


# 임시 테이블 생성
CREATE TABLE TEMP1(
	NUMBER1 INT,
    NUMBER2 INT,
    VARCHARS VARCHAR(30)
);
# 임시 테이블에 값 넣어주기
INSERT INTO TEMP1 (NUMBER1, NUMBER2, VARCHARS) VALUES (22, 31, '사과');
INSERT INTO TEMP1 (NUMBER1, NUMBER2, VARCHARS) VALUES (13, 11, '파인애플');
INSERT INTO TEMP1 (NUMBER1, NUMBER2, VARCHARS) VALUES (53, 11, '체리');
INSERT INTO TEMP1 (NUMBER1, NUMBER2, VARCHARS) VALUES (64, 31, '수박');
INSERT INTO TEMP1 (NUMBER1, NUMBER2, VARCHARS) VALUES (68, 44, '참외');
INSERT INTO TEMP1 (NUMBER1, NUMBER2, VARCHARS) VALUES (99, 53, '오렌지');
INSERT INTO TEMP1 (NUMBER1, NUMBER2, VARCHARS) VALUES (43, 51, '바나나');
# 조회
SELECT * FROM TEMP1;

임시로 집계함수를 실습하기 위한 테이블을 생성합니다.

이제 집계함수 하나씩 확인해보겠습니다. 

  • AVG
SELECT AVG(NUMBER1) FROM TEMP1;

AVG는 말  그대로 평균값을 구할 때 사용한다.

AVG의 경우 단순히 평균값을 낼 때 사용하는 것이 아닌

어떤 특정 컬럼에 대한 평균값을 낼때 주로 사용된다.

SELECT NUMBER2 AS '코드', AVG(NUMBER1) AS '평균'
FROM TEMP1
GROUP BY NUMBER2;

위와 같이 주로 사용한다.

단순히 평균값만 출력하는 건 사실 효율적이지 않고 주로 위에 그림처럼 사용된다.

  • MAX / MIN
SELECT MAX(NUMBER1) AS '최대값' ,MIN(NUMBER1) AS '최소값'
FROM TEMP1;

해당 컬럼에 대한 최대값과 최소값은 MAX와 MIN을 이용하여 구할 수 있다. 

우리는 한번 생각해봐야 한다.

무조건 결과가 예상한 대로 MAX와 MIN이 될까?

GROUP BY를 할 경우 그렇지 않다. 

# GROUP BY
SELECT MAX(NUMBER1) AS '최대값' ,MIN(NUMBER1) AS '최소값'
FROM TEMP1
GROUP BY NUMBER1 LIMIT 3;

# SUB QUERY
SELECT VARCHARS, NUMBER1
FROM TEMP1
WHERE NUMBER1 = (
			SELECT MAX(NUMBER1)
            FROM TEMP1
		) OR NUMBER1 = (
			SELECT MIN(NUMBER1)
            FROM TEMP1
		);

위와 같은 값을 나타내려면 2번째 서브쿼리를 이용해야 한다.

만약 GROUP BY 속에서 MIN과 MAX를 같이 사용하게 된다면 

값이 정렬되어 원하는 MAX값과 MIN값을 얻을 수 없다. 

서브쿼리는 추후에 자세히 다루도록 하겠습니다.

  • COUNT
SELECT COUNT(NUMBER1) AS '합계'
FROM TEMP1
WHERE NUMBER2 between 20 AND 50;

COUNT를 이용하면 내가 원하는 개수만큼 값을 얻을 수 있다.

위의 쿼리에 따르면 20~50 사이에 있는 값의 개수를 나타낸 것인데 

위의 예시에 따르면 "수박, 참외, 사과"총 3개임으로 합계가 3개가 나온다.

그리고 COUNT문을 자주 보다면 *과 1을 넣은 경우가 종종있다. 

여기서 열이름과 *과 1의 차이는 NULL을 포함할 지 안할 지의 차이이다.

*과 1은 NULL값을 포함하지만 열이름을 넣을 경우 NULL값은 제외한다.

  • SUM
# SUM 기본
SELECT SUM(NUMBER1) 
FROM TEMP1;

# SUM 응용
SELECT SUM(CASE WHEN VARCHARS = '수박' THEN NUMBER1 ELSE 0 END) AS '합계'
FROM TEMP1;

# SUM 응용 2
SELECT SUM(CASE WHEN NUMBER2 = '11' THEN NUMBER1 ELSE 0 END) AS '합계'
FROM TEMP1;

SUM함수는 말 그대로 열이름에 대한 값들을 합한 결과를 나타낸다. 

응용으로 사용하는 경우 SUM에 조건절을 넣고 해당 조건에 일치하는 값이 존재 시 

일치하는 값에 대한 합계를 구해줄 수 있다.

실제로 SUM은 주로 응용처럼 사용된다. 

 

  • STDDEV / VAR_SAMP
# STDDEV : '27.022288608344283'
SELECT stddev(NUMBER1) FROM TEMP1;

# VAR_SAMP : '851.904761904762'
SELECT var_samp(NUMBER1) FROM TEMP1;

STDDEV는 표준편차를 구할 때 사용되고 

VAR_SAMP는 분산을 구할 떄 사용된다.

이 2개의 집계함수는 잘 사용하지 않지만 엑셀에서 많이 사용하고 

이런 함수들도 있다는 것을 알아두길 바란다.


이번 포스팅에서는 집계함수에 대해 알아보았는데 

다음에는 ROLLUP과 같이 더 유익한 정보로 찾아오겠습니다. 

 

728x90