단순히 쌓여있는 raw data만으로는 의미있는 정보를 찾아내기 어렵다. 20세 남성/여성 평균 신장 데이터가 주어진다고 해도 180-남, 168-남, 171-여, ... 와 같이 나열된 숫자-문자열 뭉치일 뿐이다. 우리는 raw data로 부터 의미있는 정보(평균값, 중앙값 등)를 얻기 위해 통계적 방법론을 이용해야한다.
이를 위해 데이터를 field값에 따라 범주로 묶거나 정렬하여 한번의 query로 각 범주의 통계값을 비교하기 위해 쓰이는 'Group by'와 'Order by'에 대해 배운다.
동일한 범주를 갖는 데이터를 하나로 묶어서, 범주별 통계를 내주는 기능이다. group by 뒤에 지정된 field 값이 같은 record끼리 하나의 그룹으로 묶고 각 그룹의 record 수(count), 어떤 field값의 평균(avg)/최대(max)/최소(min)등을 구할 수 있다.
select문과 limit문을 통해 개략적인 형태를 살펴본다.
select * from checkins limit 10
Ⅱ. record 들을 원하는 field로 묶기
select * from [table] group by [범주로 쓸 field]
실행 순서에 맞춰 어떤 범주로 묶을지 먼저 정하여 group by 부터 작성해두고 다음 단계를 진행하는 습관을 들이는 것이 좋다.
각 범주별 총 record 갯수를 출력하기위한 query는 다음과 같다.
select [범주로 쓸 field],count(*) from [table]
group by [범주로 쓸 field]
[범주로 쓸 field] 부분은 필수는 아니나 출력의 가독성을 높이기 위한 용도이다.
예시:
입력
select week,count(*) from checkins group by week
출력
지불방식에 따라 record를 그룹으로 묶고, 각 그룹의 week값과 각 그룹의 record갯수를 출력했다.
원하는 field로 범주별로 묶고, 다른 feild의 각 범주별 통곗값을 출력하기위한 query는 다음과 같다.
select [범주로 쓸 field], [min/max/avg/sum]([원하는 field]) from [table]
group by [범주로 쓸 field]
예시1: 최소-min
입력
select week,min(likes) from checkins group by week
각 그룹별 likes의 최솟값을 출력한다.
출력
예시2: 최대-max
입력
select week,max(likes) from checkins group by week
각 그룹별 likes의 최댓값을 출력한다
출력
예시3: 평균-avg
입력
select week,avg(likes) from checkins group by week
각 그룹별 likes의 평균값을 출력한다.
출력
예시3-1: 소숫점 반올림-round
round함수를 사용하는 법은 다음과 같다.
round([반올림할 대상],n)
n은 표시할 소숫점 아래 자릿수이다. 즉 n 자리에 1을 입력할 경우 최대 소숫점 아래 한자리 까지 표시되도록 반올림한다.
입력
select week,round(avg(likes),2) from checkins group by week
각 그룹별 likes의 평균값을 그대로 출력하지 않고, round함수를 통해 소숫점 아래 2자리로 반올림하여 출력한다.
출력
예시4: 총합-sum
입력
select week,sum(likes) from checkins group by week
각 그룹별 likes의 총 합을 출력한다.
출력
예시5: '*'
입력
select * from checkins group by week
이와같이 입력할 경우 각 범주당 하나의 record를 보여준다.
출력
order by는 모든 query에 적용될 수 있는 기능으로 뒤에 오는 field를 기준으로 하여 출력할 record들을 오름차순/내림차순으로 정렬한다.
현재 까지 배운 것 중 가장 마지막에 실행되는 구문으로, query문의 최하단에 작성한다.
select * from [table 명]
order by [정렬 기준이 될 field 명]
내림차순의 경우 다음과 같이 하면 된다.
select * from [table 명]
order by [정렬 기준이 될 field 명] desc
기본이 오름차순 정렬이므로 오름차순으로 정렬하고 싶다면 desc를 입력하지 않거나 asc로 바꿔 작성한다.
예시 1: 단독 사용
입력
select * from checkins order by likes desc
전체 record를 likes 값 크기 내림차순으로 정렬해 출력한다.
출력
예시 2: group by와 함께 사용
입력
select week, count(*) from checkins group by week order by count(*)
전체 record를 week 별로 묶은 뒤, 각 그룹의 총 record 갯수를 구하고 그 갯수에 따라 오름차순으로 정렬한다.
출력
group by와 order by 모두 where보다 하단에 존재하여야 한다. 실행은 where문에 의해 먼저 조건이 추가되고 그 이후 group by, 그 이후 order by가 실행된다.
예시
입력
select payment_method, count(*) from orders where course_title = "웹개발 종합반" group by payment_method order by count(*)
course_title이 웹개발 종합반인 record만 선택된다. 이후 payment_method로 정렬되고 count()가 계산된다. 이후 count()에 따라 오름차순으로 정렬한다.
출력
query문의 각 부분이 어떠한 순서로 실행되는지 이해하면 작성에 도움이 될 것이다. 1. from [table 명]부분이 가장 먼저 실행되어 table의 전체 데이터를 불러온다.
2. 이후 where 문이 실행되어 조건에 따라 record 들이 선별된다.
3. 이후 group by가 실행되어 각 레이블이 범주로 묶인다.
5. 이후 select 문의 앞부분이 실행되어 출력할 field들이 결정된다.
6. 마지막으로 order by가 지정된 field로 결과물을 정렬한다.
별칭을 붙이는 기능이다.
쿼리를 작성하다보면 어떤 table의 field인지 헷갈리거나 출력 결과물의 field명이 지저분한 것이 마음에 안들 때 쓸 수 있다.
select payment_method as pm , count(*) as cnt
from orders o
where o.course_title ='앱개발 종합반'
select payment_method as pm , count(*) as cnt
from orders o
where o.course_title ='앱개발 종합반'
GROUP by pm
위와같이 입력시 출력: