SQL 일지
SQL 일지 - Group by와 Order by
Hyerin P.
2023. 2. 22. 19:15
▷ 범주의 통계를 내주는 Group by
- 스파르타 회원: 성씨별로 몇 명의 회원이 있는지 알아보자
- 성씨별로 몇 명이 회원이 있는지 구하려고 where 절을 사용해서 수십개의 쿼리를 작성하는 것은 너무 비효율적입니다. 이 문제를 Group by를 사용해서 해결할 수 있습니다.
- select name, count(*) from users
group by name;
- 쿼리가 실행되는 순서 👉 from → group by → select
- from users: users 테이블에서 데이터를 불러옵니다
- group by name: name이라는 필드에서 동일한 값을 갖는 데이터를 하나로 합쳐줍니다
- select name, count(): 이름과 count()를 출력해 주는데, name에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 세어줍니다. 예) 이**, 이**, 김**, 김**, 박** 이렇게 데이터가 있었다면, 이**는 2개, 김**은 2개, 박**은 1개겠죠!
▷ Group by 사용해보기
- 동일한 범주의 개수 구하기
- 동일한 범주의 갯수는 count(*)를 사용해서 해요.
- select 범주별로 세어주고 싶은 필드명, count(*) from 테이블명
group by 범주별로 세어주고 싶은 필드명;
- 동일한 범주에서의 최솟값 구하기
- 동일한 범주 특정 필드의 최솟값은 min(필드명)을 사용해서 해요.
- select 범주가 담긴 필드명, min(최솟값을 알고 싶은 필드명) from 테이블명
group by 범주가 담긴 필드명;
- 동일한 범주에서의 최댓값 구하기
- 동일한 범주 특정 필드의 최댓값은 max(필드명)을 사용해서 해요.
- select 범주가 담긴 필드명, max(최댓값을 알고 싶은 필드명) from 테이블명
group by 범주가 담긴 필드명;
- 동일한 범주의 평균 구하기
- 동일한 범주 특정 필드의 평균값은 avg(필드명)을 사용해서 해요.
- select 범주가 담긴 필드명, avg(평균값을 알고 싶은 필드명) from 테이블명
group by 범주가 담긴 필드명;
- 동일한 범주의 합계 구하기
- 동일한 범주 특정 필드의 합계는 sum(필드명)을 사용해서 해요.
- select 범주가 담긴 필드명, sum(합계를 알고 싶은 필드명) from 테이블명
group by 범주가 담긴 필드명;
▷ Order by 사용해보기
- Order by로 앞의 결과를 정렬해보자
- Order by를 사용하면 한 번에 정렬할 수 있어요.
- select * from 테이블명
order by 정렬의 기준이 될 필드명; - 결과의 개수 오름차순으로 정렬해보기
- select name, count(*) from users
group by name
order by count(*);
- select name, count(*) from users
- 결과의 개수 내림차순으로 정렬해보기
- select name, count(*) from users
group by name
order by count(*) desc; - [꿀팁!] 여기서의 desc는 내림차순을 의미하는 영단어 descending의 약자입니다.
- select name, count(*) from users
- Order by 제대로 알아보기
- select name, count(*) from users
group by name
order by count(*); - 쿼리가 실행되는 순서 👉 from → group by → select → order by
- from users: users 테이블 데이터 전체를 가져옵니다.
- group by name: users 테이블 데이터에서 같은 name을 갖는 데이터를 합쳐줍니다.
- select name, count(*): name에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 세어줍니다. 예) 이**, 이**, 김**, 김**, 박** 이렇게 데이터가 있었다면, 이는 2개, 김은 2개, 박**은 1개겠죠!
- order by count(*): 합쳐진 데이터의 개수에 따라 오름차순으로 정렬해줍니다.
- Order by는 숫자 뿐만 아니라 문자열, 시간을 기준으로 정렬이 가능하다.
- select name, count(*) from users
▷ Where와 Group by, Order by 함께 사용해보기
- 원리는 간단해요. Where절로 조건이 하나 추가되고, 그 이후에 Group by, Order by가 실행되는 것!
- 웹개발 종합반의 결제수단별 주문건수 세어보기
- [순서]
- orders 테이블에서 주문 데이터를 읽어오고
- 웹개발 종합반 데이터만 남기고
- 결제수단(범주) 별로 그룹화하고
- 결제수단별 주문건수를 세어준다!
- select payment_method, count(*) from orders
where course_title = "웹개발 종합반"
group by payment_method; - 위와 같이, group by와 select 사이에 where로 조건을 넣어주면 끝!
- SQL 쿼리가 실행되는 순서 👉 from → where → group by → select
- from orders: users 테이블 데이터 전체를 가져옵니다.
- where course_title = "웹개발 종합반": 웹개발 종합반 데이터만 남겨줍니다.
- group by payment_method: 같은 payment_method을 갖는 데이터를 합쳐줍니다.
- select payment_method, count(*): payment_method에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 세어줍니다. 예) CARD, CARD, kakaopay 이렇게 데이터가 있었다면, CARD는 2개, kakaopay는 1개겠죠!
- 만약 order by가 추가된다면? order by는 맨 나중에 실행됩니다! (결과물을 정렬해주는 것이기 때문!)
▷ [꿀팁] 이렇게 쿼리를 작성하면 편해요!
- show tables로 어떤 테이블이 있는지 살펴보기
- 제일 원하는 정보가 있을 것 같은 테이블에 select * from 테이블명 limit 10 쿼리 날려보기
- 원하는 정보가 없으면 다른 테이블에도 2)를 해보기
- 테이블을 찾았다! 범주를 나눠서 보고싶은 필드를 찾기
- 범주별로 통계를 보고싶은 필드를 찾기
- SQL 쿼리 작성하기!
▷ 이외 유용한 문법 배워보기
- 별칭 기능: 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