관리 메뉴

공부기록용

SQL 2주차 본문

📚강의록📚/스파르타)SQL

SQL 2주차

과부하가즈아 2023. 6. 1. 21:41

Group by

범주의 통계를 내주는 Group by

select * from users
group by name;

▼

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

> from users: users 테이블 데이터 전체를 가져옵니다.

>> group by name: users 테이블 데이터에서 같은 name을 갖는 데이터를 합쳐줍니다.

>>> select name, count(*): name에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 세어줍니다.


동일한 범주의 개수 구하기

동일한 범주의 갯수는 count(*)를 사용한다.

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

주차별 다짐의 갯수 구하

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

 

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

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

select * from checkins
group by WEEK;

▼

select week, min(likes) FROM checkins 
group by WEEK;

> 주차별로 최소로 받은 라이크  구하기

> 범주가 담긴 필드명은 week, 최솟값을 알고 싶은 필드명은 likes

 

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

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

select * from checkins
group by WEEK;

▼

select week, max(likes) FROM checkins 
group by WEEK;

> 주차별로 최대로 받은 라이크 수 구하기

> 범주가 담긴 필드명은 week, 최대값을 알고 싶은 필드명은 likes

 

동일한 범주의 평균 구하기

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

select * from checkins
group by WEEK;

▼

select week, avg(likes) FROM checkins 
group by WEEK;

> 범주가 담긴 필드명은 week, 평균값을 알고 싶은 필드명은 likes

 

> 평균값이라 소수 점으로 떨어진다면, avg(평균값을 알고 싶은 필드명)을 round로 감싸고_round(avg( )), 숫자를 써서 나타내고 싶은 소숫점 자리를 넣어준다. (0으로 하면 그냥 반올림이 되는것)

select week, round(avg(likes), 2) FROM checkins 
group by WEEK;

 

동일한 범주의 합계 구하기

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

select * from checkins
group by WEEK;

▼

select week, sum(likes) FROM checkins 
group by WEEK;

> 범주가 담긴 필드명은 week, 합계를 알고 싶은 필드명은 likes


Order by

깔끔한 정렬이 필요할 때 사용하는 Order by

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


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

> 정렬하고 싶은 기준은 써주면 된다. order by 정렬의 기준이 될 필드명


> 기본적으로 오름차순이며, desc를 써주면 내림차순으로 정렬할 수 있다.


※ 에러가 안 나는 쿼리를 작성하기 위해서는 SQL 쿼리가 실행되는 순서를 아는 것이 중요

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

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


Where와 Group by, Order by 함께 사용하기

Where절로 조건이 하나 추가되고, 그 이후에 Group by, Order by가 실행되는 것이다. 

 

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

select payment_method, count(*) from orders 
WHERE course_title = "웹개발 종합반"
GROUP by payment_method

> orders 테이블에서 주문 데이터를 읽어오고

>> 웹개발 종합반 데이터만 남기고

>>> 결제수단(범주) 별로 그룹화하고

>>>> 결제수단별 주문건수를 세어준다!

>>>>>  순서를 미리 정립해두면 편한 것 같다

select payment_method, count(*) from orders 
WHERE course_title = "웹개발 종합반"
GROUP by payment_method
order by count(*)

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


Order by 예제1. 문자열을 기준으로 정렬해보기

select * from users
order by email;


select * from users
order by name DESC

 

Order by 예제2. 시간을 기준으로 정렬해보기

select * from users
order by created_at desc;

> 최근 데이터부터 보고싶을 때, 유용


Group by 예제1. 앱개발 종합반의 결제수단별 주문건수 세어보기

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

 

Group by 예제2. Gmail 을 사용하는 성씨별 회원수 세어보기

select name, count(*) from users
WHERE email like "%gmail.com"
group by name

 

Group by 예제3. course_id별 '오늘의 다짐'에 달린 평균 like 개수 구해보기

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

> 평균을 구하고 싶은걸 avg(이 안에)


Alias

쿼리가 점점 길어지면서 종종 헷갈리는 일이 생길 수 있는데 SQL은 Alias라는 별칭 기능을 지원합니다.

 

select * from orders o
WHERE o.course_title = "앱개발 종합반"

> orders를 o라는 별칭으로 지정했고

> o.course_title는 orders 테이블에 있는 course_title을 의미한다.

 

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

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


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

select payment_method, count(*) from orders
WHERE email like '%naver.com'
group by payment_method

'📚강의록📚 > 스파르타)SQL' 카테고리의 다른 글

SQL 문제풀이(8~18)  (0) 2023.06.03
SQL 3주차  (0) 2023.06.02
SQL 문제풀이(1~7)  (0) 2023.06.01
SQL 1주차  (0) 2023.06.01
Comments