그룹별로 데이터 꺼내오기
1. GROUP BY
SELECT sports
, AVG(height)
FROM olympic
GROUP BY sports
GROUP BY "그룹핑할 기준 컬럼명"
• GROUP BY는 주로 집계 함수와 함께 사용된다.
• GROUP BY 뒤에 작성한 "그룹핑할 기준 컬럼명"을 SELECT 바로 뒤에 써주면 보기 편하다. 만약 안써주었더라도 집계함수가 뒤에 써주었다면 실행되는데, 이때는 집계함수의 결과 값만 추출된다. 반대로 SELECT에 기준 컬럼명만 써주고 집계함수를 안써주면 기준 컬럼명만 출력된다.
• 그룹핑할 기준 컬럼이 두 개 이상이면 콤마로 나열해주면 된다.
• GROUP BY 를 할 때, 해당 컬럼에 NULL 값이 있으면 NULL값을 가진 행들도 하나의 그룹으로 묶어서 집계한다. 즉, NULL 값이 있는 모든 행들이 하나의 그룹으로 묶이게 된다.
• ORDER BY의 위치는 GROUP BY 다음에 온다.
2. GROUP BY + HAVING
SELECT sports
, AVG(height) AS avg_height
FROM olympic
WHERE season = 'summer'
GROUP BY sports
HAVING avg_height >= 170
• GROUP BY를 사용해서 그룹별 집계를 한뒤, 조건을 걸어야할 때는 HAVING을 함께 사용한다. (WHERE 사용 X)
• 사용 가능한 순서: WHERE → GROUP BY + HAVING
자주 쓰는 집계 함수
집계함수 | 설명 |
COUNT( ) | 몇 개인지 세어서 숫자를 반환하기 |
SUM( ) | 합계 반환하기 |
AVG( ) | 평균값 반환하기 |
MIN( ) | 최소값 반환하기 |
MAX( ) | 최대값 반환하기 |
GROUP_CONCAT( ) | 그룹별로 null이 아닌 값들을 연결하여 하나의 문자열로 반환하기 |
COUNT
(1) COUNT(*)
- COUNT(*)는 NULL 값이 있든 없든 조회된 전체 행의 수를 반환한다.
(2) COUNT(expr)
- COUNT(expr)는 SELECT 문으로 조회된 행 중 expr 컬럼의 값의 개수를 반환한다. (단, NULL은 제외하고 센다)
- 일치하는 행이 없으면 COUNT()는 0을 반환한다. COUNT(NULL) 역시 0을 반환한다.
(3) COUNT(DISTINCT expr, [expr...])
- COUNT(DISTINCT)는 NULL이 아닌 고유한 조합의 개수를 반환한다. (NULL은 제외하고 센다)
- 예를 들어 COUNT(DISTINCT col1, col2) ⇒ 이것은 col1과 col2의 고유한 조합의 개수를 구하는 것이고, 두 컬럼 중 하나라도 NULL이면 제외한다.
- 일치하는 행이 없으면 COUNT(DISTINCT)는 0을 반환한다.
[참고] MySQL의 장점 👍
MySQL에서는 COUNT(DISTINCT col1, col2) 와 같이 여러 컬럼을 괄호 안에 함께 나열하여 작성하면, NULL이 포함되지 않은 고유한 값 조합의 개수를 바로 셀 수 있다. 하지만 표준 SQL에서는 이런 방식이 아니기 때문에, CONCAT() 함수를 이용해 컬럼들을 문자열로 이어붙인 후 COUNT(DISTINCT ...) 안에 넣어주어야 한다. MySQL이 다른 SQL 표준보다 더 편하게 여러 컬럼의 고유 조합 개수를 셀 수 있는 것이다.
GROUP_CONCAT
SELECT class_num
, COUNT(DISTINCT stuff) AS cnt
, GROUP_CONCAT(DISTINCT stuff ORDER BY stuff) AS list_stuff
FROM Classroom
GROUP BY class_num
ORDER BY class_num
• 그룹별로 null이 아닌 값들을 연결하여 하나의 문자열로 반환하기.
• 함수 안에 쓸 수 있는 절은 다음과 같다.
- DISTINCT
- ORDER BY
- SEPARATOR (default는 콤마)
[참고자료]
MySQL Documentation (Aggregate Function Descriptions)
https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html
'데이터 처리 도구 > SQL' 카테고리의 다른 글
[MySQL] Numeric Functions and Operators (1) (0) | 2022.08.25 |
---|---|
[MySQL] 날짜/시간 다루기 (1) (0) | 2022.05.06 |
[MySQL] 조건문 (CASE문, IF함수, IFNULL함수) (0) | 2022.05.06 |
[MySQL] 조건에 맞는 데이터 조회하기(WHERE절), 정렬하기(ORDER BY절) (0) | 2022.05.04 |
[MySQL] 데이터 검색하기, LIMIT & OFFSET (0) | 2022.05.04 |