기록
database - GROUP BY 본문
지금까지 봐온 집약함수는 전체 테이블을 집약 범위로 계산했다.
이번에는 테이블을 몇 개의 그룹으로 나누어서 집약해 보도록 하자.
즉, 상품분류별이나 등록일별 등으로 집약하는 것을 의미한다.
우리말로는 ~마다, ~별, ~단위 등으로 자주 표현된다.
이때 사용하는 도구가 GROUP BY 구다.
우리말로 표현하면 '~에 의해 그룹을 나눈다'는 의미이다.
예를들어, 상품분류별로 행 수를 계산해보도록 하자.
SELECT goods_classify, COUNT(*)
FROM Goods
GROUP BY goods_classify;
GROUP BY를 사용하지 않았을 때는 1행밖에 없던 결과가 이번에는 복수행으로 늘었다.
GROUP BY구를 적용하지 않은 경우는 테이블을 전체의 하나의 그룹으로 보고 처리하는 반면,
GROUP BY구를 사용한 경우는 테이블을 복수의 그룹으로 나누어 처리하기 때문이다.
GROUP BY 구는 테이블을 자르는 칼이다.
GROUP BY 구에 지정하는 열을 집약키 도는 그룹화 열이라고 부른다.
테이블을 어떻게 나눌지 정하기 위하는 매우 중요한 열이다.
SELECT 구와 마찬가지로 GROUP BY 구에도 복수의 열을 지정할 수 있다.
작성 순서
SELECT - FROM - (WHERE) - GROUP
SELECT buy_price, COUNT(*)
FROM Goods
WHERE goods_classify = '의류'
GROUP BY buy_price
* 집약함수와 GROUP BY 구를 사용할 때 자주 하는 실수
- SELECT 구에 필요 없는 열을 쓴다.
COUNT같은 집약함수를 사용한 경우에는 SELECT구에 쓸 수 있는 요소가 매우 제한적이다.
실제로 집약함수를 사용할 때는 다음 세 가지만 SELECT 구에 기술할 수 있다.
- 상수
- 집약 함수
- GROUP BY 구에서 지정할 열 (즉, 집약 키)
자주 범하기 쉬운 실수는, SELECT 구에 집약 키 이외의 구를 쓴다는 것이다.
MYSQL을 제외한 DBMS에서는 에러가 납니다.
또, WHERE/GROUP BY 구에 별명을 쓰면 안된다. (posgreSQL와 mySQL 제외하고 에러 남)
이유는 DBMS 내부 실행 순서상 SELECT구가 GROUP BY구보다 뒤에 실행되기 때문이다.
[ 내부 실행 순서 : FROM - WHERE - GROUP BY - SELECT ]
마지막으로, WHERE 구에 집약함수를 사용하면 안된다.
SELECT goods_classify, COUNT(*)
FROM Goods
WHERE COUNT(*) = 2 # 에러
GROUP BY goods_classify;
집약함수를 사용할 수 있는 부분은 SELECT 구와 HAVING 구, ORDER BY 구 뿐이다.
여기서 새롭게 등장한 HAVING 구가 '2행의 그룹만 선택한다' 같이
그룹에 조건을 지정하기 위한 도구이다.
'[Study] > Database' 카테고리의 다른 글
database - ORDER BY (0) | 2019.07.26 |
---|---|
HAVING - 그룹에 조건을 지정한다 (0) | 2019.07.26 |
SQL 집약함수 사용 시 중복값 제외 (DISTINCT) (0) | 2019.07.24 |
SQL 집약함수 - SUM, AVG, MAX, MIN (0) | 2019.07.24 |
SQL 집약 함수 - COUNT (0) | 2019.07.24 |