일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 백준 1756
- github
- 깃허브
- 백준 2852
- 프로그래머스 조건에 맞는 개발자 찾기
- 백준 크리문자열
- react
- AWS
- ROWNUM
- 알고리즘
- 백준 24499 파이썬
- 데이터베이스
- SAA-C02
- 백준 11059
- SQLD
- 정규화
- sql
- 리스트 컴프리헨션
- 파이썬
- join
- Today
- Total
-
[SQLD] #018 SQL 기본 - GROUP BY, HAVING 절 본문
목차
1. 집계 함수
2. GROUP BY 절
3. HAVING 절
4. 집계 함수와 NULL
1. 집계 함수 (Aggregate Function)
다중행 함수중 집계 함수의 특성은 다음과 같다.
- 여러 행들의 그룹이 모여서 그룹당 단 하나의 결과를 돌려주는 함수이다.
- GROUP BY 절은 행들을 소그룹화 한다.
- SELECT 절, HAVING 절, ORDER BY 절에 사용할 수 있다.
집계 함수명 ( [DISTINCT|ALL] 칼럼이나 표현식)
-- ALL : Default 옵션이므로 생략 가능
-- DISTINCT : 같은 값을 하나의 데이터로 간주할 때 사용하는 옵션
2. GROUP BY 절
GROUP BY 절은 SQL 문에서 FROM 절과 WHERE 절 뒤에 오며, 데이터들을 작은 그룹으로 분류하여 소그룹에 대한 항목별로 통계 정보를 얻을 때 추가로 사용된다.
SELECT [DISTINCT] 칼럼명 [ALIAS명] FROM 테이블명 [WHERE 조건식] [GROUP BY 칼럼이나
표현식] [HAVING 그룹조건식];
GROUP BY 절과 HAVING 절은 다음과 같은 특성을 가진다.
- GROUP BY 절을 통해 소그룹별 기준을 정한 후, SELECT 절에 집계 함수를 사용한다.
- 집계 함수의 통계 정보는 NULL 값을 가진 행을 제외하고 수행한다.
- GROUP BY 절에서는 SELECT 절과는 달리 ALIAS 명을 사용할 수 없다.
- 집계 함수는 WHERE 절에는 올 수 없다. (GROUP BY 절보다 WHERE절이 먼저 수행되기 때문)
- WHERE 절은 전체 데이터를 GROUP으로 나누기 전에 행들을 미리 제거시킨다.
- HAVING 절은 GROUP BY 절의 기준 항목이나 소그룹의 집계 함수를 이용한 조건을 표시할 수 있다.
- GROUP BY 절에 의한 소그룹별로 만들어진 집계 데이터중, HAVING 절에서 제한 조건을 두어 조건을 만족하는 내용만 출력한다.
- HAVING 절은 일반적으로 GROUP BY 절 뒤에 위치한다.
3. HAVING 절
예제) K리그 선수들의 포지션별 평균 키를 구하는데, 평균키가 180 이상인 정보만 표시하라는 요구사항이 접수되었으므로 WHERE 절과 GROUP BY 절을 사용해 SQL 문장을 작성한다.
SELECT POSITION 포지션, ROUND(AVG(HEIGHT),2) 평균키 FROM PLAYER WHERE AVG(HEIGHT) >= 180
GROUP BY POSITION;
-- 실행 결과
-- WHERE AVG(HEIGHT) >= 180 *3행에 오류: 집계함수는 허가되지 않는다.
위의 결과처럼 WHERE 절에는 AVG()라는 집계 함수는 사용할 수 없다. WHERE 절은 FROM 절에 정의된 테이블의 개별 행에 WHERE 절의 조건절이 먼저 적용되고, WHERE 절의 조건에 맞는 행이 GROUP BY 절의 대상이 된다.
그 다음 결과 집합의 행에 HAVING 조건절이 적용된다. 결과적으로는 HAVING 절의 조건을 만족하는 내용만 출력된다. 즉, HAVING 절은 WHERE 절과 비슷하지만 그룹을 나타내는 결과 집합의 행에 조건이 적용된다는 점이 다르다.
따라서 HAVING 절을 이용해 평균키가 180 이상인 정보만 표시하면 아래와 같다.
SELECT POSITION 포지션, ROUND(AVG(HEIGHT),2) 평균키 FROM PLAYER GROUP BY POSITION
HAVING AVG(HEIGHT) >= 180;
SQL에서는 GROUP BY 절과 HAVING 절의 순서를 바꿔서 수행한다.
4. 집계함수와 NULL
리포트의 빈칸을 NULL이 아닌 ZERO로 표현하기 위해 NVL/ISNULL 함수를 사용하는 경우가 많은데, 다중 행 함수를 사용하는 경우는 오히려 불필요한 부하가 발생하므로 굳이 NVL 함수를 다중 행 함수 안에 사용할 필요가 없다.
다중 행 함수는 입력값으로 전체 건수가 NULL인 경우만 함수의 결과가 NULL이 나오고, 전체 건수 중에서 일부만 NULL 인 행을 다중 행 함수의 대상에서 제외한다.
예를 들면 100명중 10명의 성적이 NULL 값일 때 평균을 구하는 다중 행 함수 AVG를 사용하면 NULL 값이 아닌 90명의 성적에 대해 평균값을 구하게 된다.
출처
이 글의 내용은 모두 한국데이터베이스진흥원이 출판한 SQL 전문가 가이드 2013 Edition을 기본으로 한다.
'SQLD' 카테고리의 다른 글
[SQLD] #020 SQL 기본 - JOIN (0) | 2021.05.06 |
---|---|
[SQLD] #019 SQL 기본 - ORDER BY 절 (0) | 2021.05.05 |
[SQLD] #017 SQL 기본 - 함수 (2) | 2021.05.03 |
[SQLD] #016 SQL 기본 - WHERE (0) | 2021.05.03 |
[SQLD] #015 SQL 기본 - TCL (0) | 2021.04.30 |