[엑셀보다 더 쉬운 SQL] 2주차 데이터의 그룹화
지난 시간에는 테이블에서 날 것의 정보를 꺼내봤다. 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;
Author And Source
이 문제에 관하여([엑셀보다 더 쉬운 SQL] 2주차 데이터의 그룹화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hwa0/엑셀보다-더-쉬운-SQL-2주차-데이터의-그룹화저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)