본문 바로가기

TIL

[ 23/2/2 TIL : SQL - SELECT * FROM Table ~ Group by / Order by : 통계적인 값들 구해보기 ]

동일한 범주의 데이터를 묶어주는 Group by

깔끔하게 데이터를 정렬해주는 Order by ( 오름차순 / 내림차순 )

 

[1] Group by 이용 예시.

 

*Q) users 테이블에서 

같은 성씨가 각각 몇개가 있는지 알고 싶다.

 

1) 일단 users 테이블에서 name 필드를 기준으로 정렬해본다.

select * from users u
group by name

이 결과는 아래와 같이 나온다.

 

쿼리문을 해석하면,

select * : 테이블 내에 모든 필드들을 보여줘라.

from users u : users라는 테이블에서 ( users의 별칭을 u로 하겠다 )

group by name : 이름 필드값을 기준으로 동일한 데이터는 묶어줘.

 

자세히 보면, name필드 값이 겹치지 않음을 알 수 있다.

사실 이** 씨에 해당하는 row의 개수는 85개인데, 이를 축약해서 결과값으로 보여주고 있다.

 

여기서 우리가 궁금한 정보인 같은 성씨가 각각 몇개인지 따로 가져오려면?

 

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

 

결과는 이렇게 나온다. ( 이씨가 많긴 많구나.. )

 

<그냥 궁금해서 해본 Query>

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

김씨가 가장 많다.

 

< naver.com 이메일을 쓰는 사람들의 성씨 별 개수를 구하는 쿼리? >

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

< 주차별로 like의 최소값 >

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

 

< 주차별로 like의 최댓값 >

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

 

< 주차별로 like의 평균값 >

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

 

< 주차별로 like의 평균값을 반올림 : 소숫점 첫째 자리까지 >

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

 

< 주차별로 like 개수의 합을 구하기 >

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

 

 

=========================

 

정렬 : Order by

 

데이터를 쿼리를 통해 잘 가져온 다음에, 마지막에 오름차순 / 내림차순 해준다.

 

정렬은 데이터를 다 뽑을 이후, 가장 마지막에 해준다.

 

기본값은 오름차순 ( asc )

 

아까 썼던 SQL 가져와보면.

 

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

-> 유저 테이블에서 이름을 통해 묶은 데이터를, 이름 - 그 이름의 개수 로 쪼개서 가져온다.

-> 그 이후, 이름의 개수의 내림차순으로 데이터를 정렬해달라!

는 내용으로 DB에 질의하는 내용이다.

 

**) 위 쿼리가 실행되는 순서.

from --> group by --> select --> order by

 

1) from users : users 테이블 데이터 전체를 가져온다.

2) group by name : users 테이블 데이터에서 같은 name을 갖는 데이터를 합쳐준다.

3) select name, count(*) : name에 따라 합쳐진 데이터가 

 

 

< checkins 테이블에서 likes의 역순으로 가져오고 싶을 때 쿼리 >

select * from checkins
order by likes desc

 

========================

 

< Where 절과 Group by / Order by 함께 사용하기 >

 

[ 웹개발 종합반의 결제수단별 주문건수 세어보는 쿼리 + 카운트 별 오름차순으로. ]

 

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

결과는 다음과 같다.

 

< SQL 쿼리가 실행되는 순서 >

from -> where -> group by -> select -> order by

 

[ order by  : 숫자가 아닌, 문자열 기준으로 정렬해보기 ]

select * from users u 
order by email

결과는 다음과 같다.

+ created_at 과 같은 시간으로도 정렬이 된다!

 

 

[ Quiz ]

 

1. 앱개발 종합반의 결제수단별 주문건수 ( 내림차순 )

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

 

2. Gmail을 사용하는 성씨별 회원수

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

 

3. course_id 별 '오늘의 다짐'에 달린 평균 like 개수

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

 

 

[ 별칭 : Alias ]

 

- 쿼리가 짧지만, 길어진 쿼리에 대해 짧고 간결하게 쿼리를 짜기 위함.

 

앞으로 Join / Subquery 를 사용할 때, 쿼리문이 길어지는데, 그 때 유용!

 

[1] 테이블 이름에 별칭을 주는 경우

 

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

-> orders 테이블에

o 라는 별칭을 주고, 이를 이용해 orders 테이블의 필드를 지정한다.

 

 

[2] 필드의 이름에 별칭을 주는 경우

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

 

-> count(*) 이 결과에 출력될 때,

count(*) 필드명으로 나오는 것이 아니라, cnt 라는 필드명으로 나오게 만들어준다.

 

[ Query :

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

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