03-5 데이터 그룹화 다루기
데이터를 그룹화 할때는 GROUP BY 문을 사용한다. 또한 그룹을 필터링 할때는 HAVING 문을 사용한다.
- GROUP BY 문과 HAVING 문의 기본형식
SELECT [열] FROM [테이블] WHERE [열] = [조건값] GROUP BY [열] HAVING [열] = [조건값]
1 2 3 4
- GROUP BY : 데이터를 그룹화 하는 구문이다.
- [열] : 그룹화 기준의 열 이름을 지정한다. 1개 이상 그룹화 할 수 있다.
- [HAVING] : WHERE 와 비슷한 기능을 하며 그룹화 된 결과의 필터링 기능을 한다.
- [조건값] : HAVING 필터에 적용할 조건값을 입력한다.
- 1개 열 기준 그룹화
▶ sector 로 그룹화
SELECT sector FROM nasdaq_company GROUP BY sector
▶ industry 로 그룹화
SELECT industry FROM nasdaq_company GROUP BY industry
- 2개이상의 열 기준 그룹화
▶ sector, industry 열 순서로 그룹화
SELECT industry FROM nasdaq_company GROUP BY sector, industry
순서대로 앞의 순서 부터 그룹화 하고 그다음 industry 로 그룹화
순서가 반대이면 --> industry 먼저 하고 sector 그룹화
- 집계함수 COUNT로 그룹화한 열의 데이터 개수 확인하기
▶ 각 그룹에 몇개의 행이 있는지 세어보는 쿼리 작성
sector 열을 기준으로 그룹화한 다음 COUNT 함수로 그룹화 한 각 행이 몇개인지 검색하는 쿼리
SELECT sector, COUNT(*) AS cnt FROM nasdaq_company
GROUP BY sector
▶ sector , industry 열을 기준으로 그룹화 한 다음 각 그룹에 해당하는 데이터가 몇개인지 세고 ORDER BY 로
그룹화 한 열 순서에 따라 오름차순으로 정렬
SELECT sector , industry, COUNT(*) AS cnt FROM nasdaq_company
GROUP BY sector, industry ORDER BY sector, industry
※ 데이터를 그룹화 할 때는 그룹 기준이 되는 열이 필요하므로 GROUP BY 문에 사용한 열을 반드시 SELECT문에도 사용해야 한다. 만약 GROUP BY 문에 사용한 열을 SELECT 문에 사용하지 않으면 오류가 발생 한다.
SELECT industry, COUNT(*) AS cnt FROM nasdaq_company
GROUP BY sector ---> 오류 발생 !
- HAVING 문으로 그룹화한 데이터 필터링 하기
그룹화한 데이터를 필터링 하려면 HAVING 문을 사용해야 한다. WHERE과 비슷하지만 WHERE문은 테이블에 있는 열에 적용하는 것이라면 , HAVING 문은 SELECT 문이나 GROUP BY 문에 사용한 열에만 적용할 수 있다.
▶ 그룹화한 데이터에서 특정 값을 갖는 그룹만 필터링
sector, industry 열을 기준으로 그룹화한 데이터 에서 industry가 'Advertising' 인 데이터만 검색
SELECT sector , industry FROM nasdaq_company
GROUP BY sector, industry
HAVING industry = ' Advertising'
▶ COUNT 함수도 적용 해보자
sector 열을 기준으로 그룹화한 다음 그룹화한 데이터의 개수가 1000보다 큰것만 검색하는 쿼리
SELECT sector, COUNT(*) AS cnt FROM nasdaq_company
GROUP BY sector
HAVING COUNT (*) > 1000
▶ GROUP BY 문과 HAVING 문은 실제 테이블에 있는 열 이름만 사용할 수 있다.
SELECT sector, COUNT(*) AS cnt FROM nasdaq_company
GROUP BY sector
HAVING cnt > 100 ---> 별칭을 사용하여 필터링 하면 오류 발생
- DISTINCT 문으로 중복데이터 제거하기
DISTINCT 문의 기본형식
SELECT DISTINCT [열 이름] FROM [테이블 이름]
DISTINCT 문은 지정한 열의 중복 데이터를 제거
▶ DISTINCT 문으로 nasdaq_company 테이블에서 sector, industry 열의 중복을 제거하는 쿼리
SELECT DISTINCT sector, industry
FROM nasdaq_company
▶ GROUP BY 문으로 특정 열의 중복 데이터 제거
SELECT sector, industry
FROM nasdaq_company
GROUP BY sector, industry
GROUP BY 문과 결과가 같다고 해서 GROUP BY 문과 DISTINCT 문이 같다고 착각해서 안된다.
DISTINCT 문은 중복을 제거할 뿐이지 집계하거나 계산을 할 수는 없다. 만약 집계나 계산이 필요하다면
GROUP BY 문을 사용하자 !