걷기 시작한 Coding Novice

SQL

group by 사용해보기

Spell 2022. 5. 5. 03:20

범주의 통계를 내주는 group by

성씨별로 몇 명의 회원이 있는지 알아보자.

성씨별로 몇 명이 회원이 있는지 구하려고 where 절을 사용해서 수십개의 쿼리를 작성하는 것은 너무 비효율적이다.

이 문제를 group by를 사용해서 바로 해결이 가능하다.

select name, count(*) from users
group by name

성씨별로 카운터가 되어지며 맨 아래 숫자를 확인하면 54개의 성씨가 있다는 정보도 알 수 있다.

 

여기서 SQL 쿼리가 실행되는 순서
select name, count(*) from users
group by name​
위 쿼리가 실행되는 순서는 from → group by → select
1. from users : users 테이블 데이터 전체를 가져온다
2. group by name : users 테이블 데이터에서 같은 name을 갖는 데이터를 합쳐준다
3. select name, count(*) : name에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 모두 세어준다.
ex) [이**, 이**, 김**, 김**, 박**] 이렇게 데이터가 있었다면, 이**는 2개, 김**은 2개, 박**은 1개가 된다.

 

신씨로 실습을 다시 해보았다.

select * from users 
where name = '신**'

where을 사용해서 가장 아랫줄을 보면 14개의 데이터가 있다는 걸 알 수 있다.

 

select name, count(*) from users
group by name

group by를 사용하여 결과 값을 확인해보니 신씨에 대한 값은 같았다.

추가로 다른 성씨들도 여러 번 작업할 필요 없이 한 번에 group by로 확인할 수 있었다.

 


 

Group by

동일한 범주의 개수 구하기 (가장 많이 쓴다고 한다)

동일한 범주의 개수는 count(*)를 함께 이용해야 한다.

 

  • 주차별 '오늘의 다짐' 개수 구하기.
select week, count(*) from checkins
group by week

 

where절로 검증해보자.

select * from checkins
where week = 1

위 그림처럼 맨 아래로 내려보니 1주차가 총 96개로 동일하다는 걸 알 수 있었다.

 

동일한 범주에서의 최소값 구하기 min(필드명)

동일한 범주 특정 필드의 최솟값은 min(필드명)을 사용한다. (꼭 필드명이 필요하다)

  • 주차별 '오늘의 다짐'의 좋아요 최솟값 구하기
select week, min(likes) from checkins
group by week

결과를 보면 1주차에는 like가 0개가 최소, 2주차도 동일하며, 3주차에는 like 1개가 최소라는 걸 알 수 있다.

 

동일한 범주에서의 최댓값 구하기 max(필드명)

동일한 범주 특정 필드의 최댓값은 max(필드명)을 사용한다. (꼭 필드명이 필요하다)

  • 주차별 '오늘의 다짐'의 좋아요 최댓값 구하기
select week, max(likes) from checkins
group by week

최소값을 구했을 때와 동일하게 접근하여, 1주차에 4개, 2주차에 5개, 3주차에 3개의 like를 받은게 최대값이라는 걸 알 수 있다.

 

동일한 범주의 평균 구하기

동일한 범주 특정 필드의 평균값은 avg(필드명)을 사용한다. 참고로 Average의 약자이다.

  • 주차별 '오늘의 다짐'의 좋아요 평균값 구하기
select week, avg(likes) from checkins
group by week

평균값이라 소수점으로 나오게 된다.

 

소수점 몇번 째 자리까지 나오게 할 것인지도 설정할 수 있다.

select week, round(avg(likes), 2) from checkins
group by week

round로 묶어 준 뒤 쉼표 이후 몇 번째 자리까지 표시할 지 적어주면 된다.

 

참고로 0을 적게되면 반올림을 하게 된다.

select week, round(avg(likes), 0) from checkins
group by week

 

동일한 범주의 합계 구하기

동일한 범주 특정 필드의 합계는 sum(필드명)을 사용한다. (엑셀 함수와 비슷하다?)

  • 주차별 '오늘의 다짐'의 좋아요 합계 구하기
select week, sum(likes) from checkins
group by week

여기서 맞는지 where 문으로 3주차 데이터를 검증을 해보자.

select * from checkins
where week = 3

3주차 2+2+3+2+1+1+2+1+1=15