본 포스팅은 스파르타 코딩클럽 SQL강의를 참고하였습니다.
2주차 내용은 MySQL에서 통계를 위한 최대, 최소, 평균, 개수 등을 조작하는 방법을 배우고,
나아가 위의 통계를 범위를 설정하기 위한 방법, 정렬하는 법 등을 배우게 되었다.
성씨별로 몇 명이 회원이 있는지 구하려고 기존의 배운 SQL내에서 동작시키게 된다면,
select count(*) from users where name = '이**'
select count(*) from users where name = '신**'
select count(*) from users where name = '황**'
select count(*) from users where name = '남**'
select count(*) from users where name = '고**'...
위와같이 하나씩 성의 개수만큼 쿼리를 작성해서 결과를 얻어야할 것이다.
이러한 비효율적인 문제를 Group by를 이용해 이름에 대해서 범주를 묶게되면 간단하게 해결할 수 있다.
SELECT name, COUNT(*) FROM users GROUP BY name;
SELECT (범주별로 세어주고 싶은 필드명), COUNT(*) FROM (테이블명)
GROUP By (범주별로 세어주고 싶은 필드명)
위 쿼리가 실행되는 순서: from → group by → select
개수를 세는 것 뿐만 아니라 평균값 최대값 최솟값 합계 등도 동일한 방법으로 실행한다. 다만 COUNT()가 개수를 보여주듯이 각 통계값을 위한 함수가 따로 존재한다.
최대값 MAX
SELECT (범주가 담긴 싶은 필드명), MAX(최댓값을 알고 싶은 필드명) FROM (테이블명)
GROUP BY (범주가 담긴 싶은 필드명)
최소값 MIN,
SELECT (범주가 담긴 싶은 필드명), MIN(최솟값을 알고 싶은 필드명) FROM (테이블명)
GROUP BY (범주가 담긴 싶은 필드명)
평균AVG,
SELECT (범주가 담긴 싶은 필드명), AVG(평균값을 알고 싶은 필드명) FROM (테이블명)
GROUP BY (범주가 담긴 싶은 필드명)
평균값의 경우 상황에 따라서 소숫점이 길게 나올 수 있는데 이때는 round()를 사용해서 소숫점을 컨트롤할 수 있다.
SELECT (범주가 담긴 싶은 필드명), ROUND (AVG(평균값을 알고 싶은 필드명), 2(원하는 소숫점 아래 자리)) FROM (테이블명)
GROUP BY (범주가 담긴 싶은 필드명)
합계SUM
SELECT (범주가 담긴 싶은 필드명), SUM(합계를 알고 싶은 필드명) FROM (테이블명)
GROUP BY (범주가 담긴 싶은 필드명)
6월 30일 추가
이전에 GROUP BY를 이용해 조회한 데이터의 결과가 아래와 같이 존재한다. 하지만 COUNT의 수가 작아졌다 커졌다 왔다갔다 불규칙 적인것을 확인할 수 있다.
이럴떄 ORDER BY를 이용해서 데이터를 정렬 해 줄 수 있다.
정렬은 언제 할까? 이미 모든 조회가 끝나고 마지막에 정리를 한다는 생각으로 마지막에 작성한다.
SELECT (범주별로 세어주고 싶은 필드명), COUNT(*) FROM (테이블명)
GROUP BY (범주별로 세어주고 싶은 필드명)
ORDER BY ( 정렬 기준이 될 필드명 )
기본적으로 ORDER BY ( 정렬 기준이 될 필드명 )
까지만 적어주면 정렬 기준이 될 필드명
에 대해서 오름차순(ASC)로 정렬된다.
내림차순(최신순)의 정렬을 원한다면 ORDER BY ( 정렬 기준이 될 필드명 )
뒤에 내림차순을 위한 'DESC'를 작성해 줘야한다.
SELECT (범주별로 세어주고 싶은 필드명), COUNT(*) FROM (테이블명)
GROUP BY (범주별로 세어주고 싶은 필드명)
ORDER BY ( 정렬 기준이 될 필드명 ) DESC
위 쿼리가 실행되는 순서:from → group by → select → order by
ORDER BY의 같은 경우 정렬이 숫자라면 당연히 내림차순, 오름차순이 높은수, 낮은수 부터 차례로 정렬된다.
문자열의 경우에는 영어는 알파벳 순서, 한글은 국문순서에 따라서 차례로 정렬된다.
위 쿼리가 실행되는 순서: from → where → group by → select