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

모선영·2022년 1월 25일
0

SQL

목록 보기
2/5

[목표]

  1. 동일한 범주의 데이터를 묶어서 통계를 내주는 Group by를 이해
  2. 출력하는 데이터를 필드의 값으로 정렬하여 출력하는 Order by를 익히기
  3. 조금 더 복잡한 분석을 위해 자주 사용되는 유용한 문법을 익히기

01. Group by

1) Group by란?

동일한 범주를 갖는 데이터를 하나로 묶어서, 범주별 통계를 내주는 것을 의미해요.
Group by를 이용하면 1) 같은 성씨의 데이터를 하나로 묶고 2) 각 성씨의 회원수를 구할 수 있어요.

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

성씨별로 회원이 몇 명인지, 세어진 것을 확인할 수 있죠?

  1. from users: users 테이블에서 데이터를 불러옵니다
  2. group by name: name이라는 필드에서 동일한 값을 갖는 데이터를 하나로 합쳐줍니다
  3. select name, count(): 이름과 count()를 출력해 주는데, 여기서 count(*)는 group by로 합쳐진 데이터의 개수를 세어주는 것입니다!

2) Group by : SQL 쿼리가 실행되는 순서

👉 위 쿼리가 실행되는 순서: from → group by → select

  1. from users: users 테이블 데이터 전체를 가져옵니다.
  2. group by name: users 테이블 데이터에서 같은 name을 갖는 데이터를 합쳐줍니다.
  3. select name, count(*): name에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 세어줍니다.
    예) 이, 이, 김, 김, 박 이렇게 데이터가 있었다면, 이는 2개, 김은 2개, 박은 1개겠죠!

02. Group by 기능 알아보기

1) 동일한 범주의 개수 구하기

👉 동일한 범주의 갯수는 count(*)를 사용해서 해요.

▶︎ 주차별 '오늘의 다짐' 개수 구하기

select week, count(*) from checkins
group by week;
select 범주별로 세어주고 싶은 필드명, count(*) from 테이블명
group by 범주별로 세어주고 싶은 필드명;

2) 동일한 범주에서의 최솟값 구하기

👉 동일한 범주 특정 필드의 최솟값은 min(필드명)을 사용해서 해요.

▶︎ 주차별 '오늘의 다짐'의 좋아요 최솟값 구하기

select week, min(likes) from checkins
group by week;
select 범주가 담긴 필드명, min(최솟값을 알고 싶은 필드명) from 테이블명
group by 범주가 담긴 필드명;

3) 동일한 범주에서의 최댓값 구하기

👉 동일한 범주 특정 필드의 최댓값은 max(필드명)을 사용해서 해요.

▶︎ 주차별 '오늘의 다짐'의 좋아요 최댓값 구하기

select week, max(likes) from checkins
group by week;
select 범주가 담긴 필드명, max(최댓값을 알고 싶은 필드명) from 테이블명
group by 범주가 담긴 필드명;

4) 동일한 범주의 평균 구하기

👉 동일한 범주 특정 필드의 평균값은 avg(필드명)을 사용해서 해요.

▶︎ 주차별 '오늘의 다짐'의 좋아요 평균값 구하기

select week, avg(likes) from checkins
group by week;
select 범주가 담긴 필드명, avg(평균값을 알고 싶은 필드명) from 테이블명
group by 범주가 담긴 필드명;
select week, round(avg(likes),2) from checkins
group by week;

평균을 구할 때는 소수점이 나와서 보기 좋지가 않아, round(필드명,소수점자리수)를 함께써서 원하는 숫자로 표기해요. 0은 그냥 반올림. 2는 소수점 둘째자리까지 표기.

5) 동일한 범주의 합계 구하기

👉 동일한 범주 특정 필드의 합계는 sum(필드명)을 사용해서 해요.

▶︎ 주차별 '오늘의 다짐'의 좋아요 합계 구하기

select week, sum(likes) from checkins
group by week;
select 범주가 담긴 필드명, sum(합계를 알고 싶은 필드명) from 테이블명
group by 범주가 담긴 필드명;

03. Order by

: 깔끔한 정렬이 필요할 땐?

1) 오름차순으로 정렬해보기

