Database/개념

[DATABASE] GROUP BY, HAVING 절이란? ORDER BY 절이란?

꽁담 2018. 11. 2. 01:57

집계함수


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


집계함수의 특성

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

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

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


집계함수의 종류

 집계 함수

 사용 목적

 COUNT(*)

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

 COUNT(표현식)

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

 SUM([DISTINCT | ALL] 표현식)

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

 AVG([DISTINCT | ALL] 표현식)

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

 MAX([DISTINCT | ALL] 표현식)

 표현식의 최대값을 출력한다.

 MIN([DISTINCT | ALL] 표현식)

 표현식의 최소값을 출력한다.

 STDDEV([DISTINCT | ALL] 표현식)

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

 VARIAN([DISTINCT | ALL] 표현식)

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



GROUP BY, HAVING 절



GROUP BY 는 SQL 문에서 FROM 절과 WHERE 절 뒤에 오며, 데이터들을 작은 그룹으로 분류하여 소그룹에 대한 항목별로 통계 정보를 얻을 때 사용됩니다.

HAVING 은 WHERE 절과 비슷하지만 그룹을 나타내는 결과 집합의 행에 조건이 적용되는 차이가 있습니다.


GROUP BY, HAVING 절의 특성

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

2. 집계 함수의 통계 정보는 NULL 값을 가진 행을 제외하고 수행한다.

3. GROUP BY 절에서는 SELECT 절과는 달리 ALIAS 명을 사용할 수 없다.

4. 집계 함수는 WHERE 절에는 올 수 없다.

5. WHERE 절은 전체 데이터를 GROUP 으로 나누기 전에 행들을 미리 제거시킨다.

6. HAVING 절은 GROUP BY 절의 기준 항목이나 소그룹의 집계 함수를 이용한 조건을 표시할 수 있다.

7. GROUP BY 절에 의한 소그룹별로 만들어진 집계 데이터 중, HAVING 절에서 제한 조건을 두어 조건을 만족하는 내용만 출력한다.

8. HAVING 절은 일반적으로 GROUP BY 절 뒤에 위치한다.


WHERE 절과 HAVING 절의 차이점

GROUP BY 가 사용되는 경우 WHERE 절에 집계함수를 사용할 수 없습니다.

이런 경우 조건을 위해서 HAVING 이 사용됩니다.


GOLDILOCKS 에서의 GROUP BY 를 사용시 WHERE 절과 HAVING 절에 집계함수를 사용하는 경우입니다.

gSQL> SELECT
    2   AVG(C1)
    3 FROM
    4   T1
    5 WHERE
    6   AVG(C1) >= 1
    7 GROUP BY C1;

ERR-42000(16158): group function is not allowed here : 
  AVG(C1) >= 1
  *
ERROR at line 6:
gSQL> SELECT
    2   AVG(C1)
    3 FROM
    4   T1
    5 GROUP BY C1
    6 HAVING
    7   AVG(C1) >= 1;

AVG(C1)
-------
      1

1 row selected.


GROUP BY 와 HAVING 의 앞 뒤가 바뀌어도 무관하지만,

소그룹으로 그룹핑이 되어 통계정보가 만들어지고, 이후 적용된 결과 값에 대한 HAVING 절의 제한 조건에 맞는 데이터만을 출력하는 것이므로 논리적으로 GROUP BY 절과 HAVING 절의 순서를 지키는 것을 권고합니다.



ORDER BY 절



SQL 문장으로 조회된 데이터들을 다양한 목적에 맞게 특정 칼럼을 기준으로 정렬하여 출력하는데 사용됩니다.

SQL 문장의 제일 마지막에 위치하며 정렬 방식을 지정하지 않으면 기본적으로 오름차순이 적용됩니다.

SELECT 컬럼명
FROM 테이블명
ORDER BY 컬럼이나 표현식 [ASC 또는 DESC]

ASC : 조회한 데이터를 오름차순으로 정렬한다.

DESC : 조회한 데이터를 내림차순으로 정렬한다.


ORDER BY 절 특징

1. 기본적인 정렬 순서는 오름차순이다.

2. 숫자형 데이터 타입은 오름차순으로 정렬했을 경우에 가장 작은 값부터 출력된다.

3. 날짜형 데이터 타입은 오름차순으로 정렬했을 경우 날짜 값이 가장 빠른 값이 먼저 출력된다.

4. 오라클에서는 NULL 값을 가장 큰 값으로 간주하여 오름차순으로 정렬했을 경우 가장 마지막에, MSSQL 에서는 NULL 값을 가장 작은 값으로 간주하여 오름차순으로 정렬했을 경우 가장 처음에 위치한다.



SELECT 문장 실행 순서



모든 문장이 사용될 때 SELECT 문장을 6개의 절로 구성이 됩니다.

SELECT 컬럼명
FROM 테이블명
WHERE 조건식
GROUP BY 컬럼이나 표현식
HAVING 그룹조건식
ORDER BY 컬럼이나 표현식 [ASC 또는 DESC]

수행순서는 다음과 같습니다.

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

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

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

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

5. 데이터 값을 출력/계산한다. (SELECT)

6. 데이터를 정렬한다. (ORDER BY)


주의사항

데이터의 일부가 먼저 추출된 후 데이터에 대한 정렬 작업이 일어나므로, 순위가 높은 N개의 로우를 추출하기 위해 ORDER BY 절과 WHERE 절의 ROWNUM 조건을 같이 사용하는 경우가 있는데 원하는 결과를 얻을 수 없습니다.

반면 MSSQL 의 TOP 조건을 사용하게 되면 별도 처리 없이 관련 ORDER BY 절의 데이터 정렬 후 원하는 일부 데이터만 출력합니다.




이 내용은 'SQL 전문가 가이드, 한국데이터베이스 진흥원' 에서 공부한 내용입니다.