IT/SQLD(SQL개발자)

[SQLD] GRORP BY, HAVING 절

pandada 2019. 6. 29. 14:33
반응형

Group By, Having 절

 

집계 함수(Aggregate Function) 

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

  - GROUP BY 절은 행들을 소그룹화 한다.

  - SELECT 절, HAVING 절, ORDER BY 절에서 사용할 수 있다.

 집계 함수 명 ( [DISTINCT |

 

ALL] 칼럼이나 표현식  )

 - ALL : Default 옵션이므로 생략 가능함.

 - DISDINCT : 같은 값을 하나의 데이터로 간주할 때 사용하는 옵션이다.

 

 

집계 함수의 종류

집계 함수 

사용 목적 

COUNT( * ) 

NULL 값을 포함한 행의 수를 출력한다. 

COUNT( 표현식 ) 

표현식의 값이 NULL값인 것을 제외한 행의 수를 출력한다. 

SUM( [DISTINCT | ALL ] 표현식) 

표현식이 NULL 값을 제외한 합계를 출력한다. 

ACG( [DISTINCT | ALL ] 표현식) 

표현현이 NULL 값을 제외한 평균을 출력한다.

MAX( [DISTINCT | ALL ] 표현식) 

표현식의 최대값을 출력한다. (문자, 날짜 데이터 타입도 가능) 

MIN( [DISTINCT | ALL ] 표현식) 

표현식의 최소값을 출력한다. (문자, 날짜 데이터 타입도 가능) 

STDDEV( [DISTINCT | ALL ] 표현식) 

표현식의 표준 편차를 출력한다. 

VARIAN( [DISTINCT | ALL ] 표현식) 

표현식의 분산을 출력한다. 

기타 통계 함수

벤더별로 다양한 통계식을 제공한다. 

 

 

GROUP BY

 SELECt [DISTINCT] 칼럼명 [ALIAS 명]

 FROM 테이블명

 [WHERE 조건식]

 [GROUP BY 칼럼(cloumn)이나 표현식]

 [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 절 뒤에 위치한다.

  - COLUMN에 대한 ALIAS는 SELECT 절에서 정의하고 ORDER BY 절에서 재활용할 수 있지만, GROUP BY 절에서는 ALIAS 명을 사용할 수 없다.

 

 

*참고*

SQLD 사이트에 있는 테이블에 데이터를 추가로 넣어서 예제 테스트를 이용하였습니다.

 

 포지션별 최대키, 최소키, 평균키를 출력한다.

 select POSITION as 포지션, MIN(HEIGHT) as 최소키,MAX(HEIGHT) as 최대키, AVG(HEIGHT) as 평균키
from PLAYER group by(POSITION);

 

HAVING

- WHERE 절에는 AVG와 같은 함수를 쓸 수 없다. WHERE 절은 FROM절에 정의된 집합(주로 테이블)의 개별 행에 WHERE 절의 조건절이 먼저 적용되고, WHRE 절의 조건에 맞는 행이 GROUP BY 절의 대상이 된다. 따라서 WHERE 절에 AVG와 같은 함수를 쓰고싶다면 HAVING을 쓰면 된다.

 HAVING 조건절에는 GROUP BY 절에서 정의한 소그룹의 집계 함수를 이용한 조건을 표시할 수 있으므로 HAVING 절을 이용하여 평균키가 180cm 이상인 정보만 표시해볼 것.

select POSITION as 포지션,AVG(HEIGHT) as 평균키
from PLAYER group by(POSITION) Having avg(HEIGHT)>=180;

 

 주의!!.

  GROUP BY 절과 HAVING 절의 순서를 바꾸어서 수행하더라도 문법 에러도 없고 결과물도 동일한 결과를 출력한다. 그렇지만, SQL 내용을 보면, 포지션이란 소그룹으로 그룹핑되어 통계 정보가 만들어지고, 이후 적용된 결과 값에 대한 HAVING 절의 제한 조건에 맞는 데이터만을 출력하는 것이므로 논리적으로 GROUP BY 절과 HAVING 절의 순서를 지키는 것을 권고한다.

 

 

반응형