IT_SQL

[분석 기초] SQL 쿼리 조건절, 그룹화로 특정 데이터 추출하기 (조건절 having vs where 차이!)

soyounism 2021. 10. 20. 21:34

지난 포스팅에서 SQL 집계함수 [group by] 까지 진행되었습니다

전체 데이터의 합계(sum), 최소값(min), 최대값(max), 평균값(avg) 등의

집계 정보를 추출할 수 있는 아주 유용한 쿼리입니다.

실무를 하다보면 정말 없어서는 안 될 유용한 쿼리라고 볼 수 있어요.

 

오늘 포스팅 할 쿼리들은 실무에서 정말 유용하게 쓰이는 조건절(+집계함수)입니다

전체 데이터를 조건화, 그룹화하여 원하는 데이터를 추출할 수 있습니다

실무 데이터 분석을 하신다면 꼼꼼히 봐주세요

 

 

having vs where

(having, where 이론부분은 스크롤을 아래로 쭉 내려주세요)

 

 

 

지난 포스팅에 이어서 진행하겠습니다

(지난 포스팅) https://s-s-o-story.tistory.com/19

 

[분석 기초] SQL 쿼리로 특정 데이터 탐색, 총합, 평균, 최소/최대값 구하기 (집계함수 group by!)

지난 포스팅에서 SQL 쿼리로 데이터 탐색하기까지 진행되었습니다 전체 데이터에서 내가 필요한 부분들만 쏙쏙 골라볼 수 있는 쿼리들이고 어찌보면 가장 기초이자, 가장 많이 쓰는 SQL 쿼리들

s-s-o-story.tistory.com

지난 시간 group by를 사용하면서 데이터의 총합, 평균, 최대/최소 등을 추출했습니다

 

이번 포스팅은 조금 더 심화된 쿼리를 진행할게요

 

8. 집계함수 group by - 이어서~

* 혹~시 잊어버릴 수 있으니, 복습해볼겸 간단하게업종별, 가맹점별 전체 매출액을 먼저 구해보겠습니다

select category, fanchise, sum(sales) sales_sum
from sql_ssostory_1 
group by 1,2

업종별(category 컬럼), 가맹점여부별(fanchise 컬럼) 매출액(sales 컬럼)의 총합이 추출되었습니다

집계함수 sum 을 썼으니, 꼭 group by를 붙여야겠죠!

그리고 selct에서 선택한 컬럼수와 group by 컬럼수는 꼭 동일해야합니다!! 

<-요기까지 배워보았습니다

 

 

본격적으로 오늘 할 심화학습을 진행해보겠습니다

 

8-3. 업종별, 가맹점별 전체 매출액은? + 이 중 치킨전문점만 보고싶다면? 

위의 업종별, 가맹점별 전체매출액 select - from - group by 구조에서

치킨전문점을 보기위해 where 절을 추가합니다

select category, fanchise, sum(sales) as sales_sum
from sql_ssostory_1 
where category ='치킨전문점'
group by 1,2

* 여기서 중요한점은 where, group by를 함께 쓰게될 때는 꼭 순서를 지켜주세요

select

from

where

group by

 

9. 조건절 having - having절

9-1. 업종별/가맹여부별 매출액이 큰 카테고리들만 보고싶다면?

먼저 category, fanchise 칼럼을 선택/그룹핑하고, sales(매출액) 합계(sum 함수)를 추가합니다

<-여기까지하면 카테고리, 가맹점별 매출액의 합계가 도출되겠죠

여기에 having절을 추가하면 매출액 800000이상인 칼럼들만 추출이됩니다

=>결론적으로, 업종별, 가맹여부별, 매출액의 총합이 도출되는데, 이 중 매출액총합이 8000000이상인것들만 도출!

select category,fanchise, sum(sales) as sales_sum
from sql_ssostory_1 ss 
group by 1,2
having sum(sales) >= 8000000

 

9-2. 여기에서 fanchise='가맹점'인 것들만 보고싶다면?

group by, having에

where 절을 추가해줍니다

select category, fanchise, sum(sales) as sales_sum
from sql_ssostory_1 ss 
where fanchise = '가맹점'
group by 1,2
having sum(sales) >= 8000000

업종별 매출액>800000 중에서 가맹점인 것들만 추출이 되는데요,

 

 

위 두개의 조건절들이 비슷해보이죠? 둘다 조건으로 필터링하는것 같은데 어떻게 이해하면될까요?

 

* where와 having의 차이는?

where절  : '집계 전' 데이터를 필터링 -> 집계함수 올 수 x

having절 : '집계 후' 데이터를 필터링 -> 집계함수 만!! 올 수 있다

 

간단하게 차이를 보여드리자면,

where절은 데이터를 만지지 않고 그대로 추출만해서 보여주는 식입니다

아래 결과를 보면, 전체 데이터 중에서 매출액 30000000이상인 것만 추출해서 보여주죠

 

반면, having은(group by가 꼭 선행되어야하죠!)

먼저 그룹화하고, 집계함수(여기서는 sum을 사용)로 집계를 먼저 냅니다

아래 결과는 category 칼럼별로 집계 sum을 먼저 낸 후에having으로 그 sum이 30000000 이상인 것을 추출했죠결론적으로 having은 group by로 그룹화하고, 집계를 내어서, 그것에서만! 결과를 보여줍니다

결과적으로 원본에는 없는 데이터를 만들어서 조건을 부여한거죠.

sum(sales)는 원본 엑셀파일에서는 없었던 데이터였으니까요

where절과, having절 둘다 매출액 30000000개 이상인 것을 추출했지만,

having절에는 2개의 결과가 나온것은,

group by를 통해 category의 fanchise 칼럼을 그룹핑했기 때문이예요.

가맹/비가맹을 그룹화하여 매출액(sales)을 sum하였으니, 당연히 sales칼럼의 값을 셀단위로 추출한것 보다는 sum(sales)의 값이 더 크겠죠! 

 

 

 

*참고로 as 별칭은 별칭일 뿐(작업셀의 이름이고, 엑셀 다운시 반영될 뿐) 그대로 명령어를 넣으면 안되요!

select category cate
from sql_ssostory_1 ss 
where cate = '치킨전문점'

실행안되시죠? category 셀의 별칭을 cate로 지정해두었지만, cate로 입력하면 실행되지 않습니다. 그대로 넣어주세요~

 


이제 SQL 실무에서 사용하기는 거의 절반이 넘은 것 같습니다.

사실 실무에서 어마어마하게 화려한 sql구문을 사용하진 않죠.

실무는 코딩 경진대회가 아니니까요

사내데이터에서 얼마나 유용할 결과를 뽑아낼 수 있는지,

인사이트가 더 중요하다는 것을

보고계시는 실무자분들이 계시다면 다들 이해하실 것 같습니다

 

SQL쿼리는 굉장히 직관적이라, 몇번 따라해보면 크게 어렵게 생각하실 필요가 없어요.

간단히 몇개만 알아두면 그 다음부터는 배우지 않은 코드도 대략 해석이 가능합니다

실무에서 데이터분석하기! 빠르게 진행해볼게요~

 

데이터 분석 실무 초고속 정복하기!

더 좋은 꿀팁들을 알고 계시면 공유해주세요!^^