[sql]GROUP BY / HAVING

*GROUP BY
*참고중인 사이트에 왜 "집계함수"부터 설명하는지 처음에는이해하지 못했다.. 
  근데 공부해보니 그 이유를 알겠다..

*아래 "집계함수"는 자주 사용하는 것임으로 기본적으로 알아두자...
1. COUNT(*)            : NULL데이터를 포함하여 row데이터의 갯수를 구한다.
2. COUNT(표현식)   : NULL데이터를 제외한 row데이터의 갯수를 구한다.
                                 (예) SELECT( HEIGHT )
------------------------------------------------------------------------
여기서부터는 
"집계함수( DISTINCT | ALL 표현식)"형태로 사용할 수 있습니다.
*DISTINCT : 중복 row을 제거합니다.
*ALL : 중복 row을 제거 하지 않습니다( 아마도 default...?? )

------------------------------------------------------------------------
3. SUM() : NULL데이터를 제외한 row의 합계를 구한다.
4. AVG() : NULL데이터를 제외한 row의 평균을 구한다.
5. MIN, MAX() : NULL데이터를 제외한 row의 최소값, 최대값을 구한다.

*GROUP BY절
1. GROUP BY절에서 그룹 단위를 표시해 주어야 SELECT절에서 그룹 단위의 칼럼과 
   집계 함수를 사용할 수 있다.
2. GROUP BY 절을 통해 소그룹별 기준을 정한 후, SELECT 절에 집계 함수를 사용
3. 
집계 함수의 통계 정보는 NULL 값을 가진 행을 제외하고 수행한다.
4. HAVING 절은 GROUP BY 절의 기준 항목이나 소그룹의 집계 함수를 이용한 조건을
   표시할 수 있다.
5. GROUP BY 절에 의한 소그룹별로 만들어진 집계 데이터 중,
    HAVING 절에서 제한조건을 두어 조건을 만족하는 내용만 출력한다
.

  • 예) 잘못된 쿼리-수정전
 SELECT POSITION             포지션  
      , COUNT(*)             인원수  
      , COUNT(HEIGHT)        키대상  
      , MAX(HEIGHT)          최대키  
      ,  MIN(HEIGHT)         최소키  
      , ROUND(AVG(HEIGHT),2) 평균키  
   FROM PLAYER  
 --😂ORDER BY가 없는데요???

결과) 오류: ERROR: 단일 그룹의 집계 함수가 아니다.

  • 예) 잘못된쿼리-수정 후
 SELECT POSITION             포지션  
      , COUNT(*)             인원수  
      , COUNT(HEIGHT)        키대상  
      , MAX(HEIGHT)          최대키  
      , MIN(HEIGHT)          최소키 
      , ROUND(AVG(HEIGHT),2) 평균키  
   FROM PLAYER  
  GROUP BY POSITION;   
  • ORDER BY 절이 없기때문에 포지션으로 정렬되지 않았지만 포지션 별로
    인워수, 키대상, 최대키, 최소키, 평균키에 대한 그룹 내용을 출력 하고 있다.

*HAVING절
  • 예) 잘못된쿼리-수정전
SELECT POSITION             포지션  
     , ROUND(AVG(HEIGHT),2) 평균키  
  FROM PLAYER  
 WHERE AVG(HEIGHT) >= 180          
 GROUP BY POSITION;   
 
*3행에 오류: ERROR: 집계 함수는 허가되지 않는다.
  SELECT문은 GROUP BY보다 WHERE가 먼저 수행됨으로 WHERE에서 "집계"함수 사용을 허용하지 않는다.
  • 예) 잘못된쿼리-수정후
SELECT POSITION             포지션  
     , ROUND(AVG(HEIGHT),2) 평균키  
  FROM PLAYER  
 GROUP BY POSITION;  
HAVING AVG(HEIGHT) >= 180  
  • 문법상 GROUP BY 보다 HAVING을 먼저 사용해도 문젠 없으나,
    되도록이면 GROUP BY다음에 HAVING사용을 권장한다. 
    (논리적으로 GROUP BY을 사용하여 집계된 데이터를 기준으로 HAVING에서 조건을 설정하는 것임으로
     위 순서를 권장한다.)

댓글

이 블로그의 인기 게시물

[sql] 테이블 생성