SQL 시작하기: GROUP BY 문과 HAVING 문
GROUP BY 문과 HAVING 문의 기본 형식
SELECT [열] FROM [테이블] WHERE [열] = [조건값] GROUP BY [열] HAVING [열] = [조건값]
① ② ③ ④
① GROUP BY : 데이터를 그룹화하는 구문이다.
② [열] : 그룹화 기준의 열 이름을 지정. 1개 이상 그룹화 가능하다.
③ HAVING : WHERE와 비슷한 기능을 하며 그룹화된 결과의 필터링 기능을 한다.
④ [조건값] : HAVING 필터에 적용할 조건값을 입력한다
기본
select sector from nasdaq_company GROUP BY sector
→ 데이터를 그룹화할 때는 반드시 그룹화할 기준 열을 지정해야 한다. 그룹화는 중복 결과를 제외하고 보여준다.
2개 이상 열 기준으로 그룹화하기
select sector, industry from nasdaq_company GROUP BY sector, industry
→ sector 열을 기준으로 우선 그룹화한 다음, industry 열을 그룹화하여 출력한다.
집계 함수 COUNT로 그룹화한 열의 데이터 개수 확인하기
select sector, COUNT(*) AS cnt from nasdaq_company GROUP BY sector
→ sector 열을 기준으로 그룹화한 다음, COUNT 함수로 그룹화된 각 행이 몇 개인지 검색한다. 이때 COUNT 함수에 AS cnt 를 붙였는데 이는 개수를 센 결과를 출력할 때 열 이름을 cnt로 한다는 뜻이다.
select sector, industry, COUNT(*) AS cnt from nasdaq_company GROUP BY sector, industry ORDER BY sector, industry
해석: sector, industry 열을 기준으로 그룹화한 다음 각 그룹에 해당하는 데이터 몇 개인지 센다. 마지막에 ORDER BY문을 입력한 이유는 검색한 데이터 결과를 정렬해 행 개수를 쉽게 확인하기 위해서이다.
※ GROUP BY 문에 사용된 열은 반드시 SELET 문에 그대로 사용된다.
HAVING 문으로 그룹화된 데이터 필터링하기
WHERE문과 차이: WHERE문은 테이블에 있는 열에 적용하는 것이라면, HAVING 문은 SELECT 문이나 GROUP BY 문에 사용한 열에만 적용한다는 것이다.
select sector, industry from nasdaq_company GROUP BY sector, industry HAVING industry = 'Advertising'
해석: sector, industry 열을 기준으로 그룹화한 다음 그 중에서 industry 가 Advertising인 것만 검색하겠다.
select industry, count(*) as cnt from nasdaq_company where industry like '%B%' group by industry having count(*) >= 100
해석: B글자를 포함한 industry 열을 기준으로 그룹화한 다음 행의 개수를 세고 그 중에서 개수 count 가 100이상인 것만 검색하겠다.
※ HAVING 문에 사용된 열은 반드시 SELET 문, GROUP 문에 있는 열이어야 한다.
select sector, industry, count(*) as cnt from nasdaq_company GROUP BY sector, industry
HAVING industry = 'Advertising' and COUNT(*) > 10 ※ 주의: COUNT(*) > 10을 cnt(별칭) > 10 로는 사용안 됨
select industry, count(*) as cnt from nasdaq_company group by industry having count(*) >= 100 order by count(*) desc
DISTINCT 문으로 중복 데이터 제거하기
GROUP BY 문은 중복 데이터를 제거한다고 했다. GROUP BY 문을 사용하지 않고 중복 데이터를 제거하려면 DISTINCT 문을 사용한다.
SELECT DISTINCT [열] FROM [테이블]
지정한 열의 중복 데이터를 제거한다.
select distinct sector, industry from nasdaq_company
→ DISTINCT 문은 중복을 제거할 뿐이지 집계하거나 계산을 할 수 없다.
퀴즈 8. nasdaq_company 테이블에서 ipo_year 그룹별로 등록된 symbol 개수를 출력하세요.
select ipo_year, Count(*) as cnt from nasdaq_company Group by ipo_year order by ipo_year
퀴즈9. nasdaq_company 테이블에서 ipo_year 그룹별로 등록된 symbol 개수가 20개 이상인 sector 목록을 내림차순으로 출력하세요.
select ipo_year, sector, Count(*) as cnt from nasdaq_company Group by ipo_year, sector having count(*)>=20 order by cnt desc