Database/SQL

[MySQL] [스파르타코딩클럽 SQL] Group by, Order by

Ella_K 2022. 7. 9. 16:20

Group by

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

  • 성씨별 회원수 구하기
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에 따라 합쳐진 데이터가 각각 몇개가 합쳐진 것인지 세어준다.

 

  • 동일한 범주 개수 구하기 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;
(1) 원하는 테이블 (2) 범주로 사용할 필드 (3) 범주에 따라 통계를 계산하고 싶은 필드
(1) checkins 테이블에서
(2) week (주차) 별로
(3) likes ('오늘의 다짐'의 좋아요 수) 의 최솟값을 구하기

 

  • 동일한 범주에서의 최댓값 구하기 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;
반올림 해서 보이고 싶을 때는 round를 사용한다.
round(x, digit) : x를 digit 자릿수까지 보이도록 반올림(digit + 1 자릿수에서 반올림)
select 범주가 담긴 필드명, round(avg(평균값을 알고 싶은 필드명), digit) from 테이블명
group by 범주가 담긴 필드명;

 

  • 동일한 범주의 합계 구하기 sum
select 범주가 담긴 필드명, sum(합계를 알고 싶은 필드명) from 테이블명
group by 범주가 담긴 필드명;
-- 주차별 '오늘의 다짐'의 좋아요 합계 구하기
select week, sum(likes) from checkins
group by week;

 

  • where과 같이 쓰기
-- Gmail 을 사용하는 성씨별 회원수 세어보기
select name, count(*) from users
where email like '%gmail.com'
group by name;
쿼리 실행 순서: (1)from → (2)where → (3)group by → (4)select 
(1) email과 name 필드가 있는 users 테이블에서 데이터를 가져온다.

(2) gmail을 사용하는 user 데이터만 가져온다.
(3) users 테이블 데이터에서 같은 name을 갖는 데이터를 합쳐준다.
(4) name에 따라 합쳐진 데이터가 각각 몇개가 합쳐진 것인지 세어준다.
(name과 count 만 표기)

 

Order by

데이터를 정렬

  • 숫자, 문자열, 알파벳, 시간 기준으로 모두 정렬 가능
-- 문자열 기준 정렬
-- 기본적으로 오름차순 정렬된다.
select * from users
order by email; 

-- 오름차순 정렬
select * from users
order by email asc;

-- 내림차순 정렬
select * from users
order by email desc;

 

  • group by 와 같이 쓰기
-- Gmail 을 사용하는 성씨별 회원수를 오름차순 정렬
select name, count(*) from users
where email like '%gmail.com'
group by name
order by count(*);
쿼리 실행 순서: from → where → group by → select → order by

 

쿼리 작성 팁

(1) 원하는 테이블 (2) 범주로 사용할 필드 (3) 범주에 따라 통계를 계산하고 싶은 필드 세가지 기억하기

  1. show tables로 어떤 테이블이 있는지 살펴본다.
  2. 제일 원하는 정보가 있을 것 같은 테이블에 < select * from 테이블명 limit 10 > 쿼리를 작성해 정보가 있는지 확인해본다.
  3. 원하는 정보가 없으면 다른 테이블에 2. 를 다시 해본다.
  4. 원하는 정보가 있는 테이블을 찾았으면 범주를 나뭐서 보고싶은 필드를 찾는다.
  5. 범주별로 통계를 보고싶은 필드를 찾는다.
  6. 쿼리 작성  

 

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

cnt 로 출력된다.

 


Source

스파르타 코딩클럽 내일배움단 엑셀보단 쉬운 SQL 2주차