SQL) 집계함수, GROUP BY와 HAVING절
집계 함수
count(*)는 null도 포함해서 갯수를 카운팅한다.
count(컬럼명)은 컬럼 내 null은 무시하고 카운팅한다.
- 날짜 데이터를 활용한 MIN/MAX
SELECT MIN(hire_date) AS earliest_hire, --오래된 날짜일수록 min, 최근일수록 max
MAX(hire_date) AS latest_hire
FROM employees;
GROUP BY, HAVING
- GROUP BY란?
- 특정 열을 기준으로 데이터를 그룹화한 후, 집계함수를 적용한다.

[예시] : 장르별 책의 합계 구하기
FROM books
GROUP BY genre -- 1. 장르별로 그룹화
* 이때 잊지 말 것! SQL 실행순서
FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT
** GROUP BY 주의사항
SELECT 절에는 GROUP BY에 포함된 기준 열과 집계 함수만 사용 가능!
집계 함수 외 다른 칼럼들은 모두 GROUP BY에 포함되어야 함.
- HAVING 이란?
- GROUP BY로 그룹화된 데이터에 조건을 추가로 적용할 때 사용된다.
[GROUP BY + HAVING 예시] : 부서별 총 급여가 10,000 이상인 부서만 선택하기
SELECT department_id, SUM(salary) AS total_salary
FROM employees
GROUP BY department_id
HAVING SUM(salary) >= 10000 -- 총 급여가 10,000 이상인 부서만 선택!
- WHERE 와 HAVING 차이점
- WHERE: 그룹화 이전에 데이터를 필터링
- HAVING: 그룹화 이후에 데이터를 필터링. "그룹화된 결과를 기준으로 조건을 적용"
결과 정렬: ORDER BY
- ORDER BY란?
- 데이터를 원하는 순서대로 정렬한다.
- 오름차순(ASC, 생략가능)
- 내림차순(DESC)
- RAND 함수
- ORDER BY와 함께 사용하면 각 행마다 랜덤한 값을 생성하고, 이를 기준으로 정렬한다.
[ORDER BY + RAND 예시] : 나이가 30 이상인 직원 중 랜덤하게 3명만 추출
SELECT *
FROM employees
WHERE age >= 30
ORDER BY RAND() -- 1. 랜덤한 값 생성
LIMIT 3 -- 2. 3명만 추출