[엑셀보다 더 쉬운 SQL] 2주차 데이터의 그룹화

3879 단어 SQL기초SQL기초

지난 시간에는 테이블에서 날 것의 정보를 꺼내봤다. 2주차 수업에서는 의미있는 분석을 위해 1) 범주(category) 별로 데이터의 특성을 요약하고, 2) 보기 좋게 데이터를 정렬하는 방법을 배운다.

  • 예) 과목별 신청자 평균 연령, 과목별 신청자수, 성씨별 회원수 등을 내림차순 정렬(디폴트 값 '오름차순')

범주의 통계를 내는 GROUP BY

📌GROUP BY는 동일한 범주를 갖는 데이터를 하나로 묶어서, 범주별 통계를 낸다. GROUP BY는 데이터를 묶는 것 까지만 수행한다는 점 주의! SELECT 문에서 COUNT, AVG, SUM, MIN, MAX 등등의 함수를 사용하여 통계치를 구한다.

SELECT 그룹화할 열 이름1, 그룹화할 열 이름2, 집계 함수
FROM 테이블명
WHERE 조건절
GROUP BY 그룹화할 열 이름1, 그룹화할 열 이름2;

집단 간 차이를 자세히 볼 수 있다는 장점이 있다.

1. GROUP BY 기본 사용법

성씨별 회원수를 알아보자

  • 먼저 머릿 속으로 다음과 같은 결과값을 그린다.

SELECT name, COUNT(*) FROM users
GROUP BY name;

위 쿼리 실행 순서
FROM → GROUP BY → SELECT
1)users 테이블 전체 데이터를 가져온다.
2)GROUP BY 명령으로 같은 name 값을 갖는 데이터를 하나로 합친다. 성씨 별로 데이터를 묶어서, 범주 즉 성씨 별 통계를 낸다.
3)SELECT name, COUNT(*) : name(그룹화할 열 이름)에 따라 합쳐진 데이터가 몇 개인지 센다. 이 씨 2개, 신 씨 14개...

주차별 코멘트 개수를 세어보자

SELECT week, COUNT(*) FROM checkins
GROUP BY week;

1주차, 2주차, 3주차...끼리 데이터를 합친 다음, 주차별 열의 개수를 알려준다.

(응용)주차별 코멘트 개수와 좋아요 수 간의 관계를 알아보자

SELECT week, COUNT(*) AS COMMENT_CNT, SUM(likes) AS COMMENT_LIKES FROM checkins
GROUP BY week;

2. 최솟값(MIN), 최댓값(MAX), 평균(AVG), 합계(SUM) 구하기

주차별 '오늘의 다짐'의 좋아요 최솟값 구하기

SELECT week, MIN(likes) FROM checkins
GROUP BY week;

범주가 담긴 필드는 week, 최솟값을 알고 싶은 필드명은 likes다. 동일한 규칙으로 최댓값, 평균, 합계를 구할 수 있다.

주차별 좋아요 수의 평균을 소숫점 둘째 자리까지만 출력하려면

SELECT week, ROUND(avg(likes), 2)  FROM checkins
GROUP BY week;

깔끔한 정렬이 필요할 땐 ORDER BY

ORDER BY 내림차순은 DESC와 함께 사용한다. 시간 기준으로 내림차순하면 최근 데이터부터 볼 수 있어서 유용하다.

SELECT 열 이름 FROM 테이블명
GROUP BY 그룹화할 테이블명
ORDER BY 정렬의 기준이 되는 열 이름 DESC;

성씨별 회원수 데이터를 내림차순으로 정렬해보자

SELECT name, COUNT(*) AS CNT FROM users
GROUP BY name
ORDER BY CNT DESC;

DESC를 작성하지 않으면 기본으로 오름차순 정렬한다.

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

위 쿼리 실행 순서
FROM → GROUP BY → SELECT → ORDER BY
1)users 테이블 전체를 가져온다.
2)GROUP BY 명령으로 users 테이블에서 같은 name 값을 갖는 데이터를 합친다.
3)SELECT 문으로 name에 따라 합쳐진 데이터가 몇 개인지 개수를 출력한다.
4)마지막으로 COUNT(*) 개수에 따라 최종 결과물을 오름차순 정렬한다.

WHERE와 GROUP BY, ORDER BY 함께 사용하기

SELECT payment_method, COUNT(*)  FROM orders
WHERE course_title = '웹개발 종합반'
GROUP BY payment_method;

주문 정보에서 웹개발 종합반 수강생들만 골라내서 결제 수단별로 통계를 내고, 최종적으로 해당 수강생들이 사용한 결제 수단의 개수를 출력한다.

SELECT name, email, COUNT(*) FROM users
WHERE email LIKE '%gmail%'
GROUP BY name
ORDER BY name;

지메일을 사용하는 성씨별 회원수를 출력한다.

자주 하는 실수

👉 오류를 해결하는 습관, SQL 쿼리문의 실행 순서를 따라 생각해보자

위 쿼리문의 경우, orders 테이블에서 payment_method 범주별로 통계를 내라는 명령이다. 하지만 통계치가 나오지 않는데....

  • 묶은 데이터를 '어떤 통계치'로 출력해달라는 뜻의 COUNT(*)를 추가하자
  • 다음으로 이 통계치가 어떤 범주에 대한 통계치인지 알려주기 위해 SELECT 문에 payment_method를 추가한다.
SELECT payment_method, COUNT(*) FROM orders
GROUP BY payment_method;

좋은 웹페이지 즐겨찾기