본문 바로가기

내일배움캠프_개발일지/SQL

스파르타 SQL 2주차 일지

엑셀보다 쉬운 SQL 강의 2주차.

 

- 2주차에서는 통계를 다루는 방법과 원하는 범주의 데이터를 묶어주는 방법, 그리고 깔끔하게 데이터를 정렬하는 방법을 배울거야.

 

 

Group by.

=> 동일한 범주를 갖는 데이터를 하나로 묶어서, 범주별 통계를 내주는 기능을 함. 

즉 특정 필드를 정하고, 그 필드의 값이 같은 것들끼리 묶어주는 거야.

 

예를 들어서,

——

select name, count(*) from users

group by name

——

=> name 을 기준으로 group by를 할거야. 근데 그렇게 하면 각 성이 종류별로 한 개씩만 도출돼.

해당 테이블의 데이터 갯수는 총 498개, 성 종류는 54개야. 그러면 각 성별로 데이터가 하나씩 나와서 총 54개의 데이터가 완성.

허나 이건 그냥 각 성별의 종류만 알 수 있고, 또 각 성별 별로 몇 명이 있는지는 알 수 없어.

그래서 select 를, *이 아니라 name과 count(*) 를 뽑아오는거지.

여기서 count(*) 의 *는 group by가 적용된 후의 데이터의 전체를 의미해.

그래서 그룹으로 묶인 name들의 각각의 갯수를 출력해줘.

====> 즉, group by 안에서 count 를 세면, 그룹으로 묶인 항목들의 갯수를 세어주는 거야.

  count 없이는 걍 같은 항목 별로 묶인 모습만 보여주기 때문에, 정확한 항목별 개수는 보이지 않는 거야.

 

* 여기서 중요한 것을 알 수 있어. SQL 쿼리문의 실행 순서에 대해서야.

from -> group by -> select

  위와 같은 순서대로 쿼리문이 실행 되는 걸 확인할 수 있어.

 

 

 

 

 

그렇다면, group by와 where 를 같이 쓰고 싶다면?

Group by의 여러 기능들을 살펴보자. 이번에 주로 살펴볼 테이블은 checkins 테이블.

 

우선, 주차 별로 오늘의 다짐 개수를 구해보자.

——

select week, count(*) from checkins

group by week

——

첫 번째 예제와 같아. 첫 번째가 이름 별로 묶어서 각 종류들의 각각의 개수를 구하는 것이라면,

두 번째 예제에서는 주차 별로 묶어서 각 주차들의 개수를 구하는거야. * 각 주차별로 ‘오늘의 다짐’ 의 개수를 구한거지.

즉 where week = 1 / where week = 2 / where week = 3  이런 식으로 개수를 구해서 한 번에 보고 있는 것과 같은 효과.

 

 

 

 

 

다음으로, 동일한 범주 안에서 최소값을 구해보자. 참고로 min, max 뒤의 () 안에 들어가는 것은 *이 아니라, 내가 값을 구하고 싶은 필드명이 들어가야 해.

 

-주차별 ‘오늘의 다짐’ 의 좋아요 최솟값 구하기

——

select week, min(likes) from checkins

group by week

——

=> 우선 group by로 week 별로 묶어버리고, select 로는 보기 쉽게 week 와

likesd의 최솟값, 즉 min(likes) 를 select 한다.

이렇게 하면 주차별로 해당 주차에 속하는 데이터들 중 likes 가 가장 작은 수치가 몇인지 보여주는거야.

 

그럼 반대로 최댓값은?

——

select week, max(likes) from checkins

group by week 

——

=> min 을 max 로 바꿔주면 되지!

 

 

 

 

 

다음으로, 좋아요(likes)의 평균값을 구해보자!

——

select week, avg(likes) from checkins 

group by week 

——

=> average , 평균의 약자인 avg 를 사용.

 

참고로 이렇게 avg 를 사용하면 소숫점 뒷 자리가 길게 나오는데, 이걸 좀 정리하고 싶어.

——

select week, round(avg(likes), 2) from checkins 

group by week 

——

=> round 로 감싸줌으로서 소수점 뒷 자리를 몇 개까지 나오게 할 것인지 정할 수 있어.

round((), 2). 두 번째 인자인 ‘2’ 가, 소수점 뒷 자리 개수를 정해. 

만약에 round((), 0) 이렇게 0을 넣으면? 반올림을 해서 정수를 나타내줘.

 

 

 

 

 

동일한 범주의 합계를 구해보자. 더하기는 sum.

——

select week, sum(likes) from checkins

group by week 

——

=> 주차별로 좋아요 개수를 다 더해보자.

 

 

 

 

 

_____________________________________________

 

 

Order by

=>  결과를 깔끔하게 정렬하기 위해서 사용되는 명령어.

 

 

——

select name, count(*) from users

group by name

order by count(*)

——

=> users 라는 테이블의 데이터들을 name 별로 정리하여, name과 count(*) 를 출력하겠다.

그리고 맨 마지막에, 모든 항목 *의 각 종류별 개수(count) 를 기준으로 order by, 정렬을 하겠다.

 

Order by 는 기본적으로 오름차순.

첫 번째 그룹의 count 숫자가 제일 작고, 뒤로 갈 수록 count 수가 커져.

그렇다면 내림차순은?

——

select name, count(*) from users

group by name

order by count(*) desc

——

=> order by 뒤에 desc 를 붙여주면 내림차순으로 정렬해. desc는 descending 의 약자. 

참고로 오름차순은 asc 인데 order by 의 기본값이 asc 라서 명시하지 않아도 문제없어. ascending 의 약자.

 

 

 

