Skip to content

Latest commit

 

History

History
76 lines (56 loc) · 4.52 KB

GROUP.md

File metadata and controls

76 lines (56 loc) · 4.52 KB
비개발자를 위한 MySQL

그룹

여러 데이터 중 같은 공통점이 있는 것들만 묶을 수 있습니다. 묶는 방법에 대해서 알아봅시다.

집계함수

우리는 지금까지 총 몇 번의 주문이 발생했는지 알고싶습니다. 이럴때는 집계함수라는 것을 사용해서 구할 수 있습니다.

SELECT count(*) FROM orders;
# 출력
# count(*)
# 12

위 쿼리는 count라는 집계함수를 이용하여 orders 테이블의 총 로우 수를 구하는 쿼리 입니다. 위 쿼리를 이용하면 총 몇 번의 주문이 발생했는지 알 수 있습니다. 이러한 집계함수를 이용하면 로우의 집합을 순회하면서 원하는 결과를 하나로 묶어서 출력할 수 있습니다. 또한 이러한 집계함수는 집합을 하나의 데이터로 모으는 특징이 있습니다.

이러한 집계함수는 count외에도 sum, avg, min, max 등이 있습니다. 차례대로 count는 집합의 수를 구하는 함수, sum은 집합의 합을 구하는 함수, avg는 집합의 평균을 구하는 함수, min은 집합 중 가장 작은 수를 구하는 함수, max는 집합 중 가장 큰 수를 구하는 함수 입니다.

GROUP BY

우리는 가게에 방문한 손님별로 총 몇 번 주문을 했는지 알고 싶습니다. 먼저 테이블을 살펴봅시다.

손님이름 메뉴 가격
이선협 김치찌개 10000
김지환 된장찌개 8000
이선협 비지찌개 10000
김지환 스테이크 28000
이선협 김치찌개 10000
남세현 라면 4000

테이블을 살펴보면 이선협이 총 3번 주문을 했고, 김지환과 남세현이 2번, 1번씩 주문을 했습니다. 이렇게 테이블에 데이터가 적을 때는 단순히 눈으로 파악이 가능하지만 테이블에 데이터가 많을 때는 사람 눈으로는 불가능합니다. 그럴때 GROUP BY라는 명령어를 사용하여 해결할 수 있습니다.

# customer는 손님 이름입니다.
SELECT count(*), customer FROM orders GROUP BY customer;
# 결과
# count(*)  |  customer
# 2         |  김지환
# 1         |  남세현
# 3         |  이선협

GROUP BY를 이용하면 동일한 데이터를 하나의 집합으로 합칠 수 있습니다. count와 같은 집계함수를 이용하면 집합들의 연산 결과를 얻을 수 있습니다. 만약 여기서 주문의 횟수가 아닌 손님이 지불한 총 금액을 알고 싶다면 다음과 같은 쿼리로 가능합니다.

SELECT sum(price), customer FROM orders GROUP BY customer;
# 결과
# sum(price)  |  customer
# 36000       |  김지환
# 4000        |  남세현
# 30000       |  이선협

마찬가지로 avg, max, min과 같은 함수도 가능합니다.

그리고 혹시 데이터의 정렬 순서에 대해서 눈치 채셨나요? GROUP BY를 이용하면 디폴트로 GROUP BY 대상으로 지목된 컬럼을 기준으로 오름차순 정렬이 됩니다. 물론 이 순서는 다시 ORDER BY를 통해 재정렬 해줄 수 있습니다.

마치며

GROUP BY는 아마 앞으로 쿼리를 작성하면서 가장 많이보게될 명령어라고 생각합니다. 그만큼 중요하니 제대로 개념을 익히고 넘어가는게 좋습니다. 다음 장에서는 HAVING에 대해서 알아보겠습니다.

지적, 수정사항에 대해서

Github 계정이 있으신 분들은 Issue에 지적사항을 등록해주시거나 직접 수정하여 Pull request를 주시면 반영하도록 하겠습니다.
Github 계정이 없으신 분들은 kciter@naver.com를 통해 지적사항을 보내주세요. 😄

라이센스

Public Domain Mark

이 문서는 CC0 라이센스를 따릅니다.

특허권 또는 상표권은 CC0에 의해 영향을 받지 않으며, 퍼블리시티권 및 프라이버시권 등 저작물 자체에 대해 또는 저작물 이용에 대해 타인이 갖는 권리 또한 영향을 받지 않습니다.

달리 정하지 않은 한, 본 저작물의 인증자는 관련법에서 허용하는 최대 한도 내에서 저작물에 대해 아무런 보증도 하지 않으며 저작물의 모든 이용에 관한 어떠한 책임도 지지 않습니다.

저작물을 사용하거나 인용할 때 저자나 인증자로부터 승인을 받았다는 뜻을 시사하여서는 안됩니다.