728x90
03 - 5 데이터 그룹화 다루기
데이터를 그룹화할 때는 GROUP BY 문을 사용합니다. 또한 그룹을 필터링할 때는 HAVING 문을 사용합니다.
-- GROUP BY 문과 HAVING 문의 기본 형식
SELECT [열] FROM [테이블] WHERE [열] = [조건값] GROUP BY [열] HAVING [열] = [조건값]
- GROUP BY : 데이터를 그룹화하는 구문이다.
- [열] : 그룹화 기준의 열 이름을 지정한다. 1개 이상 그룹화할 수 있다.
- HAVING : WHERE와 비슷한 기능을 하며 그룹화된 결과의 필터링 기능을 한다.
- [조건값] : HAVING 필터에 적용할 조건값을 입력한다.
GROUP BY 문으로 데이터 그룹화하기
GROUP BY 문은 지정한 열에 있는 데이터를 그룹화합니다. 또한 GROUP BY는 집계 함수와 함께 자주 사용합니다.
1개 열 기준으로 그룹화하기
데이터를 그룹화할 때는 반드시 그룹화할 기준 열을 지정해야 합니다. 그룹화는 중복된 결과를 제외해 보여 주므로 참고해야 합니다.
-- sector로 그룹화
SELECT sector FROM nasdaq_company
GROUP BY sector
-- industry로 그룹화
SELECT industry FROM nasdaq_company
GROUP BY industry
2개 이상의 열 기준으로 그룹화하기
열을 2개 이상 지정해 그룹화하는 경우에는 GROUP BY에 나열한 열 순서대로 데이터를 그룹화할 뿐이고 전체 결과는 달라지지 않습니다.
-- sector, industry 열 순서로 그룹화
SELECT sector, industry FROM nasdaq_company
GROUP BY sector, industry
-- industry, sector 열 순서로 그룹화
SELECT sector, industry FROM nasdaq_company
GROUP BY industry, sector
집계 함수 COUNT로 그룹화한 열의 데이터 개수 확인하기
-- sector 열 기준으로 그룹화한 각 행의 개수 검색
SELECT sector, COUNT(*) AS cnt FROM nasdaq_company
GROUP BY sector
-- sector, industry 열 기준으로 그룹화한 각 행의 개수 검색
SELECT sector, industry, COUNT(*) AS cnt FROM nasdaq_company
GROUP BY sector, industry
ORDER BY sector, industry
HAVING 문으로 그룹화한 데이터 필터링하기
그룹화한 데이터에서 데이터를 필터링하려면 HAVING 문을 사용해야 합니다. HAVING 문은 WHERE 문과 비슷하지만, WHERE 문은 테이블에 있는 열에 적용하는 것이라면 HAVING 문은 SELECT 문이나 GROUP BY 문에 사용한 열에만 적용할 수 있습니다.
-- 그룹화한 데이터에서 특정 값을 갖는 그룹만 필터링
SELECT sector, industry FROM nasdaq_company
GROUP BY sector, industry
HAVING industry = 'Advertising'
-- 그룹화한 데이터의 개수가 1000보다 큰 그룹만 필터링
SELECT sector, COUNT(*) AS cnt FROM nasdaq_company
GROUP BY sector
HAVING COUNT(*) > 1000
-- 그룹화에 사용한 열 기준으로 데이터 필터링
SELECT sector, industry, COUNT(*) AS cnt FROM nasdaq_company
GROUP BY sector, industry
HAVING industry = 'Advertising'
AND COUNT(*) > 10
DISTINCT 문으로 중복 데이터 제거하기
GROUP BY 문을 사용하지 않고도 중복 데이터를 제거하고 싶다면 DISTINCT 문을 사용합니다.
-- DISTINCT 문의 기본 형식
SELECT DISTINCT [열 이름] FROM [테이블 이름]
DISTINCT 문은 지정한 열의 중복 데이터를 제거합니다.
-- DISTINCT 문으로 특정 열의 중복 데이터 제거
SELECT DISTINCT sector, industry
FROM nasdaq_company
-- GROUP BY 문으로 특정 열의 중복 데이터 제거
SELECT sector, industry
FROM nasdaq_company
GROUP BY sector, industry
실전 SQL
퀴즈 8. nasdaq_company 테이블에서 ipo_year 그룹별로 등록된 symbol 개수를 출력하세요.
더보기
SELECT ipo_year, COUNT(*) FROM nasdaq_company
GROUP BY ipo_year
ORDER BY ipo_year ASC;
퀴즈 9. nasdaq_company 테이블에서 IPO 연도별로 등록된 symbol 개수가 20개 이상인 sector 목록을 내림차순(symbol 개수가 많은 순서)으로 출력하세요.
더보기
SELECT ipo_year, sector, COUNT(*) FROM nasdaq_company
GROUP BY ipo_year, sector
HAVING COUNT(*) >= 20
ORDER BY COUNT(*) DESC
728x90