SQL Group by / Order by

송은·2023년 9월 18일
0

Group by

동일한 범주를 갖는 데이터를 하나로 묶어서, 범주별 통계를 내주는 것을 의미한다.

select 범주별로 세어주고 싶은 필드명, count(*) from 테이블명
group by 범주별로 세어주고 싶은 필드명;
select name, count(*) from users
group by name;

예) 같은 성씨의 데이터를 하나로 묶고, 각 성씨의 회원수를 구할 때


쿼리 실행 순서

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에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 세어준다.
    예) 이@@, 이@@, 김@@, 김@@, 박@@ 이렇게 데이터가 있다면 이@@ 는 2개, 김@@는 2개, 박@@는 1개 이렇게 된다.

개수 구하기

동일한 범주의 갯수는 count(*)를 사용

select 범주별로 세어주고 싶은 필드명, count(*) from 테이블명
group by 범주별로 세어주고 싶은 필드명;
select week, count(*) from checkins
group by week;

최솟값 구하기

동일한 범주에서 특정 필드의 최솟값은 min(필드명)을 사용

select 범주가 담긴 필드명, min(최솟값을 알고 싶은 필드명) from 테이블명
group by 범주가 담긴 필드명;
select week, min(likes) from checkins
group by week;

최댓값 구하기

동일한 범주에서 특정 필드의 최댓값은 max(필드명)을 사용

select 범주가 담긴 필드명, max(최댓값을 알고 싶은 필드명) from 테이블명
group by 범주가 담긴 필드명;
select week, max(likes) from checkins
group by week;

평균 구하기

동일한 범주에서 특정 필드의 평균값은 avg(필드명)을 사용

select 범주가 담긴 필드명, avg(평균값을 알고 싶은 필드명) from 테이블명
group by 범주가 담긴 필드명;
select week, avg(likes) from checkins
group by week;

합계 구하기

동일한 범주에서 특정 필드의 합계는 sum(필드명)을 사용

select 범주가 담긴 필드명, sum(합계를 알고 싶은 필드명) from 테이블명
group by 범주가 담긴 필드명;
select week, sum(likes) from checkins
group by week;

쿼리 작성팁

  • 웹개발 종합반의 결제수단별 주문건수 세어보기
    👉OO별 (=묶어서 확인할 필드명)

  • 웹개발 종합반의 결제수단별 주문건수 세어보기
    👉통계낼 방법(합계를 알고 싶은 필드명)

ex) 결제수단별 / 주문건수(count)

payment_method / count(*)
select payment_method, count(*) from orders
group by payment_method

ex) course_id별 / 평균 like 개수 (avg)

course_id / avg(likes)
select course_id, avg(likes) from checkins
group by course_id

Order by

데이터 정렬이 필요할 때 Order by 를 사용한다.

오름차순 정렬

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

내림차순 정렬

select name, count(*) from users
group by name
order by count(*) desc;

쿼리 실행 순서

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

쿼리 실행 순서: from → group by → select → order by

  1. from users: users 테이블 데이터 전체를 가져온다.
  2. group by name: users 테이블 데이터에서 같은 name 을 갖는 데이터를 합쳐준다.
  3. select name, count(*): name 에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 세어준다.
  4. order by count(*): 합쳐진 데이터의 개수에 따라 오름차순으로 정렬해준다.

이외 문법

별칭 (Alias)

쿼리가 점점 길어지면서 종종 헷갈리는 일이 생길 수 있다.
그래서 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

이런식으로 출력될 필드에 별칭을 붙이는 것이 가능해진다!


예시

  • 웹개발 종합반의 결제수단별 주문건 수 세어보기
select payment_method, count(*) from orders
where course_title = "웹개발 종합반"
group by payment_method;
  1. orders 테이블에서 주문 데이터를 읽어오고
  2. 웹개발 종합반 데이터만 남기고
  3. 결제수단(범주) 별로 그룹화하고
  4. 결제수단별 주문건수를 세어준다.
  • 문자열을 기준으로 정렬하기
select * from users
order by email;
select * from users
order by name;
  • 시간을 기준으로 정렬하기
select * from users
order by created_at desc;
  • Gmail을 사용하는 성씨별 회원수 세어보기
select name, count(*) from users
where email like '%gmail.com'
group by name;
  • course_id별 '오늘의 다짐'에 달린 평균 like 개수 구해보기
select course_id, avg(likes) from checkins
group by course_id;
  • 네이버 이메일을 사용하여 앱개발 종합반을 신청한 주문의 결제수단별 주문건수 세어보기
select payment_method, count(*) from orders
where email like '%naver.com' 
and course_title = '앱개발 종합반'
group by payment_method
profile
개발자

0개의 댓글