본문 바로가기

SQL

[스파르타코딩클럽] SQL 2주차

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