본문 바로가기
자기계발/개발일지

[SQL] 스파르타코딩클럽 내일배움단 "엑셀보다 쉬운 SQL" 2주차 개발일지 (내일배움카드 SQL)

by 직업인 2022. 12. 22.
반응형

2주차

1주차 후루룩 듣고 한동안은 파이썬만 들으면서 SQL은 한참 뭉개다가 진도사우루스가 쫓아오셔서(?) 다시 시작한 2주차. (찐한 관리 매니저가 문자를 주셨다 ^ㅅ^;)

 

그럼 2주차 가보자고!

 

1. 오늘 배울 것

  • 지난 시간에서는 테이블 데이터 중 우리 입맛에 맞는 것만 뽑아서 봤었다. 이번에는 통계적인 숫자들인 최댓값, 최솟값, 평균, 개수를 구해볼 것이다. 즉 의미 있는 정보를 구해 보는 것!
  • 이런 것들은 카테고리(범주)로 묶어 줘야 한다. 
  • (예) 성씨별로 회원수를 구하고 싶은데, 이걸 성씨별로 일일이 다 쓰고 있을 수 없으니 동일한 범주의 데이터를 묶어주는 'Group by', 'Order by'를 배워 볼 것이다. 이를 통해 성씨를 오름차순/내림차순 등으로 정리할 수 있게 될 것.

 

2. 범주의 통계를 내주는 Group by

성씨별로 몇 명의 회원이 있는지 알아보자.

select * from users
group by name

이렇게 먼저 해 놓고, * 부분을 바꿔준다.

select name, count(*) from users
group by name

= name으로 묶은 것과, 묶은 것 당 카운트를 보여 줘!

 

 이렇게 하면 이 씨는 85명, 신 씨는 14명,.. 식으로 데이터가 쭉 나온다. 총 54개의 성씨가 있음을 알 수 있음.

 

 지난 시간에서는 count *로 전체를 다 셌는데, 이와 다르게 이번에는 group by로 count를 쓴다. 그러면 

이때 순서가 중요한데, 위에서부터 한 번에 쭉 쓴 게 아니라 select * from user인데 group by name으로 묶었다 -> 아 그러면 name과 count(*)를 보고 싶은 거구나 한다. 한 번에 쓰지 않기. 선생님도 다 알아도 이 순서대로 차근차근 씀!

 

퀴즈: where절을 함께 쓰고 싶다면?

(예) naver 메일을 쓰는 사람 중에 성씨별로 몇 명이 있는지 보고 싶다고 하면?

상상해 보고 지나가기.

 

3. Group by, Order by 사용해 보기

- 데이터를 묶어 보고 싶다면, Group by

 이번에는 group by의 여러 기능을 배워 보겠다. checkins(주차별 코멘트와 like 정보) 테이블을 쓸 것이다.

select * from checkins

 

1. 주차별로 오늘의 다짐 개수를 구해라!

>> 그러면 주차별(week)로 묶어야 한다. (group by)

그다음에 개수를 구한다. count(*).

select week, count(*) from checkins
group by week

 

다 한 것은 where문으로 검증 가능

select * from checkins
where week = 1

그럼 밑으로 쭉 내려보면 96개가 맞다.

 

2. 주차별로 오늘의 다짐 좋아요의 최솟값(min)을 구해라!

일단 불러온다.

select * from checkins

 

그다음 최솟값을 의미하는 min(필드명)을 사용해 본다.

select week, min(likes) from checkins
group by week

 

최댓값은? max(필드명).

select week, max(likes) from checkins
group by week

 

평균은? avg(필드명).

select week, avg(likes) from checkins
group by week

 

이때 소수점이 너무 길어서 반올림을 해 주고 싶다면?

round로 감싸고 , 뒤에 몇 자리까지인지 넣어 준다. 안 넣으면 그냥 반올림.

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

 

합계를 구하고 싶다면? sum

select week, sum(likes) from checkins
group by week

>>> 주차별로 좋아요를 더한 값이 나온다.

 

검증하려면 어케 해야 하죠

where문을 통해 검증한다.

select * from checkins
where week = 3

 

팁: count(개수 구하기)가 제일 많이 쓰인다.

팁 2: 첫 줄에 select week <- 이거 week 안 써도 에러가 나지는 않는다. 근데 뭐가 뭔지 알기 어려우니까 헷갈리지 않도록 윗줄에 써주는 것이다. 이거 안 쓰면 week이 몇 주 차인지 안 나오고 개수만 나온다.

 

- 깔끔하게 정렬하고 싶다면, Order by

정렬은 할 거 다 하고 맨 마지막에 해야겠죠?

일단 그룹 바이를 먼저 한다.

select name, count(*) from users
group by name

 

그다음 order by + 필드 그대로 count(*)를 써주면 된다.

select name, count(*) from users
group by name
order by count(*)

 

아무것도 안 붙이면 기본적으로 오름차순이다. (안 써도 되긴 하지만 참고로: asc, ascending이라는 뜻)

