SQL 그룹함수 MAX, MIN, AVG, SUM, COUNT
<<<<다시 한 번 불러온 지금 다루고 있는 데이터베이스>>>>
▷ 위와 같은 내용으로 좀 더 있음
<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라는 갯수가 출력된다.