본문 바로가기
IT

[SQLD] SQL기본_GROUP BY, HAVING절

by 또닝 2017. 11. 21.

GROUP BY 절과 HAVING 절의 특성

1. GROUP BY 절을 통해 소그룹별 기준을 정한 후, SELECT 절에 집계 함수 사용

2. 집계 함수는 NULL 값을 가진 행을 제외하고 수행

3. GROUP BY 절에는 ALIAS 명 사용 불가능

4. WHERE 절에는 집계함수 올 수 없음 (WHERE 절이 GROUP BY 절보다 먼저 수행되기 때문이다)

5. HAVING 절은 GROUP BY 절의 기준 항목이나 소그룹의 집계 함수를 이용한 조건 표시 가능

 

SELECT 문장 실행 순서

1. 발췌 대상 테이블 참조 ( FROM )

2. 발췌 대상 데이터가 아닌 것은 제거 ( WHERE )

3. 행들을 소그룹화 ( GROUP BY )

4. 그룹핑된 값의 조건에 맞는 것만 출력 ( HAVING )

5. 데이터 값 출력, 계산 ( SELECT )

6. 데이터 정렬 ( ORDER BY )

   ORACLE - NULL 값을 가장 큰 값으로 간주 / SQL Server - NULL 값을 가장 작은값으로 간주

 

집계 함수와 NULL 처리

1. 다중행 함수는 입력 값으로 전체 건수가 NULL 값인 경우만 함수의 결과가 NULL이 나옴

   전체 건수 중에서 일부만 NULL인 경우는 NULL인 행을 다중행 함수의 대상에서 제외

   ( 10명 중 3명의 성적이 NULL일 때, 다중행 함수 AVG를 사용하면 7명의 성적에 대한 평균값 )

2. CASE 문 사용시 ELSE 절을 생략하면 Default 값이 NULL

3. DECODE 사용시 4번째 인자를 지정하지 않으면 Default 값이 NULL

ORACLE - SUM(NVL(SAL, 0 )) → NVL(SUM(SAL), 0) O

SQL Server - SUM(ISNULL(SAL, 0 )) → ISNULL(SUM(SAL), 0) O

 

/* 예제1 - 테이블 전체가 하나의 그룹이 되는 경우 - GROUP BY 절 없이 단독으로 사용 가능 */
SELECT   COUNT ( * ) "전체행수"
       , COUNT (HEIGHT) "키 건수"
       , MAX (HEIGHT) "최대키"
       , MIN (HEIGHT) "최소키"
       , ROUND (AVG (HEIGHT), 2) "평균키"
  FROM   PLAYER;

 

/* 예제2 - K-리그 선수들의 포지션별 평균키 */
  SELECT   POSITION "포지션"
         , COUNT ( * ) "전체행수"
         , COUNT (HEIGHT) "키 건수"
         , MAX (HEIGHT) "최대키"
         , MIN (HEIGHT) "최소키"
         , ROUND (AVG (HEIGHT), 2) "평균키"
    FROM   PLAYER
GROUP BY   POSITION;

 

/* 예제3 - K-리그 선수들의 포지션별 평균키를 구하는데, 평균키가 180 센티미터 이상인 정보만 표시 */
  SELECT   POSITION "포지션"
         , ROUND (AVG (HEIGHT), 2) "평균키"
    FROM   PLAYER
GROUP BY   POSITION
  HAVING   AVG (HEIGHT) >= 180;

 

/* 예제4 - K-리그의 선수들 중 삼성블루윙즈(K02)와 FC서울(K09)의 인원수 */
  SELECT   TEAM_ID "팀ID"
         , COUNT ( * ) "인원수"
    FROM   PLAYER
   WHERE   TEAM_ID IN ('K02', 'K09')
GROUP BY   TEAM_ID;

 

/* 예제5 - 포지션별 평균키만 출력하는데, 최대키가 190cm 이상인 선수를 가지고 있는 포지션의 정보만 출력 */
  SELECT   POSITION "포지션", ROUND (AVG (HEIGHT), 2) "평균키"
    FROM   PLAYER
GROUP BY   POSITION
  HAVING   MAX (HEIGHT) >= 190;

 

/* 예제6 - 팀별 포지션별 FW, MF, DF, GK 포지션의 인원수와 팀별 전체 인원수를 구하는 SQL 문장을 작성한다. 데이터가 없는 경우는 0으로 표시한다. */ 
  SELECT   TEAM_ID
         , NVL (SUM (CASE WHEN POSITION = 'FW' THEN 1 END), 0) FW
         , NVL (SUM (CASE WHEN POSITION = 'MF' THEN 1 END), 0) MF
         , NVL (SUM (CASE WHEN POSITION = 'DF' THEN 1 END), 0) DF
         , NVL (SUM (CASE WHEN POSITION = 'GK' THEN 1 END), 0) GK
         , COUNT ( * ) "전체인원수"
    FROM   PLAYER
GROUP BY   TEAM_ID;

 

/* 예제7 - GROUP BY 절 없이 전체 선수들의 포지션별 평균 키 및 전체 평균 키를 출력 */
SELECT   ROUND (AVG (CASE WHEN POSITION = 'MF' THEN HEIGHT END), 2) MF
       , ROUND (AVG (CASE WHEN POSITION = 'FW' THEN HEIGHT END), 2) FW
       , ROUND (AVG (CASE WHEN POSITION = 'DF' THEN HEIGHT END), 2) DF
       , ROUND (AVG (CASE WHEN POSITION = 'GK' THEN HEIGHT END), 2) GK
       , ROUND (AVG (HEIGHT), 2) "전체평균키"
  FROM   PLAYER;

 

 

http://www.dbguide.net/da.db?cmd=snb9_2_view&boardConfigUid=59&boardGroupUid=6&boardUid=148066

여기서 실습용 파일을 받아서 실습할 수 있음!

 

 

'IT' 카테고리의 다른 글

[SQLD]SQL활용_그룹함수  (0) 2017.11.22
[SQLD] SQL기본_JOIN  (0) 2017.11.21
[SQLD] 함수  (0) 2017.11.20
[SQLD] SQL기본_TCL/WHERE절  (0) 2017.11.20
[SQLD] SQL기본_DDL  (0) 2017.11.20