제 7절. GROUP BY, HAVING 절

 

1. 집계함수 (Aggregate Function)

집계함수는 여러 행들이 모여 단 하나의 결과를 돌려준다.

집계함수의 특징

GROUP BY 절은 행들을 소그룹화 한다.
SELECT 절, HAVING 절, ORDER BY 절에 사용할 수 있다.

집계함수의 종류

SUM, AVG, MIN, MAX ,STDDEV(표준편차), VARIAN(분산)

주의할 점

COUNT(*) : 전체 행 수
COUNT(HEIGHT) : 키의 건수
COUNT 안에 컬럼명을 적으면 NULL 값은 제외한 건수를 출력한다.

 

2. GROUP BY 절

GROUP BY 절은 데이터를 소그룹화 하여 항목별 통계 정보를 얻을 때 사용한다.

SELECT [DISTINCT] 칼럼명 
FROM 테이블명
[WHERE 조건식]
[GROUP BY 칼럼이나 표현식]
[HAVING 그룹조건식];

GROUP BY 절과 HAVING 절의 특징

  • GROUP BY 절을 통해 소그룹별 기준을 정한 후, SELECT 절에 집계 함수를 사용한다.
  • 집계 함수는 WHERE 절에 올 수 없다.
    (집계 함수를 사용할 수 있는 GROUP BY 보다 WHERE 절이 먼저 수행되기 때문이다. )
  • GROUP BY 절에는 SELECT 절과는 달리 ALIAS 를 사용할 수 없다.
  • GROUP BY 절에서 소그룹별로 집계된 데이터 중에서 HAVING 절에 쓰여진 제한 조건을 만족한 것만 출력한다.
  • 집계 함수의 통계 정보는 NULL 값을 가진 행을 제외하고 수행한다.
  • GROUP BY는 그룹화만 하는 것이지 정렬을 하지 않는다. ORDER BY 절이 데이터 정렬을 해준다.

3. HAVING 절

WHERE 절의 조건에 맞춰 걸러진 행들만 GROUP BY 의 대상이 된다. (그래서 WHERE 절에는 집계함수 사용이 불가하다.)
GROUP BY가 그룹화를 할 때 HAVING 절에서'조건'을 줄 수 있다.

SELECT  POSITION 포지션, ROUND(AVG(HEIGHT), 2) 평균키
FROM PLAYER
GROUP BY POSITION
HAVING AVG(HEIGHT) >= 180;

4개의 포지션 중에 평균키가 180 이 넘는 데이터를 출력한다.

GROUP BY 절과 HAVING 절의 순서를 바꿔도 에러가 없고 결과물도 동일하다. 하지만 GROUP BY 절 뒤에 HAVING 절을 쓰는 것을 권고한다.

가능한 WHERE 절에서 데이터를 많이 필터링 해둬서 GROUP BY의 계산 대상을 줄이는 것이 효율적인 자원 활용 측면에서 바람직하다.

 

4. CASE 표현을 활용한 월별 데이터 집계

IF-THEN-ELSE-END

IF    SAL > 2000
    THEN REVISED_SALARY = SAL
    ELSE REVIED_SALARY = 2000
END-IF

IF-THEN-ELSE

CASE
    SIMPLE_CASE_EXPRESSION 조건
    ELSE 표현절
END

 

5. NULL 관련 함수 (중요)

 

NULL 값의 특징

  • 아직 정의 되지 않은 값이다.
  • 0 또는 공백과는 다르다. ( 0은 숫자이고, 공백은 문자이다.)
  • 연산에 NULL이 포함되면 결과는 NULL이다.

NVL(exp1, exp2) 함수 NVL/ISNULL

  • 결과값을 "NULL이 아닌 다른 값"으로 얻고자 할 때 NVL/ISNULL 함수를 쓴다.
  • NVL(exp1, exp2)
  • exp1 이 NULL이라면 exp2 를 출력한다.
  • exp2는 대체값인 것이다.

NULLIF(exp1, exp2)

  • 특정 값을 null로 대체하는 경우에 주로 사용한다.
  • exp1 과 exp2가 같으면 NULL을 리턴한다. 다르면 exp1을 리턴한다.

COALESCE(exp1, exp2, ...)

  • 인수 중에서 NULL이 아닌 최초의 인수를 리턴한다.
  • 모든 인수가 NULL이라면 NULL을 리턴한다.
  • 인수의 개수가 무한하다.
728x90

'프로그래밍 > SQLD' 카테고리의 다른 글

SQL 기본 7 : ORDER BY  (0) 2020.05.28
SQL 기본 5 : 함수  (0) 2020.05.27
SQL 기본 4 : WHERE 절  (0) 2020.05.27
SQL 기본 3 : TCL  (0) 2020.05.27
SQL 기본 2 : DML  (0) 2020.05.27

+ Recent posts