GROUP BY
10개의 데이터가 들어가있는 위와 같은 테이블이 있을 때, 각 부서별 총 사람은 몇 명인지 알아보고 싶다면 어떻게 해야할까?
SELECT COUNT(부서) FROM EMPLOYEE; -- 결과: 10
SELECT COUNT(DISTINCT 부서) FROM EMPLOYEE; -- 결과: 4
COUNT 함수는 단순히 데이터의 개수를 세는 함수로, 전체 데이터의 개수나 중복된 값을 제거한 개수를 가져올 수 있다. 하지만, 연령대별 회원 가입 현황, 동물보호센터의 동물별 수, 월별 매출, 년도별 고객 수와 같은 유형별 집계값을 알고 싶을 때는, COUNT 함수만으로 충분하지 않다. 이러한 경우 데이터를 연령대별, 동물별, 월별, 년도별로 그룹화해서 집계해야 하는데, 이를 위해 GROUP BY를 사용한다.
※ GROUP BY는 데이터를 특정 컬럼[기준]으로 그룹화하여 각 그룹별로 집계할 수 있게 해준다.
✅주의할 점
• GROUP BY에 명시되지 않은 컬럼은 SELECT절에서 직접 사용할 수가 없다.
• GROUO BY에 명시되지 않은 컬럼은 집계 함수를 통해서만 SELECT 절에서 사용이 가능하다.
• 그룹화되지 않은 컬럼은 이런식으로 특정 함수를 통해서 SELECT 절에서의 사용이 가능하기는 하나,
• 일반적인 함수의 사용은 불가능하다.
Q 왜 불가능한가?
➯ GROUP BY는 데이터를 특정 컬럼 값에 따라 그룹화한 후, 각 그룹마다 하나의 결과를 반환하기 때문이다. 이는 그룹화되지 않은 컬럼을 사용하지 못하는 이유와도 같은데, MySQL입장에서는 그룹화된 여러 행중에서 어떤 값을 반환해야 할지 결정할 수 없기 때문이다.
( GROUP_CONCAT의 경우, 각 그룹 내의 여러 행을 하나의 문자열로 결합하는 함수라 사용이 가능한 것이다.)
기본 문법 / 사용법
SELECT 컬럼1, 집계함수(컬럼2)
FROM 테이블명
WHERE 데이터 필터링 조건
GROUP BY 컬럼1
사용 예시
ㆍ데이터를 여러 컬럼을 기준으로 그룹화하면 좀 더 세부적인 정보를 확인할 수 있다.
HAVING
- HAVING절은 GROUP BY를 통해 그룹화된 결과에 조건을 적용할 때 사용된다.
- 주로 집계 함수의 결과에 대한 필터링을 수행한다.
기본 문법 / 사용법
SELECT 컬럼1, 집계함수(컬럼2)
FROM 테이블명
WHERE 데이터 필터링 조건
GROUP BY 컬럼1
HAVING 그룹화된 결과에 대한 조건
✅주의할 점
• WHERE절에는 집계함수를 조건으로 사용할 수가 없다.
• 동물 종류별 총 동물의 수가 2마리를 초과한다라는 집계 조건은 HAVING절에 써야한다.
• 집계 함수에 대한 필터링이 아닌 일반 조건을 HAVING절에 써도 괜찮기는 하다.
• 허나, 일반 조건은 HAVING이 아닌 WHERE절에 쓰는 것이 좋다.
Q. why?
• MySQL의 쿼리 처리 순서 때문이다.
① 데이터베이스는 우선 FROM 절로 가서 어떤 테이블을 가져와야 하는지를 파악하고,
② WHERE 절로 가서 조건에 맞는 데이터만 필터링한다.
③ 필터링 후에 GROUP BY 절로 가서 필터링한 데이터를 그룹화하고,
④ Having 절을 보고 그 그룹화된 결과에 대해 다시 필터링을 진행한다.
⑤ 그러고 나서야 SELECT 절로 필요한 컬럼만 추리게 되며,
⑥ 마지막으로 ORDER BY 절을 보고 데이터를 정렬하는 것이다.
만일 일반 조건을 WHERE 절이 아닌 HAVING 절에 적는다면, 기껏 동물(강아지, 고양이, 토끼)별로 그룹화를 해둔 상태인데 강아지 데이터만 필요하다고 하는 것으로, 이건 마치 시킨 요리가 완성되었는데 못 먹는다고 필요 없다고 하는 것과 같다.
그룹화하는 행위 자체도 가벼운 작업이 아니니, 성능적인 측면을 위해서라도 일반적인 조건들은 WHERE 절에 쓰도록 하자.
📒[정리]
GROUP BY의 기능
1). 데이터 그룹화: 지정된 컬럼을 기준으로 같은 값을 가진 데이터끼리 그룹으로 묶인다.
2). 집계 함수와의 사용: 각 그룹에 대해 COUNT(), SUM(), AVG(), MIN(), MAX() 등의 집계 함수를 사용하여 결과 도출
3). HAVING 절과 함께 사용: 만들어진 그룹에 조건 걸기
4). HAVING VS WHERE
WHERE 절 | HAVING 젛 | |
적용 시점 | 그룹화 이전 | 그룹화 이후 |
필터링 대상 | 개별 행(레코드) | 그룹화된 데이터 |
집계 함수 | 사용 ❌ | 사용 ⭕ |
용도 | 데이터를 미리 필터링하여 불필요한 데이터 제외 |
그룹화된 결과 중에서 특정 조건에 맞는 그룹만 선택 |
'데이터 분석 > MySQL' 카테고리의 다른 글
MySQL 총 정리9: UNION과 UNION ALL (1) | 2024.10.09 |
---|---|
MySQL 총 정리8: 테이블 조인(JOIN) (1) | 2024.10.07 |
MySQL 총 정리6: mysql 내장함수 모음 (4) | 2024.10.03 |
MySQL 총 정리5: ORDER BY로 데이터 정렬 (1) | 2024.10.02 |
MySQL 총 정리4: 다양한 연산자로 필터링된 데이터 조회 (0) | 2024.09.30 |