본문 바로가기

DB/SQLD

SQL 기본 - group by, having 절

반응형

집계 함수

여러행들의 그룹이 모여서 단하나의 결과를 돌려주는 다중행 함수.

group by 절은 행들을 소그룹화 함.

select 절 , having 절, order by 절에 사용할 수 있다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
1. 집계함수
 
count(*) : null값을 포함한 행의 수를 출력
count(표현식) : 표현식의 값이 null값인 것을 제외한 행의 수를 출력
sum(표현식) : 표현식의 null값을 제외한 합계를 출력
avg(표현식) : 표현식의 null값을 제외한 평균을 출력
max(표현식) : 표현식의 최대값 출력(문자,날짜데이터도 가능)
min(표현식) : 표현식의 최소값 출력
stddev(표현식) : 표현식의 표준편차 출력
varian(표현식) : 표현식의 분산 출력
 
SELECT COUNT(*"전체 행수", COUNT(HEIGHT) "키 건수", MAX(HEIGHT) 최대키, MIN(HEIGHT) 최소키, ROUND(AVG(HEIGHT)) 평균키
FROM PLAYER;
 
2. GROUP BY 절
//데이터들을 작은 그룹으로 분류하여 항목별 통계정보를 얻을 때 사용
// ** GROUP BY 절에서는 ALIAS 사용 불가
// 집계함수는 WHERE 절에 사용 불가
// HAVING 절은 GROUP BY 절의 기준 항목이나 소그룹의 집계함수를 이용한 조건을 표시할 수 있다.
 
SELECT POSITION 포지션, AVG(HEIGHT) 평균키
FROM PLAYER;
// 이렇게 할 수 없음. 이유는 AVG가 단일 그룹 집계함수가 아니니까
SELECT POSITION 포지션, AVG(HEIGHT) 평균키
FROM PLAYER
GROUP BY POSITION;
// 이렇게 포지션별 평균키를 추출할 수 있음
 
3. HAVING 절
// 쉽게 생각하면 그룹별로 집계할 때 조건절이라 생각하면 됨.
SELECT POSITION 포지션, ROUND(AVG(HEIGHT),2) 평균키
FROM PLAYER
GROUP BY POSITION
HAVING AVG(HEIGHT) >= 180;
// 포지션별 평균키를 추출하는데 180CM 이상인 정보만 보고싶을때
 
SELECT POSITION 포지션, ROUND(AVG(HEIGHT),2) 평균키
FROM PLAYER
GROUP BY POSITION
HAVING MAX(HEIGHT) >= 190;
// 포지션별 평균키만 추출하는데 최대키가 190 이상인 선수를 가지고 있는 포지션만의 정보 추출.
// SELECT 에서 최대키를 추출하지도 않는데 HAVING 조건절에서 사용가능한점을 유념.
 
4. CASE 표현을 활용한 집계
SELECT DEPTNO,
       AVG(CASE MONTH WHEN 1 THEN SAL END) M01,
       AVG(CASE MONTH WHEN 2 THEN SAL END) M02,
       AVG(CASE MONTH WHEN 3 THEN SAL END) M03,
       AVG(CASE MONTH WHEN 4 THEN SAL END) M04,
       AVG(CASE MONTH WHEN 5 THEN SAL END) M05,
       AVG(CASE MONTH WHEN 6 THEN SAL END) M06,
       AVG(CASE MONTH WHEN 7 THEN SAL END) M07,
       AVG(CASE MONTH WHEN 8 THEN SAL END) M08,
       AVG(CASE MONTH WHEN 9 THEN SAL END) M09,
       AVG(CASE MONTH WHEN 10 THEN SAL END) M10,
       AVG(CASE MONTH WHEN 11 THEN SAL END) M11,
       AVG(CASE MONTH WHEN 12 THEN SAL END) M12
FROM (SELECT ENAME, DEPTNO, EXTRACT(MONTH FROM HIREDATE) MONTH, SAL FROM EMP)
GROUP BY DEPTNO;
//부서별로 월별 입사자의 평균 급여를 추출.
 
5. 집계함수와 NULL 처리
//지난번 포스트에서 NULL이 아닌값으로 변환하기 위해 NVL() 함수를 사용한다고 했는데
//집계함수에서는 오히려 불필요한 부하가 발생하므로 사용하지 않아야 한다.
//이유는 AVG, SUM 등의 함수에서 자동으로 NULL값은 제외시키고 계산하기 때문이다.
// *중요*


GROUP BY 절이 "소계"를 구한다고 간단히 정리하면 된다.

HAVING절은 GROUP BY절로 그룹화 했을 때 조건절을 쓴다고 정리.

NULL값을 제외하고 통계내는 것 유념.

COUNT(*)은 NULL값도 포함해서 모든 레코드 개수 센다는 것.

COUNT(표현식)은 표현식에서 값이 NULL이 들어가면 제외하고 센다는 것과 비교해서 알아 둘 것.


반응형

'DB > SQLD' 카테고리의 다른 글

SQL 기본 - join  (0) 2017.09.05
SQL 기본 - order by 절  (0) 2017.09.04
SQL 기본 - 함수  (0) 2017.09.02
SQL 기본 - where 절  (0) 2017.09.01
SQL 기본 - TCL  (0) 2017.08.31