<SQL 개발 일지> SQL 2주 차

Jony·2023년 2월 5일
0
post-thumbnail

스파르타코딩클럽 [왕초보] 엑셀보다 쉬운 sql

통계(최대/최소/평균/개수)

1주 차에 배웠던 것은 날것의 데이터를 추출한 것이고,
2주 차엔 의미있는'정보'의 데이터를 추출해 볼 것이다.
ex) 평균 연령, 전체 신청자 수 등

각각의 카테고리(범주)에 대한 정보의 영역까지 나아갈 수 있다.

기존에 배웠던 방법(1주 차에서 배운)은 한계가 존재한다.
예를 들면 과목 신청자 수를 보기위해 쿼리를 작성하면

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

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

두 개의 과목이므로 두 개의 쿼리를 작성하면 된다.
그러나 예를 들어 성씨별 회원 수를 구하고 싶다면 어떻게 해야 할 것인가..?
모든 쿼리를 작성 하기엔 수가 너무 많기에 다음과 같은 명령문을 사용하면 된다.

1. GROUP BY 문법

동일한 범주를 갖는 데이터를 묶어, 범주별 통계를 내주는 문법이다.

예) 성씨별로 몇 명의 회원이 있는지 알아보려면 아래의 쿼리처럼 입력하면 된다

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로 합쳐진 데이터의 개수를 세어주는 것이다.

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

1] from users: users 테이블 데이터 전체를 가져온다.
2] group by name: users 테이블 데이터에서 같은 name을 갖는 데이터를 합쳐준다.
3] select name, count(*): name에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 세어준다.

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

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

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

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

3>최댓값 구하기

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

4>평균값 구하기

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

5>합계 구하기

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

2. ORDER BY 문법

모든 sql 쿼리에 적용될 수 있는 문법이며, 데이터를 정렬하여 결과를 깔끔하게 보이게 해준다. group by와 꼭 함께 사용하지 않아도 되고, 문자열과 시간 기준으로도 사용 가능하다.

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

위의 쿼리에서 order by를 사용하면,

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

위의 사진처럼 한 번에 정리 가능하다.
여기서 기본 셋팅은 오름차순으로 정렬된다.

내림차순으로 보고 싶다면,
(desc는 내림차순을 의미하는 descending의 약자이다.)

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

SQL에서 쿼리가 실행되는 단계별 순서를 말하자면 from-> group by-> select-> order by 순서로 실행된다.

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

1] from users: users 테이블 데이터 전체를 가져온다.
2] group by name: users 테이블 데이터에서 같은 name을 갖는 데이터를 합쳐준다.
3] select name, count(): name에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 세어준다.
4] order by count(
): 합쳐진 데이터의 개수에 따라 오름차순으로 정렬해줍니다.

3. WHERE 절과 GROUP BY, ORDER BY 함께 사용하기

ex}
1] orders 테이블에서 주문 데이터를 읽어오고
2] 웹개발 종합반 데이터만 남기고
3] 결제수단(범주) 별로 그룹화하고
4] 결제수단별 주문건수를 세어준다!

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

위 쿼리가 실행되는 순서:
from-> where-> group by->select
order by가 추가된다면, select 다음으로 실행된다.(결과물 정렬)

4. Alias 문법
쿼리가 점점 길어지면서 헷갈리는 일이 생길 수 있기에 별칭기능을 지원하여 혼동을 최소화하고 원하는 이름으로 결과를 출력하기 위해 사용된다.

ex}

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

<2주 차 숙제>

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

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

이제 본격적으로 sql에 대해 배우는 것 같아 재미도 있지만 그만큼 공부할 양도 있고 약간의 어려움도 있으니..복습을 꾸준히 해가며 공부해야겠단 생각이 든다.

profile
알면 알수록 모르는 코태계

0개의 댓글