데이터베이스/SQL

SQL 그룹함수 MAX, MIN, AVG, SUM, COUNT

ADELA_J 2023. 11. 26. 15:54

<<<<다시 한 번 불러온 지금 다루고 있는 데이터베이스>>>>

 

▷ 위와 같은 내용으로 좀 더 있음

 

<MAX>

- 최댓값을 출력하는 함수이다.

 

▷ 직업이 SALESMAN인 사원들 중 최대 월급을 출력해보기

▶ 조건으로 세일즈맨을 잡아주면된다

 

만약 직업도 같이 출력해주려면

평소하던것처럼 이렇게...했더니

넹 단일 그룹의 그룹함수가 아니래여

이유는.. job에 대한 컬럼은 여러 개가 나오려고하는 MAX는 하나만 나오려고해서..!

그래서 GROUP BY절을 사용해서 데이터를 그룹핑해야한다고 한다.

 

풀어서 실행 순서를 이야기하자면

FROM emp에서 WHERE job='SALESMAN'의 조건을 가진 GROUP BY job으로 그룹핑해서

SELECT job, MAX(SAL)을 출력해라

 

 

<MIN>

- 이것은 바로 최소값 출력하기

위에서 한 MAX와 유사하게 MIN을 통해 최소값을 출력할 수 있다.

 

▶ 만약에 직업별로 최소 월급을 선택하고 월급이 높은 순대로 출력해본다면

요렇게 해볼 수 있다.

 

ORDER BY절은 항상 맨 마지막에 작성! (실행도 맨 마지막에 된다)

 

참고로 그룹함수 (집계함수를 뜻함. 지금 하고 있는거 MAX, MIN, AVG, SUM 등등등...)은

WHERE절이 TRUE가 아니여도, 그러니까 거짓이여도 결과를 출력하긴 함. 

예를 들어, 1=2 는 거짓임에도 불구하고

이렇게 아무것도 없는. NULL로  뜬다. 확실하게 알기 위해 

저번에 했었던 NVL을 사용해서 보면

넵, NULL값이기 때문에 0이라고  값이 출력됩니다.

 

▶ 만약 직업에서 SAELSMAN은 제외하고 직업별 최소 월급을 출력하는데

높은 것부터 출력하는 쿼리문을 짠다면

 

오 잼나구만 ㅋㅋㅋ

요렇게 될 수 있겠다.

 

<AVG>

- 평균값을 출력할 수 있는 함수이다.

△ 직원들의 평균 월급을 출력해본 것. 

 

만약 NULL값이 포함되어 있다면 무시하고 계산한다.

▶ 커미션(COMM)컬럼에는 NULL값이 있는데 

 

14개 행중에서 4개의 데이터만 있고 10개는 NULL값이다. 

그렇게 되면 평균은 1400+300+0+500 / 4 가 되어서

이렇게 된다.

 

하지만 이거는 정확하지 않은 게 아닌가???????

( 물론 데이터에 따라서..!, 여기서는 커미션이니까..! 모든 직원들에게 공평해야하니까!)

▷ NULL값을 0 으로 바꿔주고 14행의 데이터 평균값을 구한다면 

로 적게 나온다. 14로 나누었기 때문에.

모든 그룹함수들은 NULL값을 무시하는 특성을 가지고 있는데 

평균과 같이 갯수를 더하는건 이렇게 NVL을 써서 NULL값을 살려야할때도 생기지만

▶ 만약 SUM 과 같은 갯수가 중요한게 아닌 값들을 합치는 거라면 NVL을 사용하지 않는 것이 성능에 좋다

▶ ▶ NVL을 사용한다면 더하는 시간이 더 걸리니까!

▷ ex. NVL을 사용안하면 : 1400+300+0+500 / 사용한다면 : 1400+300+0+500+0+0+0+0+0(아무튼 0 10개)

 

<SUM>

- 숫자의 합계를 출력하는 함수

 

▷ 부서 번호와 부서 번호별 총 월급을 출력

 

▶ 직업과 직업별 총 월급을 출력하는데 높은 것부터 출력해보기

▷ FROM emp에서 GROUP BY job으로 그룹핑하고 sal을 SUM해서

ORDER BY DESC를 해서 정렬한 후에 job과 SUM(sal)을 출력한다.

 

▶ 직업과 직업별 총 월급을 출력하는데 총 월급이 4000이상만 출력해보기

흑흑 생각한대로 쿼리문 작성했는데 그룹함수는 안된다 한다.

 

그룹함수의 조건을 할 때는 WHERE절이 아닌 HAVING 절이다.

 

 

▶ 직업과 직업 총 월급을 출력하는데 직업에서 salesman은 제외하고

총 월급이 4천 이상인 직원들만 출력해보기

 

▷ FROM emp에서 WHERE job != 'SALESMAN'을 하고 GROUP BY job으로 그룹핑을 한 후

HAVING sum(sal)>=4000가 TRUE인 행만 ORDER BY 정렬하여 SELECT 출력한다

▶ ▶ FROM → WHERE →  GROUP BY 실행

* 만약 as 별칭 사용한다면 SELECT가 그룹바이 뒤이기 때문에 별칭을 찾을 수 없다.

그러므로 그룹바이는 별칭으로 묶으면 안됨.

 

<COUNT>

- 데이터의 건수를 출력하는 함수

건수를 출력해보니 14개가 있다.

COUNT(*) 로 해도 결과는 같다. (*)은 전체니까 EMPNO는 NULL값이 없으므로.

▶ 다시 한번 강조..! 그룹함수는 NULL값을 무시한다.

 

그래서 전체는 14개이지만 NULL이 대거 포함된 COMM 컬럼에는

14가 아닌 4라는 갯수가 출력된다.