10장 데이터 그룹핑
Last updated
Was this helpful?
Last updated
Was this helpful?
그룹핑은 데이터를 논리적으로 나눠줘 각 그룹에 대한 집계 연산을 수행할 수 있다.
그룹은 SELECT 문에서 GROUP BY 절을 사용하여 생성할 수 있다.
GROUP BY 절을 사용하면 기준에 따라 테이블을 그룹핑한 후, 자동으로 각 그룹에 대해 계산하기에 계산할 그룹을 따로 명시할 필요가 없다.
GROUP BY 절을 사용하기 전 알아두어야 할 중요한 규칙이 있다.
GROUP BY 절에는 원하는 만큼의 열을 써서 중첩 그룹을 만들 수 있다. 이 방식은 데이터를 그룹핑하는 방식을 더 세밀하게 제어할 수 있게 해준다.
GROUP BY 절에 중첩된 그룹이 있다면, 데이터는 마지막으로 지정된 그룹에서 요약된다. 즉, 지정된 열은 그룹핑할 때 같이 측정된다. 따라서 열 단위 데이터를 얻지 못한다.
GROUP BY 절의 열은 가져오는 열이거나, 그룹 함수는 아니면서 유효한 수식이어야 한다. SELECT 절에서 수식을 사용한다면 GROUP BY 절에도 같은 수식을 사용해야 한다.
GROUP BY 절에서 문자나 메모와 같은 가변형 길이의 데이터 형식은 사용할 수 없다.
그룹 함수 명령문을 제외하고 SELECT 절에 있는 모든 열은 GROUP BY 절에 존재해야 한다.
그룹핑하는 열의 행에 NULL 값이 있다면, NULL도 그룹으로 가져온다. 여러 행이 NULL 값을 가진다면 모두 함께 그룹핑된다.
GROUP BY 절은 WHERE 절 뒤, ORDER BY 절 앞에 위치한다.
GROUP BY 절을 사용하면 데이터 그룹핑뿐 아니라 그룹 필터링도 가능하다.
이때, HAVING 이라는 절을 사용한다. HAVING은 행을 필터링하는 WHERE와 매우 유사하다. 단 하나의 차이점은 필터링 대상이다. WHERE는 행을, HAVING은 그룹을 필터링한다.
위 그림과 같이 WHERE는 데이터가 그룹핑 되기 전 필터링하고, HAVING은 그룹핑 후 필터링한다.
또한 WHERE와 HAVING는 동시에 사용할 수 있다.
이때, WHERE 필터링 이후 그룹핑 된다.
정렬에 한해 GROUP BY 절과 ORDER BY 절은 같은 결과를 가져올 수 있다. 하지만 이 둘은 다르다.
GROUP BY 절을 사용해 데이터를 그룹핑할 때 결과가 그룹 순으로 정렬된 것을 볼 수 있다. 하지만 이러한 정렬은 항상 발생하는 것이 아니고, DBMS 설정에 의한 자동 정렬이다. 따라서 원하는 결과의 정렬이 아닐 가능성이 높다. 그러므로 우리는 ORDER BY 절을 사용해 의도된 정렬을 명시하도록 하자.
결과를 정렬한다.
행을 그룹핑한다.
어떤 열이라도 사용 가능
선택된 열이나 수식만 사용 가능.
필수 항목은 아님
그룹 함수와 함께 사용하는 열이 있는 경우 필수 항목임
SELECT 문에 여러 절이 있을 때 순서를 어떻게 해야 할까? 다음을 참고 하자.
SELECT
가져올 열이나 수식
O
FROM
데이터를 가져올 테이블
테이블에서 데이터를 가져올 때 사용
WHERE
행 레벨 필터링
X
GROUP BY
그룹 지정
그룹핑한 데이터로 집계 계산시 사용
HAVING
그룹 레벨 필터링
X
ORDER BY
정렬 순서
X
GROUP BY를 사용해 데이터를 그룹핑하고 그 데이터로 계산을 수행해 그룹별 결과를 가져오는 방법
HAVING 절을 사용해 그룹을 필터링하는 방법
ORDER BY와 GROUP BY의 차이점
WHERE와 HAVING의 차이점
OrderItems 테이블은 각 주문에 대한 개별 항목을 포함하고 있다. 주문 번호에 해당하는 줄 수를 order_lines로 표시하고 결과를 order_lines로 정렬하는 SQL문을 작성하라.
Products 테이블에 있는 prod_price를 사용하여, 각 판매처에서 취급하는 가장 저렴한 항목을 cheatpest_item으로 이름 짓고 가격순(저>고)으로 정렬하는 SQL 문을 작성하라.
100개 이상의 항목을 주문한 주문 번호를 가져오는 SQL 문을 작성하라.
주문액의 합이 1000 이상인 모든 주문의 주문 번호를 가져와 주문 번호를 정렬하는 SQL 문을 작성하라. Item_price와 수량을 곱한 값을 모두 합해야 한다.
다음 SQL 문의 잘못된 점은?
GROUP BY에서 별칭 items를 사용할 수 없음 => 실제 테이블의 열이어야 한다.