동일한 범주의 데이터를 묶어주는 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