본문 바로가기
SQL

GROUP BY, HAVING, ORDER BY

by csue 2021. 8. 8.

집계함수

여러 행들의 그룹이 모여서 그룹 당 하나의 결과를 돌려주는 함수이다. SELECT, HAVING ORDER BY 절에 사용할 수 있다. WHERE 절에서는 집계함수를 사용할 수 없다. NULL 은 집계함수의 계산에 포함되지 않는다.

집계함수의 종류

COUNT(*)
COUNT(표현식)
NULL 값을 포함한 행의 수를 출력
표현식의 값이 NULL 이 아닌 행의 수를 출력
SUM(표현식) 표현식의 값이 NULL 이 아닌 나머지 값의 합계를 출력
AVG(표현식) 표현식의 값이 NULL 이 아닌 나머지 값의 평균을 출력
MAX(표현식)
MIN(표현식)
표현식의 값이 NULL 이 아닌 나머지 값의 최대값을 출력
표현식의 값이 NULL 이 아닌 나머지 값의 최소값을 출력
STDDEV(표현식) 표현식의 값이 NULL 이 아닌 나머지 값의 표준편차를 출력
VARIAN(표현식) 표현식의 값이 NULL 이 아닌 나머지 값의 분산을 출력

GROUP BY 절

GROUP BY 절은 행들을 기준에 따라 소그룹화 한다.

ALIAS 를 사용할 수 없으며, 위에서 언급하였듯 WHERE 절에는 집계함수를 사용할 수 없으므로 GROUP BY 절보다 WHERE 절이 먼저 수행된다.

HAVING 절

WHERE 절과 비슷하지만 집계된 결과를 기준으로 특정 조건을 주고 싶은 경우에 사용된다는 점에서 다르다. GROUP BY 의 결과를 WHERE 절로 표현한다고 생각하면 된다.

ORDER BY 절

ORDER BY 절은 SQL 문장으로 조회된 데이터들을 다양한 목적에 맞게 특정 칼럼을 기준으로 정렬하여 출력하는데에 사용된다. SELECT 절에 기재하지 않은 칼럼을 기준으로 ORDER BY 해도 정상적으로 실행된다. 칼럼 명 대신 ALIAS 명을 사용할 수도 있으며, 별도로 정렬 방식을 지정하지 않은 경우 디폴트로 오름차순ASC 으로 정렬된다.

오라클의 경우 NULL 값을 가장 큰 값으로 간주하여 오름차순으로 정렬했을 경우에는 가장 마지막에, 내림차순으로 정렬했을 경우에는 가장 먼저 위치하게 된다. (다른 RDBMS 의 경우 다를 수 있으므로 체크해보아야 한다)

SELECT 문의 실행 순서

FROM => WHERE => GROUP BY => HAVING => SELECT => ORDER BY

  • FROM : 조회 테이블을 참조한다.
  • WHERE : 조회 대상 행을 조회한다.
  • GROUP BY : 대상 행을 그룹화한다.
  • HAVING : 그룹화한 값에서 조건에 맞는 것을 출력한다.
  • SELECT : SELECT 절에 기재된 칼럼이나 식을 계산한다.
  • ORDER BY : 출력되는 결과를 정렬한다.

실습

집계함수를 테스트 하기 위해 스키마에 부서, 직원의 엔터티를 생성하고 직원 엔터티에 고용된 날짜를 8월 1일부터 10일까지 랜덤으로 배정한 후, GROUP BY 에 부서 번호를 적용하여 부서 번호 별로 소그룹화 하였다.

SELECT A.DEPTNO AS "부서번호"
       , (SELECT L.DNAME FROM DEPT L WHERE L.DEPTNO = A.DEPTNO) AS "부서이름"
       , MAX(A.HIREDATE) AS "가장 늦게 고용된 날짜"
       , MIN(A.HIREDATE) AS "가장 빨리 고용된 날짜"
       , COUNT(*) AS "직원수"
FROM EMP A
GROUP BY A.DEPTNO
ORDER BY A.DEPTNO;

HAVING 절을 사용하여 직원수가 2명을 넘는 부서만 조회해보자.

SELECT A.DEPTNO AS "부서번호"
       , (SELECT L.DNAME FROM DEPT L WHERE L.DEPTNO = A.DEPTNO) AS "부서이름"
       , MAX(A.HIREDATE) AS "가장 늦게 고용된 날짜"
       , MIN(A.HIREDATE) AS "가장 빨리 고용된 날짜"
       , COUNT(*) AS "직원수"
FROM EMP A
GROUP BY A.DEPTNO
HAVING COUNT(*) > 2
ORDER BY A.DEPTNO;

각 부서 당 급여 최고액과 최저액, 평균, 합계를 조회해보자.

SELECT A.DEPTNO AS "부서번호"
       , (SELECT L.DNAME FROM DEPT L WHERE L.DEPTNO = A.DEPTNO) AS "부서이름"
       , MAX(A.SAL) AS "최고 급여"
       , MIN(A.SAL) AS "최저 급여"
       , SUM(A.SAL) AS "급여 합계"
       , ROUND(AVG(A.SAL)) AS "급여 평균"
FROM EMP A
GROUP BY A.DEPTNO
ORDER BY A.DEPTNO;

'SQL' 카테고리의 다른 글

계층형 쿼리  (0) 2021.08.16
JOIN  (0) 2021.08.08
함수(Function)  (0) 2021.07.11
SQL 명령어 :: WHERE  (0) 2021.07.11
DML, DDL, TCL  (0) 2021.06.06