그룹화를 통해 집계함수의 활용범위를 넓힐 수 있다.
SELECT FROM 테이블명 GROUP BY 열1, 열2, ...
GROUP BY 구에 열을 지정하여 그룹화하면 지정된 열의 값이 같은 행이 하나의 그룹으로 묶인다.
SELECT name FORM sample51 GROUP BY name;
각 그룹으로 묶인 값들은 서로 동일하다. -> DISTINCT와 같이 중복을 제거하는 효과가 있다.
SELECT name, COUNT(name), SUM(quantity) FROM sample51 GROUP BY name;
집계함수는 WHERE 구의 조건식에서는 사용할 수 없다. (WHERE구로 행을 검색하는 처리가 GROUP BY 로 그룹화하는 처리보다 순서상 앞서므로 그룹화가 필요한 집계함수는 WHERE 구에서 지정할 수 없다.)
내부처리순서
WHERE 구 -> GROUP BY 구 -> SELECT 구 -> ORDER BY 구
HAVING구를 사용하면 집계함수를 사용해서 조건식을 지정할 수 있다. GROUP BY 구 뒤에 기술하며 WHERE 구와 동일하게 조건식을 지정할 수 있다. 조건식에는 그룹별로 집계된 열의 값이나 집계함수의 계산 결과가 전달된다. (조건식이 참인 것만 반환)
SELECT name, COUNT(name) FROM sample51 GROUP BY name HAVING count(name) >=1
집계함수를 사용할 경우 HAVING 구로 검색조건을 지정한다.
그룹화보다 나중에 처리되는 ORDER BY 구에서는 문제없이 집계함수를 사용할 수 있다. >
내부처리순서
WHERE 구 -> GROUP BY 구 -> HAVING 구 -> SELECT 구 -> ORDER BY 구
HAVING 구 에서는 별명을 사용할 수 없다.
GROUP BY 에서 지정한 열 이외의 열은 집계함수를 사용하지 않은 채 SELECT 구에 기술해서는 안된다. 그룹화하면 클라이언트로 반환되는 결과는 그룹당 하나의 행이된다. 하지만 그룹화하지 않은 열 값은 해당 그룹에서 여러개가 존재할 수 있으므로 각 그룹마다 하나의 값을 반환해야 하기때문에 에러가 발생한다.
집계함수를 사용하는 경우 집합은 하나의 값으로 계산되므로, 그룹마다 하나의 행을 출력할 수 있다.
SELECT MIN(no), name, SUM(quantity) FROM sample51 GROUP BY name;
GROUP BY로 지정한 열 이외의 열은 집계함수를 사용하지 않은 채 SELECT 구에 지정할 수 없다.
그룹화해도 실행결과 순서를 정렬할 수는 없다. 순서가 서로 바뀔 수 있다. GROUP BY 지정을 해도 정렬되지 않는다.
ORDER BY 구를 사용해 결과를 정렬할 수 있다. GROUP BY로 그룹화한 경우에도 ORDER BY로 정렬할 수 있다.
SELECT name, COUNT(name), SUM(quantity) FROM sample51 GROUP BY name ORDER BY SUM(quantity) DESC;