이번 2주차에서는 통계에 대해서 배운다. 즉 최대/최소/평균/개수 등을 구하는 방법에 대해서 다룬다.
- 데이터 분석의 목적은 쌓여있는 날것의 데이터를 의미를 갖는 '정보'로의 변환을 말한다.
- 데이터베이스 테이블에 저장된 데이터는 쌓여있는 날것의 데이터를 의미하고
- 이 중 가장 많은 Like를 받은 사람의 이름, 전체 신청자 수, 평균 연령 등이 의미있는 '정보'이다.
- 더 나아가면 '범주(catagory)' 각각의 정보가 궁금할 수 있다.
예) 과목별 신청자 평균 연령, 과목별, 신청자수, 성씨별 회원수 등.
(예시) 과목별 신청자 수
select count(*) from orders
where course_title = "앱개발 종합반";
select count(*) from orders
where course_title = "웹개발 종합반";
각각 총 두 개의 과목이 있으니, 두 개의 쿼리를 작성해서 구할 수 있다.
(예시) 이번에는 성씨 별 회원수를 구해보자!
1주차에서 쿼리로 확인 했듯이, 스파르타 회원의 성씨는 총 54개이다.
select distinct(name) from users;
이때 54번의 쿼리를 작성하는 것이 아닌, 동일한 범주의 데이터를 묶어주는 Group by가 있다.
(예시)
select name, count(*) from users
group by name;
위와 같은 쿼리를 실행하면, 아래와 같은 결과물이 나온다.
성씨별로 회원이 몇 명인지 알 수 있다.
쿼리 뜯어보기!
1. from users
: users 테이블에서 데이터를 불러온다.
2. group by name
: name이라는 필드에서 동일한 값을 갖는 데이터를 하나로 합쳐준다.
3. select name, count(*)
: 이름과 count(*)
를 출력해 주는데, 여기서 count(*)
는 group by로 합쳐진 데이터의 개수를 세어주는 것이다!
쿼리가 실행되는 순서: from
→ group by
→ select
1. from users
: users 테이블 데이터 전체를 가져온다.
2. group by name
: users 테이블 데이터에서 같은 name을 갖는 데이터를 합쳐준다.
3. select name
, count(*)
: name에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 세어준다.
예) 이**, 이**, 김**, 김**, 박** 이렇게 데이터가 있었다면, 이**는 2개, 김**은 2개 , 박**은 1개다.
(예시) 1. users 테이블 전체 불러오기
select * from users;
select * from users
where name = "신**";
1주차에서 배웠던 where를 사용해서 뽑는다. 총 14개가 나온다.
select name, count(*) from users
group by name;
이렇게 하면 총 14개로 동일하게 나온다!
checkins
테이블을 사용한다.select * from checkins limit 10
checkins 테이블이 나온다.
- week: 수강생이 '오늘의 다짐'을 남긴 시점의 강의 주차를 의미한다.
- likes: 남긴 '오늘의 다짐' 게시물에 달린 좋아요의 수를 의미한다.
(예시) 주차별 '오늘의 다짐' 개수 구하기
select week, count(*) from checkins
group by week;
select 범주별로 세어주고 싶은 필드명, count(*) from 테이블명
group by 범주별로 세어주고 싶은 필드명;
(여기선, week가 범주별로 세어주고 싶은 필드명)
select week, min(likes) from checkins
group by week;
select 범주가 담긴 필드명, min(최솟값을 알고 싶은 필드명) from 테이블명
group by 범주가 담긴 필드명;
(여기서는, 범주가 담긴 필드명은 week, 최솟값을 알고 싶은 필드명은 likes.)
select week, max(likes) from checkins
group by week;
select 범주가 담긴 필드명, max(최댓값을 알고 싶은 필드명) from 테이블명
group by 범주가 담긴 필드명;
(여기서는, 범주가 담긴 필드명은 week, 최대값을 알고 싶은 필드명은 likes 이다.)
select week, avg(likes) from checkins
group by week;
select 범주가 담긴 필드명, avg(평균값을 알고 싶은 필드명) from 테이블명
group by 범주가 담긴 필드명;
(여기서는, 범주가 담긴 필드명은 week, 평균값을 알고 싶은 필드명은 likes이다.)
select week, sum(likes) from checkins
group by week;
select 범주가 담긴 필드명, sum(합계를 알고 싶은 필드명) from 테이블명
group by 범주가 담긴 필드명;
(여기서는, 범주가 담긴 필드명은 week, 합계를 알고 싶은 필드명은 likes이다.)
<원본 쿼리>
select name, count(*) from users
group by name;
<결과의 개수 오름차순으로 정렬해보기>
select name, count(*) from users
group by name
order by count(*);
아까 코드에 order by count(*) 만 추가한다.
갯수 (count(*) 값)을 기준으로 정렬해달라는 뜻이다.
<결과의 개수 내림차순으로 정렬해보기>
select name, count(*) from users
group by name
order by count(*) desc;
여기서의 desc는 내림차순을 의미하는 영단어 descending의 약자이다.
<like를 많이 받은 순서대로 '오늘의 다짐' 출력해보기>
select * from checkins
order by likes desc;
select * from 테이블명
order by 정렬의 기준이 될 필드명;
이 예시에서는, like의 갯수가 정렬의 기준이 되는 필드명이다.
select name, count(*) from users
group by name
order by count(*);
위 쿼리가 실행되는 순서: from
→ group by
→ select
→ order by
< 웹개발 종합반의 결제수단별 주문건수 세어보기 >
select payment_method, count(*) from orders
where course_title = "웹개발 종합반"
group by payment_method;
위 쿼리가 실행되는 순서: from
→ where
→ group by
→ select
(1) 원하는 테이블과 (2) 범주로 사용할 필드 (3) 범주에 따라 통계를 계산하고 싶은 필드(개수의 경우 제외) 이 세가지를 기억한다!
[퀴즈1] 앱개발 종합반의 결제수단별 주문건수 세어보기
힌트: (1)원하는 테이블: orders (2) 범주로 사용할 필드: payment_method
select payment_method, count(*) from orders
where course_title = "앱개발 종합반"
group by payment_method;
[퀴즈2] Gmail을 사용하는 성씨별 회원수 세어보기
힌트: where와 like를 함께 쓰기
select name, count(*) from users
where email like '%gmail.com'
group by name;
[퀴즈3] 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