데이터를 검색할 때 공통 그룹의 정보를 확인해야 할 때가 있다. 그리고 그룹의 특정 조건을 필터링해 해당 그룹의 데이터만 검색해야 하는 경우도 많다. 이렇게 데이터를 그룹화할 때는 GROUP BY 문을 사용한다. 또한 그룹을 필터링할 때는 HAVING 문을 사용한다.
GROUP BY 문과 HAVING 문의 기본 형식
SELECT [열] FROM [테이블] WHERE [열] = [조건값] GROUP BY [열] HAVING [열] = [조건값]
-- 1개의 열 기준으로 그룹화하기
SELECT A FROM usertbl GROUP BY A
-- 2개의 열 기준으로 그룹화하기
SELECT A, B FROM usertbl GROUP BY A, B
-- GROUP BY 다음에 오는 열 순서대로 그룹화한 결과 출력
집계 함수 COUNT로 그룹화한 열의 데이터 개수 확인하기
GROUP BY 문에 사용한 열 이름이 SELECT 문에 그대로 사용되었음을 파악했을 것이다. 앞서 언급했듯 데이터를 그룹화할 때는 그룹 기준이 되는 열이 필요하므로 GROUP BY 문에 사용한 열을 반드시 SELECT 문에도 사용해야 한다. 만약 그러지 않는다면 오류가 발생할 것이다.
-- sector 열 기준으로 그룹화한 각 행의 개수 검색
-- cnt = 갯수를 센 결과를 출력할 때 열 이름
SELECT sector, COUNT(*) AS cnt FROM usertbl
GROUP BY sector
HAVING 문으로 그룹화한 데이터 필터링하기
그룹화한 데이터를 필터링하려면 HAVING 문을 사용해야 한다. HAVING 문은 WHERE 문과 비슷하지만, WHERE 문은 테이블에 있는 열에 적용하는 것이라면 HAVING 문은 SELECT 문이나 GROUP BY 문에 사용한 열에만 적용할 수 있다.
-- 그룹화한 데이터에서 특정 값을 갖는 그룹만 필터링
SELECT sector, industry FROM usertbl
GROUP BY sector, industry
HAVING industry = 'Advertising'
실행 결과
| sector | industry |
| Consumer Services | Advertising |
| Technology | Advertising |
| Transportation | Advertising |
COUNT 함수 적용
SELECT sector, COUNT(*) AS cnt FROM usertbl
GROUP BY sector
HAVING COUNT(*) > 1000
실행 결과
| sector | cnt |
| 2233 | |
| Finance | 1914 |
| Heath Care | 1180 |
DISTINCT 문으로 중복 데이터 제거하기
SELECT DISTINCT [열] FROM [테이블]
-- DISTINCT 문으로 특정 열의 중복 데이터 제거
SELECT DISTINCT sector, industry
FROM usertbl
-- GROUP BY 문으로 특정 열의 중복 데이터 제거
SELECT sector, industry
FROM usertbl
GROUP BY sector, industry
GROUP BY 문과 결과가 같다고해서 둘이 같다고 생각하면 안 된다. DISTINCT 문은 중복을 제거할 뿐이지 집계하거나 계산을 할 수는 없다.
집계함수
| AVG() | 평균을 구함 |
| MIN() | 최솟값을 구함 |
| MAX() | 최대값을 구함 |
| COUNT() | 행의 개수를 셈 |
| COUNT(DISTINCT) | 행의 개수를 셈(중복 제거) |
| STDEV() | 표준 편차를 구함 |
| VAR_SAMP() | 분산을 구함 |
ROLLUP으로 총합 또는 중간 합계 구하기
-- 총합 또는 중간 합계가 필요하다면 group by 절과 함께 with rollup 문을 사용하면 된다.
-- group by 뒤에 오는 열들의 합계를 구해준다.
SELECT num, groupName, SUM(price*amount) AS '비용'
FROM buytbl GROUP BY groupName, num with ROLLUP;
'Database > MySQL' 카테고리의 다른 글
| [MySQL] 데이터 형식 (0) | 2024.09.10 |
|---|---|
| [MySQL] 테이블 생성과 데이터 조작 (0) | 2024.09.10 |
| [MySQL] 와일드카드 (3) | 2024.09.09 |
| [MySQL] ORDER BY 문 (0) | 2024.09.09 |
| [MySQL] WHERE 문 (0) | 2024.09.09 |