Prologue:
우리가 데이터를 통해 보고 싶어하는 것은 결국 통계치이다. Raw data를 의미있는 인사이트로 변환하기 위해서는 같은 범주 내의 데이터들을 확인하고, 평균/최대/최소/개수가 얼마인지를 살펴보는 과정이 필요하다. (물론 실질적인 인사이트를 위해서는 더 복잡한 통계치, 필드 간의 관계를 확인해야 하겠지만..) 그 통계 분석의 가장 기초를 위한 이번 주차의 이야기.
*2주차의 핵심:
(1) Group by - 동일한 범주의 데이터를 묶어 통계를!
(2) Order by - 출력하는 데이터를 필드 값으로 정렬하여 출력
1. Group by
#1. 성씨별 회원 수를 확인하고 싶다. ➡️ where절을 여러 번 활용하여 도출하려면 너무나도 비효율적이다! 이럴 때 group by를 사용하자.
Tip! "~별" 이라는 표현이 등장하면 group by를 활용하면 된다.
cf. name 필드는 성만 표기되어 있다. ex. 김**, 이**, 신**
select name, count(*) from users
group by name
➡️ (1) users table을 name 필드의 각각의 범주로 묶고, (2) name과 count(*)를 표시해달라는 뜻.
1-2. 동일한 범주 특정 필드의 최소 / 최대 / 평균 / 합계 값을 구해보자
- MIN(필드값) = 최소
- MAX(필드값) = 최대
- AVG(필드값) = 평균
- SUM(필드값) = 합계
- ROUND(값, 소수점 자리 수) = 소수점 자리수까지 반올림
select week, min(likes) from resolution
group by (week)
➡️ resolution(다짐) 테이블에서 주차별로 최소 '좋아요' 수가 몇 개인지 보고 싶을 때 쓸 수 있는 식.
select week, round(avg(likes), 1) from resolution
group by (week)
➡️ resolution table에서 주차별로 평균 좋아요 수가 몇 개인지 궁금한데, 이걸 소수점 첫째자리 수까지만 표시하고 싶을 때 쓸 수 있는 식 (둘째자리에서 반올림하고 싶을 때!)
2. Order by
이렇게 나온 결과값을 보면 정렬하고 싶은 욕구가 치솟는다...! 그럴 때 쓰는 것이 바로 Order by
Order by는 숫자/문자 모두 정렬할 수 있으며, 기본값은 Ascending이다. 내림차순으로 바꾸기 위해서는 뒤에 DESC를 써주자!
select name, count(*) from users
group by name
order by count(*) desc;
➡️ 이전에 성씨 별로 몇 명의 유저가 있는지 알아보았던 코드를 그 수가 많은 순서대로 정렬하기 위해 order by count(*) desc를 덧붙였다.
3. Where과 함께 사용해보기
SQL 쿼리는 실행되는 순서가 중요하다!
select name, count(*) from users u
where email like "%@gmail%"
group by name
order by count(*) desc
[순서]
1. users 테이블에서 사용자 데이터를 읽어오고
2. email에 @gmail이 들어가는 유저 데이터만 남긴다.
3. 이를 name 필드의 동일한 범주(성씨)로 그룹화하고
4. 같은 성씨의 유저 수에 따라 내림차순으로 정렬한다.
5. 그리고 이름(성씨) 정보와 유저 수를 표시한다.
cf. 만약 count (*) as count 처럼 alias를 달아주면, 출력될 때 count라는 필드명으로 출력된다.
'SQL' 카테고리의 다른 글
[스파르타코딩클럽] SQL 1주차 (0) | 2022.01.12 |
---|