👉 기존 작성된 코드에 order by count(*) 만 추가해줬어요.
갯수 (count(*) 값)을 기준으로 정렬해달라는 뜻이에요.

  • 기본 오름차순으로 asc(어센딩)정렬되며, 내림차순은 desc(디센딩) 추가

▶︎ 성씨별 회원수 데이터를 오름차순으로 정렬해보기

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

2) 내림차순으로 정렬해보기

👉 order by count(*)에 desc만 붙여줬어요.

▶︎ 성씨별 회원수 데이터를 내림차순으로 정렬해보기

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

3) Order by 사용해보기

▶︎ like를 많이 받은 순서대로 '오늘의 다짐'을 출력해 볼까요?

select * from checkins
order by likes desc;
select * from 테이블명
order by 정렬의 기준이 될 필드명;

4) Order by : SQL 쿼리가 실행되는 순서

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

👉 위 쿼리가 실행되는 순서: from → group by → select → order by

  1. from users: users 테이블 데이터 전체를 가져옵니다.
  2. group by name: users 테이블 데이터에서 같은 name을 갖는 데이터를 합쳐줍니다.
  3. select name, count(*): name에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 세어줍니다.
    예) 이, 이, 김, 김, 박 이렇게 데이터가 있었다면, 이는 2개, 김은 2개, 박은 1개겠죠!
  4. order by count(*): 합쳐진 데이터의 개수에 따라 오름차순으로 정렬해줍니다.

04. Where와 함께 사용해보기

1) Where와 Group by, Order by 함께 사용해보기

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

😎 원리는 간단해요. Where절로 조건이 하나 추가되고, 그 이후에 Group by, Order by가 실행되는 것!

[순서]

  1. orders 테이블에서 주문 데이터를 읽어오고
  2. 웹개발 종합반 데이터만 남기고
  3. 결제수단(범주) 별로 그룹화하고
  4. 결제수단별 주문건수를 세어준다!
select payment_method, count(*) from orders
where course_title = "웹개발 종합반"
group by payment_method;

위와 같이, group by와 select 사이에 where로 조건을 넣어주면 끝!

2) SQL 쿼리가 실행되는 순서

👉 위 쿼리가 실행되는 순서: from → where → group by → select

  1. from orders: users 테이블 데이터 전체를 가져옵니다.
  2. where course_title = "웹개발 종합반": 웹개발 종합반 데이터만 남겨줍니다.
  3. group by payment_method: 같은 payment_method을 갖는 데이터를 합쳐줍니다.
  4. select payment_method, count(*): payment_method에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 세어줍니다.
    예) CARD, CARD, kakaopay 이렇게 데이터가 있었다면, CARD는 2개, kakaopay는 1개겠죠!

만약 order by가 추가된다면? order by는 맨 나중에 실행됩니다! (결과물을 정렬해주는 것이기 때문!)

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

1) 별칭 기능: Alias

쿼리가 점점 길어지면서 종종 헷갈리는 일이 생길 수 있습니다. 그래서 SQL은 Alias(알리아스)라는 별칭 기능을 지원합니다.

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

요렇게 테이블에 이름을 붙여서 별칭을 추가하는 것도 가능하고,

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

출력될 필드에 as를 붙여서 별칭을 추가하는 것도 가능해요! 그럼, count(*)가 아니라 cnt로 출력되었네요!

06. 2주차 숙제

네이버 이메일을 사용하여 앱개발 종합반을 신청한 주문의 결제수단별 주문건수 세어보기

select payment_method, count(*) from orders
where email like '%naver.com' and course_title = '앱개발 종합반'
group by payment_method

2주차 수업 완강했어요 👏

💡 공부를 마치며...

1) order by의 기본정렬은 오름차순이며, 내림차순정렬은 desc를 붙이면 돼요.
2) 평균을 구하는 avg(필드명)은 보통 소수점자리로 계산되어, round()와 함께 쓰면 좋아요. round(avg(필드명),소수점자리수)로 표기하며, 0은 일단위, 2는 소수점 둘째자리까지 표시한다는 의미이다.
3) OO별..에서 OO이 범주필드를 의미한다.

profile
Product Manager

0개의 댓글