동일한 범주를 갖는 데이터를 하나로 묶어서, 범주별 통계를 내주는 것을 의미해요.
Group by를 이용하면 1) 같은 성씨의 데이터를 하나로 묶고 2) 각 성씨의 회원수를 구할 수 있어요.
select name, count(*) from users
group by name;
성씨별로 회원이 몇 명인지, 세어진 것을 확인할 수 있죠?
👉 위 쿼리가 실행되는 순서: from → group by → select
👉 동일한 범주의 갯수는 count(*)를 사용해서 해요.
▶︎ 주차별 '오늘의 다짐' 개수 구하기
select week, count(*) from checkins
group by week;
select 범주별로 세어주고 싶은 필드명, count(*) from 테이블명
group by 범주별로 세어주고 싶은 필드명;
👉 동일한 범주 특정 필드의 최솟값은 min(필드명)을 사용해서 해요.
▶︎ 주차별 '오늘의 다짐'의 좋아요 최솟값 구하기
select week, min(likes) from checkins
group by week;
select 범주가 담긴 필드명, min(최솟값을 알고 싶은 필드명) from 테이블명
group by 범주가 담긴 필드명;
👉 동일한 범주 특정 필드의 최댓값은 max(필드명)을 사용해서 해요.
▶︎ 주차별 '오늘의 다짐'의 좋아요 최댓값 구하기
select week, max(likes) from checkins
group by week;
select 범주가 담긴 필드명, max(최댓값을 알고 싶은 필드명) from 테이블명
group by 범주가 담긴 필드명;
👉 동일한 범주 특정 필드의 평균값은 avg(필드명)을 사용해서 해요.
▶︎ 주차별 '오늘의 다짐'의 좋아요 평균값 구하기
select week, avg(likes) from checkins
group by week;
select 범주가 담긴 필드명, avg(평균값을 알고 싶은 필드명) from 테이블명
group by 범주가 담긴 필드명;
select week, round(avg(likes),2) from checkins
group by week;
평균을 구할 때는 소수점이 나와서 보기 좋지가 않아, round(필드명,소수점자리수)를 함께써서 원하는 숫자로 표기해요. 0은 그냥 반올림. 2는 소수점 둘째자리까지 표기.
👉 동일한 범주 특정 필드의 합계는 sum(필드명)을 사용해서 해요.
▶︎ 주차별 '오늘의 다짐'의 좋아요 합계 구하기
select week, sum(likes) from checkins
group by week;
select 범주가 담긴 필드명, sum(합계를 알고 싶은 필드명) from 테이블명
group by 범주가 담긴 필드명;
👉 기존 작성된 코드에 order by count(*) 만 추가해줬어요.
갯수 (count(*) 값)을 기준으로 정렬해달라는 뜻이에요.
- 기본 오름차순으로 asc(어센딩)정렬되며, 내림차순은 desc(디센딩) 추가
▶︎ 성씨별 회원수 데이터를 오름차순으로 정렬해보기
select name, count(*) from users
group by name
order by count(*);
👉 order by count(*)에 desc만 붙여줬어요.
▶︎ 성씨별 회원수 데이터를 내림차순으로 정렬해보기
select name, count(*) from users
group by name
order by count(*) desc;
▶︎ like를 많이 받은 순서대로 '오늘의 다짐'을 출력해 볼까요?
select * from checkins
order by likes desc;
select * from 테이블명
order by 정렬의 기준이 될 필드명;
select name, count(*) from users
group by name
order by count(*);
👉 위 쿼리가 실행되는 순서: from → group by → select → order by
▶︎ 웹개발 종합반의 결제수단별 주문건수 세어보기
😎 원리는 간단해요. Where절로 조건이 하나 추가되고, 그 이후에 Group by, Order by가 실행되는 것!
[순서]
select payment_method, count(*) from orders
where course_title = "웹개발 종합반"
group by payment_method;
위와 같이, group by와 select 사이에 where로 조건을 넣어주면 끝!
👉 위 쿼리가 실행되는 순서: from → where → group by → select
만약 order by가 추가된다면? order by는 맨 나중에 실행됩니다! (결과물을 정렬해주는 것이기 때문!)
쿼리가 점점 길어지면서 종종 헷갈리는 일이 생길 수 있습니다. 그래서 SQL은 Alias(알리아스)라는 별칭 기능을 지원합니다.
select * from orders o
where o.course_title = '앱개발 종합반'
요렇게 테이블에 이름을 붙여서 별칭을 추가하는 것도 가능하고,
select payment_method, count(*) as cnt from orders o
where o.course_title = '앱개발 종합반'
group by payment_method
출력될 필드에 as를 붙여서 별칭을 추가하는 것도 가능해요! 그럼, count(*)가 아니라 cnt로 출력되었네요!
네이버 이메일을 사용하여 앱개발 종합반을 신청한 주문의 결제수단별 주문건수 세어보기
select payment_method, count(*) from orders
where email like '%naver.com' and course_title = '앱개발 종합반'
group by payment_method
1) order by의 기본정렬은 오름차순이며, 내림차순정렬은 desc를 붙이면 돼요.
2) 평균을 구하는 avg(필드명)은 보통 소수점자리로 계산되어, round()와 함께 쓰면 좋아요. round(avg(필드명),소수점자리수)로 표기하며, 0은 일단위, 2는 소수점 둘째자리까지 표시한다는 의미이다.
3) OO별..에서 OO이 범주필드를 의미한다.