Group by
데이터를 그룹핑해서 그 결과를 가져오는 경우 사용. 집계함수와 짝을 이루어 사용할 수 있다.
ex1. 부서별 급여 합계 구하기 ↴
SELECT DEPARTMENT_ID, SUM(SALARY)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID
;
GROUP BY DEPARTMENT_IDex2. 부서별, 담당업무별 사원수와 평균 급여 구하여 오름차순으로 출력하기 ↴
SELECT DEPARTMENT_ID, JOB_ID, COUNT(EMPLOYEE_ID), AVG(SALARY)
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 80
GROUP BY DEPARTMENT_ID, JOB_ID
ORDER BY DEPARTMENT_ID, JOB_ID
;
GROUP BY DEPARTMENT_ID, JOB_ID
: 필요한 만큼 콤마(,)를 이용해 그룹화할 수 있다.
WHERE DEPARTMENT_ID = 80
: 조건절 WHERE도 사용할 수 있으며 그룹화 전에 조건을 필터링화 하는 작업이 먼저이기 때문에WHERE절의 위치는 FROM절 바로 다음이어야한다.
쿼리 실행 순서
에 대해서 잠깐 알아보고 넘어가자.
쿼리문을 작성할 때는
SELECT 컬럼명
FROM 테이블명
WHERE 조건
GROUP BY 컬럼명
HAVING 조건
ORDER BY 컬럼명
;
이러한 구조로 작성한다.
하지만 쿼리문을 실제로 처리할 때에는
1. FROM
2. WHERE
3. GROUP BY
4. HAVING
5. SELECT
6. ORDER BY
이러한 순으로 실행된다.
각 순서에 따라 일어나는 동작 ↴
FORM : 해당 테이블 참조한다.
WHERE : 테이블의 데이터를 필터링하여 조건에 맞는 행만 남긴다.
GROUP BY : 필터링 된 데이터들을 그룹화 한다.
HAVING : 그룹화 된 데이터를 추가적으로 필터링 작업한다.
SELECT : 필요한 컬럼이나 집계함수 등을 계산하고 최종적으로 남길 데이터를 결정한다.
ORDER BY : 최종적으로 남은 데이터들을 정렬한다.
Having
where절에서는 집계함수를 사용할 수 없기 때문에 having절에 집계함수를 가지고 조건비교를 한다.
ex1. 사원수가 10명 이상인 부서 출력하기 ↴
SELECT DEPARTMENT_ID, COUNT(EMPLOYEE_ID)
FROM EMPLOYEE
WHERE DEPARTMENT_ID IS NOT NULL
GROUP BY DEPARTMENT_ID
HAVING COUNT(EMPLOYEE_ID) >= 10
ORDER BY DEPARTMENT_ID
;
WHERE DEPARTMENT_ID IS NOT NULL
: 어떤 그룹에도 속하지 않는 NULL값을 가진 데이터들을 제외시켜 그룹화하고 집계도록 한다.
집계함수는 NULL값을 계산할 수 있고 필요에 따라 NULL값을 포함해야할 때가 있겠지만 해당 쿼리문의 HAVING절에서 10보다 크다는 조건을 계산하기 때문에 NULL값은 의미가 없다.
GROUP BY DEPARTMENT_ID
: DEPARTMENT_ID를 그룹화하여 각 부서마다 몇 명의 사원이 있는지 계산할 수 있도록 한다.
HAVING COUNT(EMPLOYEE_ID) >= 10
: WHERE절은 집계함수를 사용할 수 없기때문에 HAVING절에 COUNT 집계함수 조건을 작성하였다.
ex2. 매니저의 사번 및 그 매니저가 관리하는 직원들 중 최소 연봉을 받는 사원의 연봉을 조회한다. 매니저가 없는 사람들은 제외하고 최소 연봉 기준 내림차순으로 출력한다.
SELECT MANAGER_ID, MIN(SALARY)
FROM EMPLOYEES
WHERE MANAGER_ID IS NOT NULL
GROUP BY MANAGER_ID
ORDER BY MIN(SALARY)
;
SELECT MANAGER_ID, MIN(SALARY)