주요 콘텐츠로 건너뛰기 이 브라우저는 더 이상 지원되지 않습니다. 최신 기능, 보안 업데이트, 기술 지원을 이용하려면 Microsoft Edge로 업그레이드하세요. GROUP BY(Entity SQL)
이 문서의 내용쿼리 식(SELECT)을 통해 반환되는 개체가 배치될 그룹을 지정합니다. 구문
인수
설명집계 함수가 SELECT 절 <선택 목록에> 포함된 경우 GROUP BY는 각 그룹에 대한 요약 값을 계산합니다. GROUP BY가 지정된 경우, 선택 목록 내의 집계가 아닌 식에 있는 모든 속성 이름이 GROUP BY 목록에 포함되어야 하거나 아니면 GROUP BY 식이 선택 목록 식과 정확히 일치해야 합니다. 참고 ORDER BY 절이 지정되지 않은 경우에는 GROUP BY 절에 의해 반환되는 그룹에 특정 순서가 없습니다. 데이터에 특정 정렬 순서를 지정하려면 항상 ORDER BY 절을 사용하는 것이 좋습니다. 명시적으로든 암시적으로든(예: 쿼리에 HAVING 절 사용) GROUP BY 절이 지정된 경우, 현재 범위는 숨겨지고 새로운 범위가 나타납니다. 그러면 SELECT 절, HAVING 절 및 ORDER BY 절이 FROM 절에 지정된 요소 이름을 참조할 수 없게 됩니다. 그룹화 식 자체만 참조할 수 있습니다. 이렇게 하려면 각 그룹화에 새 이름(별칭)을 할당하면 됩니다. 그룹화 식에 별칭이 지정되지 않은 경우 Entity SQL 다음 예제와 같이 별칭 생성 규칙을 사용하여 별칭 생성 규칙을 생성하려고 합니다.
GROUP BY 절의 식은 동일한 GROUP BY 절에 이전에 정의된 이름을 참조할 수 없습니다. 그룹화 이름뿐만 아니라 SELECT 절, HAVING 절 및 ORDER BY 절의 집계를 지정할 수도 있습니다. 집계에는 그룹의 각 요소에 대해 계산되는 식이 포함됩니다. 집계 연산자를 이러한 모든 식의 값을 일반적으로(항상 그렇지는 않음) 단일 값으로 줄입니다. 집계 식은 부모 범위에 나타난 원래 요소 이름을 참조하거나 GROUP BY 절에 의해 생성된 새 이름을 참조할 수 있습니다. 집계가 SELECT 절, HAVING 절, ORDER BY 절에 나타나기는 하지만 다음 예제에서 보여 주는 것처럼 그룹화 식과 동일한 범위에서 실제로 계산됩니다.
이 쿼리는 GROUP BY 절을 사용하여 모든 주문 제품에 대해 제품별로 구분된 비용 보고서를 생성합니다. 여기서는 그룹화 식의 일부로서 제품에 이름 각 GROUP BY 키 식에는 입력 범위에 대한 참조가 하나 이상 있어야 합니다.
GROUP BY 사용 예제는 HAVING항목을 참조하세요. 예제다음 Entity SQL 쿼리에서는 GROUP BY 연산자를 사용하여 쿼리를 통해 반환되는 개체가 배치될 그룹을 지정합니다. 쿼리는 AdventureWorks Sales 모델을 기반으로 합니다. 이 쿼리를 컴파일하고 실행하려면 다음 단계를 수행하세요.
참조
GROUP BY 절을 보통 테이블을 스캔하고 결과를 임시 테이블에 넣어서 집계하는 과정을 거친다. 그래서 데이터 양에 따라서 매우매우 느린 쿼리가 될 수도 있다. 그래도 인덱스를 잘 설정한다면 임시 테이블을 생성하지 않고 빠르게 데이터를 가져올 수 있다. 관건은
GROUP BY 에 있는 모든 컬럼들이 바라보는 Index가 동일하고 순서도 맞아야 한다. 두가지 방법이 있는데
MySQL에서 GROUP BY는 Sorting을 위해 사용되는데 ORDER BY 를 최적화 할 수도 있다. Loose Index Scan¶
만약 Loose Index Scan이 사용된다면 테이블 t1(c1, c2, c3, c4) 에 (c1, c2, c3)으로 인덱스가 걸려있다면 다음 쿼리에서 Loose Index Scan이 된다. SELECT c1, c2 FROM t1 GROUP BY c1, c2; SELECT DISTINCT c1, c2 FROM t1; SELECT c1, MIN(c2) FROM t1 GROUP BY c1; SELECT c1, c2 FROM t1 WHERE c1 < const GROUP BY c1, c2; SELECT MAX(c3), MIN(c3), c1, c2 FROM t1 WHERE c2 > const GROUP BY c1, c2; SELECT c2 FROM t1 WHERE c1 < const GROUP BY c1, c2; SELECT c1, c2 FROM t1 WHERE c3 = const GROUP BY c1, c2; 하지만 다음 쿼리는 만족하지 못하는 경우다.
SELECT c1, SUM(c2) FROM t1 GROUP BY c1;
SELECT c1, c2 FROM t1 GROUP BY c2, c3;
SELECT c1, c3 FROM t1 GROUP BY c1, c2;
Loose Index Scan은
다음 쿼리는 Loose Index Scan을 사용할 수 있다. SELECT COUNT(DISTINCT c1), SUM(DISTINCT c1) FROM t1; SELECT COUNT(DISTINCT c1, c2), COUNT(DISTINCT c2, c1) FROM t1; Tight Index Scan¶Tight Index Scan은 쿼리의 상태에 따라 Full Index Scan이 이루어질지 Range Index Scan이 이루어질지 결정된다. 다음 쿼리는 Loose Index Scan으로는 되지 않지만 Tight Index Scan으로 되는 쿼리다. SELECT c1, c2, c3 FROM t1 WHERE c2 = 'a' GROUP BY c1, c3; SELECT c1, c2, c3 FROM t1 WHERE c1 = 'a' GROUP BY c2, c3; Refer¶
|