Group by, Order by

임소영·2022년 11월 8일
0

Group by 개념

Where 절을 사용해서 수십개의 쿼리를 작성하는 것은 너무 비효율적입니다.
이 문제는 Group by를 사용하여 범주의 통계를 내어 해결 할 수 있습니다.

예1) 성씨별 회원수를 Group by로 쉽게 구해보기

select name, count(*) from orders
group by name;

예2-1) users 테이블에서 '신' 씨를 가진 데이터만 불러와서 개수 살펴보기

select * from users 
where name = "신**";

예2-2) group by를 사용해서 '신'씨를 가진 데이터가 몇 개인지 살펴보기

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

Group by 제대로 알아보기: SQL 쿼리가 실행되는 순서

from → group by → select

  1. from users: users 테이블 데이터 전체를 가져옵니다.
  2. group by name: users 테이블 데이터에서 같은 name을 갖는 데이터를 합쳐줍니다.
  3. select name, count(*): name에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 세어줍니다.

예1) users 테이블 전체 불러오기

select * from users;

예2) users 테이블에서 '신' 씨를 가진 데이터만 불러와서 개수 살펴보기

select * from users 
where name = "신**";

예3) group by를 사용해서 '신'씨를 가진 데이터가 몇 개인지 살펴보기

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

Group by 기능 알아보기

동일한 범주의 개수 구하기 : count(*)

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

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

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

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

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

동일한 범주의 평균 구하기 : avg(필드명)

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

동일한 범주의 합계 구하기 : sum(필드명)

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

Order by 개념

깔끔한 정렬이 필요할 땐 Order by를 사용하면 한 번에 정렬할 수 있어요.

원본 쿼리 살펴보기

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

결과의 개수 오름차순으로 정렬해보기

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

결과의 개수 내림차순으로 정렬해보기

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

[꿀팁!] 여기서의 desc는 내림차순을 의미하는 영단어 descending의 약자입니다.

Order by 사용해보기

예1) like를 많이 받은 순서대로 '오늘의 다짐'을 출력해 볼까요?

select * from checkins
order by likes desc;

Order by 제대로 알아보기: SQL 쿼리가 실행되는 순서

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에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 세어줍니다.

    예) 이, 이, 김, 김, 박 이렇게 데이터가 있었다면, 이는 2개, 김은 2개, 박은 1개겠죠!

  4. order by count(*): 합쳐진 데이터의 개수에 따라 오름차순으로 정렬해줍니다.

Where와 함께 사용해보기

Where와 Group by, Order by 함께 사용해보기

Where절로 조건이 하나 추가되고, 그 이후에 Group by, Order by가 실행되는 것!

Q) 웹개발 종합반의 결제수단별 주문건수 세어보기

[순서]
1. orders 테이블에서 주문 데이터를 읽어오고
2. 웹개발 종합반 데이터만 남기고
3. 결제수단(범주) 별로 그룹화하고
4. 결제수단별 주문건수를 세어준다!

select payment_method, count(*) from orders
where course_title = "웹개발 종합반"
group by payment_method;

더 알아보기: SQL 쿼리가 실행되는 순서

위 쿼리가 실행되는 순서: from → where → group by → select

Order by, Group by 같이 연습해보기

Order by 연습하기

1) 문자열을 기준으로 정렬해보기

select * from users
order by email;
select * from users
order by name;

2) 시간을 기준으로 정렬해보기

select * from users
order by created_at desc;

Group by 연습하기

Q1) 앱개발 종합반의 결제수단별 주문건수 세어보기

select payment_method, count(*) from orders
where course_title = "앱개발 종합반"
group by payment_method;

Q2) Gmail 을 사용하는 성씨별 회원수 세어보기

select name, count(*) from users
where email like '%gmail.com'
group by name;

Q3) course_id별 '오늘의 다짐'에 달린 평균 like 개수 구해보기

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

Where절을 사용해서 조건에 맞는 주문데이터만 추출하기

Q) naver 이메일을 사용하면서, 웹개발 종합반을 신청했고 결제는 kakaopay로 이뤄진 주문데이터를 추출하는 코드를 작성해주세요.

select payment_method, count(*) from orders
where email like '%naver.com' and course_title = '웹개발 종합반'
group by payment_method

출처 : [스파르타코딩클럽] 엑셀보다 쉬운 SQL - 2주차

0개의 댓글