엑셀보다 쉬운 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(*)
——
- From users => 테이블 데이터 전체를 가져옴
- Group by name => 테이벌 데이터에서 같은 name을 갖는 데이터를 합쳐줌
- Select name, count(*) => name에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 세어줌
- 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 |