[Mysql] 집계함수

Alex of the year 2020 & 2021·2020년 11월 28일
0

Mysql

목록 보기
1/13
post-thumbnail

(다음은 Inflearn - [백문이불여일타] 데이터 분석을 위한 중급 SQL 강의를 들으며 작성한 강의록입니다.)

집계함수 - COUNT, SUM, AVG, MIN/MAX

select문에 한가지의 함수만 사용할 경우 스칼라값을 리턴하는 구조의 함수

COUNT

select COUNT(*) from sample;
: null 값도 함께 세어 줌

select COUNT('컬럼명') from sample
: null 값은 제외한 채 세어 줌

select COUNT(DISTINCT '컬럼명') from sample
: null 값을 제외하고 중복도 제외한 채 세어 줌

AVG

avg할 때에 각별히 주의할 점: null
null을 그냥 무시할 것인지, 혹은 null을 0으로 볼 것인지에 따라 식이 달라짐

1) null을 그냥 무시하고 싶다 (아예 테이블에 없는 존재로 보겠다)
select AVG('컬럼명') from sample;

2) Null값은 0으로 보겠다 (테이블에 존재하나, 그 값이 0인것으로 생각하겠다)
select SUM('컬럼명')/COUNT(*) from sample
(위의 COUNT에서 정리했듯, count(*)의 효과는 null을 포함한 전체 개수를 리턴하므로)

MIN, MAX

MIN('컬럼명')
MAX('컬럼명')

COUNT, SUM, AVG, MIN, MAX 동시 출력

하나씩 각각 쿼리하면 당연히 스칼라 값을 리턴하지만 동시에 값을 보고 싶을 수도 있다.

select COUNT('컬럼명'), SUM('컬럼명'), AVG('컬럼명'), MIN('컬럼명'), MAX('컬럼명') from ('테이블명')
이 때에는 한 row에 멀티 column을 가지는 record가 리턴된다.

GROUP BY, HAVING

GROUP BY

특정 집계함수 값(COUNT, SUM, AVG, MIN, MAX)을 보고 싶을 때에
1) 기준으로 잡고 싶은 컬럼과
2) 그 컬럼에 대한 특정 집계함수 값
을 리턴하게 해주는 함수

  • select 문에는 기준으로 잡히는 컬럼명이 반드시 들어가야 함
  • mysql의 경우
    select SupplierID, CategoryID, AVG(Price) from Products GROUP BY 1, 2
    이런 식으로도 쿼리 작성이 가능
    이 때의 1과 2는 select문에 첫번째로, 두번째로 작성한 컬럼명
    대부분의 경우에 이런 방식이 권장되지는 않으나(명확성이 떨어지므로) 가끔 권장되는 때가 있다.

HAVING

having절은 아무래도 Where절과의 차이점만 확실히하면 되는 것 같다.

where절은 group by절 이전에 실행된다.
따라서 where절로 집계함수를 통해 나온 결과값에 대한 추가 조건 쿼리를 시도할 수는 없다. 만약 where 절로 집계함수 값에 대한 쿼리를 시도한다면 select 자체를 where절에 해당하는 값만을 쿼리해오기 때문에 내가 원하는 결과 값을 볼 수가 없을 것이다.

(select A, B, C from table명 where AVG(C)>=100 group by A, B
이 경우 컬럼 C의 평균값이 100 이상의 값을 가지는 A, B, C만을 가져와 그 안에서 A, B 기준으로 group by)

이럴 때에 필요한 것이 having절
select A, B, C from table명 group by A, B having AVG(C)>=100
이렇게 쓰면 이미 group by절까지 실행한 후 나온 결과 값에 대해
컬럼 C의 평균값이 100 이상인 것만 보여주게 된다.

집계함수 문제풀이

실제 문제 링크

  1. salary * monthsearings로 정의
  2. maximum total earnings는 사원들 중 가장 잘 번 급여
  3. 이 때, 가장 잘 번 급여와 그 가장 잘 번 급여를 몇 명이 받았는지를 쿼리문으로 작성하기

쿼리문은 아래와 같다

select months * salary as earnings, 
       count(*) # 🌝 여기서 asterisk를 쓰면 끝날 수 있는 이유는 group by에 earnings를 걸었기 때문! 
from Employee
group by earnings
order by earnings desc
limit 1; # 최댓값 하나만 보여주겠다
profile
Backend 개발 학습 아카이빙 블로그입니다. (현재는 작성하지 않습니다.)

0개의 댓글