데이터 분석/SQL

SQL) 집계함수, GROUP BY와 HAVING절

engwoon 2024. 11. 28. 20:35

집계 함수

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란?
    • 특정 열을 기준으로 데이터를 그룹화한 후, 집계함수를 적용한다.

[예시] : 장르별 책의 합계 구하기

SELECT genre,
               SUM(qty) --2. 집계함수 SUM 적용

FROM books

GROUP BY genre -- 1. 장르별로 그룹화

 

* 이때 잊지 말 것! SQL 실행순서

FROM → ON → JOINWHERE → 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명만 추출