IT Story/SQL Story

SQL 시작하기: GROUP BY 문과 HAVING 문

bravesong 2022. 11. 24. 13:24

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