여러 데이터 중 같은 공통점이 있는 것들만 묶을 수 있습니다. 묶는 방법에 대해서 알아봅시다.
우리는 지금까지 총 몇 번의 주문이 발생했는지 알고싶습니다. 이럴때는 집계함수라는 것을 사용해서 구할 수 있습니다.
SELECT count(*) FROM orders;
# 출력
# count(*)
# 12
위 쿼리는 count
라는 집계함수를 이용하여 orders
테이블의 총 로우 수를 구하는 쿼리 입니다. 위 쿼리를 이용하면 총 몇 번의 주문이 발생했는지 알 수 있습니다. 이러한 집계함수를 이용하면 로우의 집합을 순회하면서 원하는 결과를 하나로 묶어서 출력할 수 있습니다. 또한 이러한 집계함수는 집합을 하나의 데이터로 모으는 특징이 있습니다.
이러한 집계함수는 count
외에도 sum
, avg
, min
, max
등이 있습니다. 차례대로 count
는 집합의 수를 구하는 함수, sum
은 집합의 합을 구하는 함수, avg
는 집합의 평균을 구하는 함수, min
은 집합 중 가장 작은 수를 구하는 함수, max
는 집합 중 가장 큰 수를 구하는 함수 입니다.
우리는 가게에 방문한 손님별로 총 몇 번 주문을 했는지 알고 싶습니다. 먼저 테이블을 살펴봅시다.
손님이름 | 메뉴 | 가격 |
---|---|---|
이선협 | 김치찌개 | 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를 통해 지적사항을 보내주세요. 😄
이 문서는 CC0 라이센스를 따릅니다.
특허권 또는 상표권은 CC0에 의해 영향을 받지 않으며, 퍼블리시티권 및 프라이버시권 등 저작물 자체에 대해 또는 저작물 이용에 대해 타인이 갖는 권리 또한 영향을 받지 않습니다.
달리 정하지 않은 한, 본 저작물의 인증자는 관련법에서 허용하는 최대 한도 내에서 저작물에 대해 아무런 보증도 하지 않으며 저작물의 모든 이용에 관한 어떠한 책임도 지지 않습니다.
저작물을 사용하거나 인용할 때 저자나 인증자로부터 승인을 받았다는 뜻을 시사하여서는 안됩니다.