집계함수
여러 행들의 그룹이 모여서 그룹 당 하나의 결과를 돌려주는 함수이다. 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 |