추가로, 혹시 오해할까 싶어서!

Order by는 group by랑 상관 없이, 따로도 쓸 수 있는 문법!

——

select * from checkins

order by likes

——

요렇게!

 

 

 

****** 실행 순서 *******

——

select name, count(*) from users

group by name

order by count(*)

——

  1. From users => 테이블 데이터 전체를 가져옴
  2. Group by name => 테이벌 데이터에서 같은 name을 갖는 데이터를 합쳐줌
  3. Select name, count(*) => name에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 세어줌
  4. Order by count(*) => 합쳐진 데이터 갯수에 따라서 최종적으로 데이터를 정렬.

 

 

 

 

 

___________________________

 

Group by, order by 를 where 와 함께 사용해보자.

 

여기까지는 group by 와 order by를 어떻게 사용하는지, 어떤 역할을 하는지 배워봤어.

그렇다면 조건문! Where 를 group by와 같이 쓰고 싶을 땐 어떻게 쓰는지도 알아보자!

 

 

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

 

우선 결재수단별 주문건수를 세어보자.

——

select payment_method, count(*) from orders

group by payment_method

——

 

그 다음 where 를 어느 부분에 추가해줘야 할 지 생각해봐.

——

select payment_method , count(*) from orders

where course_title = "웹개발 종합반"

group by payment_method

order by count(*)

——

해결.

* 참고로 order by count(*) 는 count(*) 항목(필드)의 숫자들을 기준으로 정렬하는거야.

  이게 가능한 이유? Select 에서 patment_method, count(*) 라고 항목의 이름을 정해줬으니까.

 

실행 순서 : from orders 로 데이터 가져오고 -> where 로 데이터 잘라내고 -> group payment_mothod 를 기준으로 그룹을 묶고

-> select 로 보고싶은 필드를 정하고 -> order 로 정렬한다.

 

 

 

 

_______________________________________

 

2주차 같이 삽질해보기. 에러에 대응하는 능력을 길러나가자.

 

 

——

Select * from orders

Group by payment_method

——

=> 이런 경우, payment_method 의 값을 기준으로 해서 같은 것들끼리 묶긴 했는데,

뭘 통계내라고 명시를 하지 않았기 때문에 각 항목 별로 대표하는 한 가지만 보여줘.

count, min, max, avg, sum 등 특정 통계를 내라는 정보를 알려줘야 해.

 

 

——

Select payment_method, count(*) orders

Group by payment_method

——

=> 그룹을 지은 것들을 count로 헤아려서 각 그룹별 총 개수를 출력하라.

헌데 그냥 숫자만 있으면 이게 뭔 숫자인지 모르잖아? 그래서 select 에 payment_method 를 추가하는거지. 보기 쉽게 말이야.

 

 

  • 중요한 것
  • 에러 메시지가 나와도 당황하지 않는 것.
  • 내가 원하는 결과가 나오더라도 왜 이렇게 됐을까 생각해보고 수정하는 것.

 

 

 

 

 

_____________________________________________

 

Group by, order by, where 조합으로 퀴즈 풀면서 연습해보기.

 

 

 

Order by는 숫자 뿐 아니라 문자열을 기준으로도 정렬할 수 있어.

——

select * from users

order by name desc

——

=> 한글이면 가나다순, 영어면 abc순으로 정렬.

 

 

뿐만 아니라 시간으로도 가능해.

——

select * from users

order by created_at 

——

=> 시간 순으로 정렬 가능. desc도 가능해.

 

 

 

퀴즈. 앱개발 종합반의 결제수단별 주문건수 세어보기

——

select payment_method , count(*) from orders

where course_title = "앱개발 종합반"

group by payment_method 

——

=> where 로 결제 강의를 ‘앱개발 종합반’ 으로 추리고, group by로 결제수단별로 그룹을 지었어.

그리고 count(*) 로 결제수단별 주문건수를 세어 보았지.

 

 

퀴즈2. Gmail 을 사용하는 성씨별 회원수 세어보기

——

select name, count(*) from users

where email like '%gmail.com'

group by name 

order by name

——

=> users 테이블에서 데이터를 가져오고, 우선 Gmail 만 사용하는 유저를 간추렸어.

그리고 이름 별로 그룹을 묶고, 그 중에서 이름 필드와 각 성별의 그룹별 개수를 가져왔어.

마지막으로 이름순으로 데이터를 정렬했지.

 

 

퀴즈3. Coure_id별 ‘오늘의 다짐’ 에 달린 평균 like 갯수 구해보기.

——

select course_id, round(AVG(likes), 2) from checkins 

group by course_id

——

하는 김에 소수점도 2자리 까지만 나오도록 명령해보자.

 

 

 

 

________________________________________________

 

별칭 기능. Alias 에 대해서.

 

 

 

쿼리가 점점 길어지면서 종종 헷갈리는 일이 발생할 수 있어. 그래서 SQL은 Alias 라는 별칭 기능을 지원.

join을 사용하게 되면 sql이 본격적으로 길어져.

 

——

select payment_method, count(*) as cnt from orders o

where course_title = '앱개발 종합반'

GROUP by payment_method 

——

=> from orders o -> 앞으로는 해당 쿼리문 안에서는 orders 를 o 라고 부르겠다.

    count(*) as cnt   ->  sql 문법에 따라 데이터가 출력되었을 , count(*) 라는 필드명을 cnt 바꾸겠다.

'내일배움캠프_개발일지 > SQL' 카테고리의 다른 글

스파르타 SQL 4주차 일지  (1) 2022.10.31
스파르타 SQL 3주차 일지  (0) 2022.10.31
스파르타 SQL 1주차 일지  (0) 2022.10.28