최근에 재택근무를 하다보니 시간이 많은건 아니지만
통근시간을 아껴서 이렇게 포스팅을 할 수 있다는 것에 감사할 뿐이다.
오늘 포스팅 할 내용은 집계함수입니다.
집계함수에 종류를 간략하게 표로 나열해보겠습니다.
함수 명 | 설명 |
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과 같이 더 유익한 정보로 찾아오겠습니다.
'DB > SQL' 카테고리의 다른 글
[세무민의 코딩일기] 새로 만들 테이블에 기존 테이블의 값을 insert 하는 Tip (0) | 2021.07.25 |
---|---|
[세무민의 코딩일기] 쿼리 with rollup 으로 중간 합계 구하는 방법! (0) | 2021.07.24 |
CRUD와 다양한 SELECT 검색조건에 대해서 자세하게 알아봅시다![DISTINCT, LIKE, IN, BETWEEN 등] (0) | 2021.07.21 |
세무민의 코딩일기 : CodeTable 혹은 ZTable에 대해서 알아봅시다. (0) | 2021.07.21 |
세무민의 코딩일기 : DB 공부할 때 팁! [Group By와 Order By만 잘해도 절반은 먹고 간다. ] (0) | 2021.05.07 |