만약 내림차순으로 하고 싶다면 끝에 desc(descending)을 쓰면 된다.

 

 

근데 무조건 그룹을 먼저 하고 오더를 하는 건가영?

아님. 꼭 둘이 같이 써야 한다고 정해진 건 아니다.

 

한번 해 보자.

select * from checkins

 

이걸 like의 역순으로 정렬하고 싶다면 - 그룹 할 필요 없음.

select * from checkins
order by likes desc

 

실행 순서 (중요)

select name, count(*) from users
group by name
order by count(*)

위 쿼리의 실행되는 순서: from > group by > select > order by

 

1. users에서

2. name으로 묶는다

3. 그리고 name과 count를 출력한다

2. 그다음에 마지막으로 정렬한다

 

; (세미콜론)

여러 쿼리를 썼을 때 구분해 주기 위함임.

 

where절과 group/order by 함께 사용하는 법

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

일단 웹개발 종합반 빼고 결제수단별 주문건수만 세어 보자.

select payment_method, count(*) from orders 
group by payment_method

 

웹개발 종합반이라는 조건을 걸고 싶은데 - 일단 이 테이블을 where로 잘라라.

select * from orders
where course_title = '웹개발 종합반'

 

이다음에 group by를 해 주는 것이다.

select payment_method, count(*) from orders 
where course_title = '웹개발 종합반'

group by payment_method

 

퀴즈: count로 오름차순으로 정렬하고 싶다면?

order by를 밑에 붙여주면 되겠져.

select payment_method, count(*) from orders 
where course_title = '웹개발 종합반'

group by payment_method
order by count(*)

 

만약 내림차순이라면 끝에 desc를 붙이면 된다.

 

 

4. 같이 삽질해 보기

하다 보면 당연히 에러가 날 수 있다. 그럴 때의 마음가짐:

  1. 에러가 나도 당황하지 않고 에러 메시지를 읽는다.
  2. 내가 원하는 결과가 안 나와도 왜 그랬을까 생각해 보고 수정해 보고 다시 해 본다.

 

5. Group by, Order by 같이 연습해 보기

Order by 연습해 보기

문자로도 정렬할 수 있다.

기본적으로 abc, 가나다순으로 정렬되고 desc를 붙여주면 z, ㅎ부터 정렬된다.

select * from users
order by email

 

시간으로도 정렬이 가능하다.

select * from users
order by created_at

 

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

select payment_method, count(*) from orders
where course_title = '앱개발 종합반'
group by payment_method 

 

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

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

 

+반올림: round 추가하면 됨

select course_id, round(avg(likes)) from checkins
group by course_id

 

꿀팁:

SQL group by 쿼리 작성 꿀팁
SQL group by 쿼리 작성 꿀팁

 

6. 이외 유용한 문법 배워보기

SQL의 별칭 기능: Alias ('알리아스'라고 읽는다)

쿼리가 길어지면 점점 헷갈리는데(지금은 짧지만 다음 시간부터 길어질 것), 이때 필드명이나 테이블명에 별칭을 붙여 주는 기능.

 

예 1:

select * from orders
where course_title = '앱개발 종합반'

근데 여기서 course_title이 어느 테이블의 course_title을 얘기하는 거지? 헷갈릴 수가 있다.

이때 아무 알파벳 1글자 뒤에 를 쓰면(o라고 해보자), orders 테이블에 있는 course_title을 이야기하는 거야 라는 뜻.

select * from orders o
where course_title = '앱개발 종합반'

 

예 2:이걸 group by로 묶는다고 하자.

select payment_method, count(*) from orders o
where course_title = '앱개발 종합반'
group by payment_method

근데 이걸 실행시켰더니 count(*)이 보기가 안 좋다. 이때 count(*) 뒤에  as cnt를 붙이면 이 count(*)를 앞으로 cnt라고 부르겠다는 뜻.

select payment_method, count(*) as cnt from orders o
where course_title = '앱개발 종합반'
group by payment_method

 

아직까진 "별칭이라는 게 있다" 정도만 알아두면 되겠다.

 

7. 끝 & 숙제 설명

오늘의 숙제

네이버 이메일을 사용하여 앱개발 종합반을 신청한 주문의 결제수단별 주문건수 세어보기
select payment_method, count(*) from orders
where email like '%naver.com' and course_title = '앱개발 종합반'
group by payment_method

 

한 번에 정답스! 👏👏👏

 

 

8. 2주차 소회

역시나 친절한 스파르타코딩클럽의 2강 강의였다.

파이썬이랑 SQL을 동시에 하다 보니 확실히 SQL이 단순하고 직관적이라는 게 잘 느껴진다. 스파르타 측에서 워낙 처음 배우는 수강생들을 잘 배려해 친절하고 세심하게 설명을 해 주기도 한다.

그리고 문득 SQL은 종강까지 1주일 좀 넘게 남았다는 것을 알게 되었음 🫠 파이썬은 뒤로 미뤄두고 SQL 3, 4강을 어서어서 몰아서 들어야겠다. 빠샤!

 

반응형

댓글